您当前的位置: 首页 >  mybatis

Charge8

暂无认证

  • 4浏览

    0关注

    447博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Mybatis批量操作

Charge8 发布时间:2018-11-21 22:01:59 ,浏览量:4

 

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

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

Mysql数据库小批量操作

1、批量新增

public void insertUsers(@Param("users") List users);

 1)方法一

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

	
		insert into t_user
			(username,pazzword,state,reg_date) 
		values
		
			(#{user.username},#{user.pazzword},#{user.state},#{user.regDate})
		
	
----
insert into t_user (username,pazzword,state,reg_date) values (?,?,?,?) , (?,?,?,?) , (?,?,?,?)

2)方法二

	
		
		insert into t_user
			(username,pazzword,state,reg_date) 
		values
			(#{user.username},#{user.pazzword},#{user.state},#{user.regDate})
		
	
----
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 from t_user where id in 
		
			#{id}
		
	

 

Oracle数据库小批量操作

1、批量新增

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

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

	public void insertUsers(@Param("users") List users);

使用到序列表:seq_userid.nextval

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

	
		
			insert into t_user
				(id,username,pazzword,state,reg_date) 
			values
				(seq_userid.nextval,#{user.username},#{user.pazzword},#{user.state},#{user.regDate});
		
	 
----
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 into t_user
			(id,username,pazzword,state,reg_date) 
		select seq_userid.nextval,username,pazzword,state,regDate from	
		
			select #{user.username} username,#{user.pazzword} pazzword,#{user.state} state,#{user.regDate} regDate from dual 
		
	 
----
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 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 into t_user
			(username,pazzword,state,reg_date) 
		values
			(#{username},#{pazzword},#{state},#{regDate})
	

测试:

			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

 

关注
打赏
1664721914
查看更多评论
立即登录/注册

微信扫码登录

0.0629s