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