Mybatis兩種不同批量插入方式的區(qū)別
更新時間:2021年09月15日 09:10:11 作者:_沸羊羊_
隨著業(yè)務需要,有時我們需要將數據批量添加到數據庫,mybatis提供了將list集合循環(huán)添加到數據庫的方法,這篇文章主要給大家介紹了關于Mybatis兩種不同批量插入方式的區(qū)別,需要的朋友可以參考下
前言
本文使用 Mybatis 進行批量插入,比較兩種不同的插入方式的區(qū)別。
測試
批量插入注意事項:
1、連接數據庫時添加參數 allowMultiQueries=true,支持多語句執(zhí)行,批處理
2、數據庫是否支持大量數據寫入,設置 max_allowed_packet參數保證批次提交的數據量
拼接 sql
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) + "---------------");
}
<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插入
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,這在某型情形下是不符合業(yè)務要求的
數據對比
| 拼接sql (ms) | batch插入 (ms) | |
|---|---|---|
| 500條 | 1744 | 639 |
| 2000條 | 26966 | 2473 |
| 5000條 | 173668 | 7382 |
總結
到此這篇關于Mybatis兩種不同批量插入方式區(qū)別的文章就介紹到這了,更多相關Mybatis批量插入方式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java網絡編程之URL+URLconnection使用方法示例
這篇文章主要介紹了Java網絡編程之URL+URLconnection使用方法示例,還是比較不錯的,這里分享給大家,供需要的朋友參考。2017-11-11

