Mybatis批量操作

 

		SqlSession session = sqlSessionFactory.openSession();//用于普通操作
		SqlSession batchsSession = sqlSessionFactory.openSession(ExecutorType.BATCH);//用于批量操作

一、使用foreach小批量操作

SqlSession session = sqlSessionFactory.openSession();//用于普通操作

Mysql数据库小批量操作

1、批量新增

public void insertUsers(@Param("users") List<User> users);

 1)方法一

批量新增:
    insert into table values (a,b,c),(d,e,f),(g,h,i);

	<insert id="insertUsers1" >
		insert into t_user
			(username,pazzword,state,reg_date) 
		values
		<foreach collection="users" item="user" separator="," >
			(#{user.username},#{user.pazzword},#{user.state},#{user.regDate})
		</foreach>
	</insert>
----
insert into t_user (username,pazzword,state,reg_date) values (?,?,?,?) , (?,?,?,?) , (?,?,?,?)

2)方法二

	<insert id="insertUsers" >
		<foreach collection="users" item="user" separator=";" >
		insert into t_user
			(username,pazzword,state,reg_date) 
		values
			(#{user.username},#{user.pazzword},#{user.state},#{user.regDate})
		</foreach>
	</insert>
----
insert into t_user (username,pazzword,state,reg_date) values (?,?,?,?) ; 
insert into t_user (username,pazzword,state,reg_date) values (?,?,?,?)

注意:mysql数据库要求链接字符串要跟上链接属性allowMultiQueries :MySQL 在线文档

jdbc.url=jdbc:mysql://localhost:3306/mybatis_demo?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&useSSL=true

2、批量删除

	public void Del(@Param("ids") int[] ids);

	<delete id="Del">
		delete from t_user where id in 
		<foreach collection="ids" item="id" separator="," open="(" close=")">
			#{id}
		</foreach>
	</delete>

 

Oracle数据库小批量操作

1、批量新增

批量新增,Oracle数据库和Mysql数据库不一样,它不支持insert...values(),(),()这种写法,

它支持的是以下的begin...end和中间表的两种写法

	public void insertUsers(@Param("users") List<User> users);

使用到序列表:seq_userid.nextval

1)begin...end,中间的insert语句用分号分割

	<insert id="insertUsers" >
		<foreach collection="users" item="user" open="begin" close="end;">
			insert into t_user
				(id,username,pazzword,state,reg_date) 
			values
				(seq_userid.nextval,#{user.username},#{user.pazzword},#{user.state},#{user.regDate});
		</foreach>
	</insert> 
----
begin 
insert into t_user (id,username,pazzword,state,reg_date) values (seq_userid.nextval,?,?,?,?); 
insert into t_user (id,username,pazzword,state,reg_date) values (seq_userid.nextval,?,?,?,?); 
insert into t_user (id,username,pazzword,state,reg_date) values (seq_userid.nextval,?,?,?,?); 
end; 

2)中间表:

	<insert id="insertUsers" >
		insert into t_user
			(id,username,pazzword,state,reg_date) 
		select seq_userid.nextval,username,pazzword,state,regDate from	
		<foreach collection="users" item="user" separator="union" open="(" close=")">
			select #{user.username} username,#{user.pazzword} pazzword,#{user.state} state,#{user.regDate} regDate from dual 
		</foreach>
	</insert> 
----
insert into t_user 
    (id,username,pazzword,state,reg_date) 
select 
    seq_userid.nextval,username,pazzword,state,regDate 
    from 
        ( select ? username,? pazzword,? state,? regDate from dual 
        union 
        select ? username,? pazzword,? state,? regDate from dual 
        union 
        select ? username,? pazzword,? state,? regDate from dual ) 

2、批量删除

批量删除,Oracle数据库和Mysql数据库一样, 亲测有效

 

 

针对mysql使用foreach大批量操作

insert测试:

			SqlSession session = sqlSessionFactory.openSession();//用于普通操作
			UserMapper userMapper = session.getMapper(UserMapper.class);
			
			List<User> userList = new ArrayList<>();
			for(int i = 0; i < 10000; i++) {
				userList.add(new User("user" + i,"pazzword_" + i, 1, new Date()));
			}
			long start = System.currentTimeMillis();
			userMapper.insertUsers1(userList);
			session.commit();
			long end = System.currentTimeMillis();
			System.out.println("foreach批量插入耗时:" + (end - start) +"ms"); 

 

  

 

 

测试发现: 10000条数据报错,新增报错,foreach批量操作 不适合大数据批量操作。mysql对一条 SQL语句的大小有一定的限制(好像是1M)。

 

二、大批量操作

SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);//用于批量操作


测试发现: 10000条数据量进行批量新增,用于普通操作的session 与 用于批量操作session, 效率差不多, 对于大数据量操作,用于批量操作session占据优势。

        public void batchInsert(User user);

  	<insert id="batchInsert" parameterType="cn.jq.mybatis.model.User">
		insert into t_user
			(username,pazzword,state,reg_date) 
		values
			(#{username},#{pazzword},#{state},#{regDate})
	</insert>

测试:

			SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);//用于批量操作
			UserMapper userMapper = session.getMapper(UserMapper.class);
			
			long start1 = System.currentTimeMillis();
			for(int i = 0; i < 100000; i++) {
				userMapper.batchInsert(new User("admin_" + i,"pazzword_" + i, 1, new Date()));
			}
			session.commit();
			long end1 = System.currentTimeMillis();
			System.out.println("批量插入耗时:" + (end1 - start1) +"ms"); 

  

  

 

 

简单记录下Mybatis批量insert大数据量数据的操作性能。

end

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值