前言
本文使用 Mybatis 进行批量插入,比较两种不同的插入方式的区别。
测试
批量插入注意事项:
1、连接数据库时添加参数 allowMultiQueries=true,支持多语句执行,批处理
2、数据库是否支持大量数据写入,设置 max_allowed_packet参数保证批次提交的数据量
拼接 sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public void batchDemo() {
long start = System.currentTimeMillis();
List<User> list = new ArrayList<>();
for ( int i = 0 ; i < 5000 ; i++) {
User user = new User();
user.setId(UUID.randomUUID().toString());
user.setName( "feiyangyang" );
user.setPwd( "feiyangyang" );
list.add(user);
}
userService.batchForeach(list);
long end = System.currentTimeMillis();
System.out.println( "---------------" + (start - end) + "---------------" );
}
|
1
2
3
4
5
6
7
8
|
< insert id = "batchForeach" parameterType = "com.fyy.druid.entity.User" >
insert into
user(id,`name`,pwd)
values
< foreach collection = "userList" item = "user" separator = "," >
(#{user.id}, #{user.name}, #{user.pwd})
</ foreach >
</ insert >
|
batch插入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public void batchInsert() {
long start = System.currentTimeMillis();
SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH);
UserService mapper = sqlSession.getMapper(UserService. class );
for ( int i = 0 ; i < 5000 ; i++) {
User user = new User();
user.setId(UUID.randomUUID().toString());
user.setName( "feiyangyang" );
user.setPwd( "feiyangyang" );
mapper.batchInsert(user);
}
sqlSession.commit();
long end = System.currentTimeMillis();
System.out.println( "---------------" + (start - end) + " ---------------" );
}
|
注意:batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的
数据对比
拼接sql (ms) | batch插入 (ms) | |
---|---|---|
500条 | 1744 | 639 |
2000条 | 26966 | 2473 |
5000条 | 173668 | 7382 |
总结
到此这篇关于Mybatis两种不同批量插入方式区别的文章就介绍到这了,更多相关Mybatis批量插入方式内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://juejin.cn/post/7006673535448023048