簡單概述:
主流兩大ORM框架之一
Plus為MyBaits基礎(chǔ)之上的增強,包括對基礎(chǔ)crud的封裝
批量細(xì)節(jié)
saveBatch類似方法墩剖,用于批量新增修改刪除猴凹,但實際會有速度過慢的情況,通常手寫則是通過xml文件中forech標(biāo)簽進(jìn)行遍歷岭皂,組合成一條郊霎,自帶的則是分批次執(zhí)行提交,但如果mysql版本過低爷绘,或者未開啟批量操作书劝,則會把每條sql單獨執(zhí)行提交,造成執(zhí)行速度過慢的情況
/**
* 執(zhí)行批量操作
*
* @param entityClass 實體類
* @param log 日志對象
* @param list 數(shù)據(jù)集合
* @param batchSize 批次大小
* @param consumer consumer
* @param <E> T
* @return 操作結(jié)果
* @since 3.4.0
*/
public static <E> boolean executeBatch(Class<?> entityClass, Log log, Collection<E> list, int batchSize, BiConsumer<SqlSession, E> consumer) {
Assert.isFalse(batchSize < 1, "batchSize must not be less than one");
return !CollectionUtils.isEmpty(list) && executeBatch(entityClass, log, sqlSession -> {
int size = list.size();
int i = 1;
for (E element : list) {
consumer.accept(sqlSession, element);
if ((i % batchSize == 0) || i == size) {
sqlSession.flushStatements();
}
i++;
}
});
}
將傳入的實體List分為1000個一批土至,每個調(diào)用sqlSession.insert(sqlStatement, entity)购对,insert完一批做一次sqlSession.flushStatements(),看起來是沒有問題陶因,但是就是速度非常慢骡苞。查閱相關(guān)資料發(fā)現(xiàn),要批量執(zhí)行的話楷扬,JDBC連接URL字符串中需要新增一個參數(shù):rewriteBatchedStatements=true
MySQL的JDBC連接的url中要加rewriteBatchedStatements參數(shù)解幽,并保證5.1.13以上版本的驅(qū)動,才能實現(xiàn)高性能的批量插入毅否。
MySQL JDBC驅(qū)動在默認(rèn)情況下會無視executeBatch()語句亚铁,把我們期望批量執(zhí)行的一組sql語句拆散蝇刀,一條一條地發(fā)給MySQL數(shù)據(jù)庫螟加,批量插入實際上是單條插入,直接造成較低的性能。
只有把rewriteBatchedStatements參數(shù)置為true, 驅(qū)動才會幫你批量執(zhí)行SQL
另外這個選項對INSERT/UPDATE/DELETE都有效
官網(wǎng)鏈接:https://mp.baomidou.com/guide/