您当前的位置: 首页 >  mybatis

Mybatis批量操作

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

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

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

Mysql数据库小批量操作

1、批量新增

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

 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") Listusers);

使用到序列表: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 fromselect #{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);
			
			ListuserList = 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

关注
打赏
1688896170
查看更多评论

暂无认证

  • 6浏览

    0关注

    115984博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0389s