mybatis-plus用insertBatchSomeColumn方法批量新增指定字段
前言
MyBatis-Plus 是基于 MyBatis 進(jìn)行封裝的一套優(yōu)秀的持久層框架,它提供了豐富的便捷操作方法和強(qiáng)大的代碼生成器,大大簡化了 MyBatis 的使用。在 MyBatis-Plus 中,我們可以使用 insertBatchSomeColumn 方法來實(shí)現(xiàn)批量新增指定字段的操作。
mybatis-plus的 IService接口 默認(rèn)提供 saveBatch批量插入,也是唯一一個默認(rèn)批量插入,在數(shù)據(jù)量不是很大的情況下可以直接使用,但這種是一條一條執(zhí)行的效率上會有一定的瓶頸,在這里先看下saveBatch的執(zhí)行情況



可以看到sql語句是一條一條執(zhí)行的,插入多少條數(shù)據(jù)就相當(dāng)于執(zhí)行了多少次的插入sql, 點(diǎn)進(jìn)saveBatch方法,看看內(nèi)部是怎么實(shí)現(xiàn)的

注意看,方法有一個事務(wù)注解,說明插入整批數(shù)據(jù)會作為一個事務(wù)進(jìn)行,
默認(rèn)1000條一次,怪不得執(zhí)行時每隔1000條會處于一個準(zhǔn)備執(zhí)行狀態(tài),等待幾秒后才會往下執(zhí)行(這里等待的時間就是1000個單條的insert語句執(zhí)行的時間)
再往下點(diǎn)是一個saveBatch接口,參數(shù)分別是插入的對象集合、插入批次數(shù)量也就是默認(rèn)的1000

這里也有一個事務(wù)的注解,這是因?yàn)?code>saveBatch是一個重載方法,插入的時候也可以指定插入批次數(shù)量調(diào)用
繼續(xù)往下進(jìn)入executeBatch


這里就是真正執(zhí)行的方法了,idxLimit會對比DEFAULT_BATCH_SIZE和集合長度兩個數(shù)中的最小數(shù),作為批量大小,也就是說當(dāng)集合長度不夠1000,那么執(zhí)行的時候批量大小就是集合的長度,就執(zhí)行一次。
for循環(huán)中的consumer:對應(yīng)的類型是一個函數(shù)式接口,代表一個接受兩個輸入?yún)?shù)且不返回任何內(nèi)容的操作符。意思是給定兩個參數(shù)sqlSession、循環(huán)中當(dāng)前element對象,執(zhí)行一次傳遞過來的consumer匿名函數(shù)。也就是上邊源碼里的插入匿名函數(shù)。
當(dāng)i == indLimit時:執(zhí)行一次預(yù)插入,并重新計(jì)算idxLimit的值
if中idxLimit計(jì)算規(guī)則:當(dāng)前idxLimit加batchSize(默認(rèn)1000) 和 集合長度 取最小值,計(jì)算出來的結(jié)果肯定不會超過集合的長度,最后的批次時idxLimit等于集合的長度,將這個值作為下一次執(zhí)行預(yù)插入的時間點(diǎn)。
sqlSession.flushStatements():當(dāng)有處于事務(wù)中的時候,起到一種預(yù)插入的作用,執(zhí)行了這行代碼之后,要插入的數(shù)據(jù)會鎖定數(shù)據(jù)庫的一行記錄,并把數(shù)據(jù)庫默認(rèn)返回的主鍵賦值給插入的對象,這樣就可以把該對象的主鍵賦值給其他需要的對象中去了,這里不是事務(wù)提交啊。
最后方法執(zhí)行完后@Transactional注解會默認(rèn)提交事務(wù),如果調(diào)用的方法上還有@Transactional注解,默認(rèn)的事務(wù)傳播類型是Propagation.REQUIRED,不會新開啟事務(wù),如果沒有@Transactional注解才會新開起事務(wù)
下面我們使用真正的批量新增方法insertBatchSomeColumn,看看兩者的區(qū)別
1. 什么是批量新增指定字段
批量新增指定字段是指在一次 SQL 語句中執(zhí)行多條 INSERT 語句,但是只插入指定的字段。批量新增指定字段可以提高數(shù)據(jù)操作效率,減少數(shù)據(jù)庫與應(yīng)用程序之間的網(wǎng)絡(luò)傳輸次數(shù),減輕數(shù)據(jù)庫服務(wù)器的壓力,提高系統(tǒng)的并發(fā)性能。
2. MyBatis-Plus 批量新增指定字段的方法的使用
mybatis-plus提供了InsertBatchSomeColumn批量insert方法。通過SQL 自動注入器接口 ISqlInjector注入通用方法 SQL 語句 然后繼承 BaseMapper 添加自定義方法,全局配置 sqlInjector 注入 MP 會自動將類所有方法注入到 mybatis 容器中。我們需要通過這種方式注入下。
/**
* 自定義Sql注入
*
*/
public class EasySqlInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
// 注意:此SQL注入器繼承了DefaultSqlInjector(默認(rèn)注入器),調(diào)用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自帶方法
List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));
return methodList;
}
}
自定義EasyBaseMapper
/**
* @author 武天
* @date 2023/3/22 18:19
*/
public interface EasyBaseMapper<T> extends BaseMapper<T> {
/**
* 批量插入 僅適用于mysql
*
* @param entityList 實(shí)體列表
* @return 影響行數(shù)
*/
Integer insertBatchSomeColumn(Collection<T> entityList);
}mapper繼承的這里改為繼承剛書寫的自定義mapper
/**
*
*
* @author wutian
* @email ${email}
* @date 2022-10-03 22:12:06
*/
@Mapper
public interface BreakDownCluesDao extends EasyBaseMapper<ExcelBreakdownClues> {
}調(diào)用測試



可以看到明顯的區(qū)別,sql只執(zhí)行了一條,后面都是入?yún)⒍禾栂喔舻男问?耗時也有所優(yōu)化,這是插入數(shù)量不是很多的情況,如果是上萬條或者上千萬條數(shù)據(jù),這種形式的優(yōu)越性就體現(xiàn)出來了
3. 批量新增指定字段的注意事項(xiàng)
在使用 MyBatis-Plus 進(jìn)行批量新增指定字段時,需要注意以下幾點(diǎn):
- 每次新增的數(shù)據(jù)量不要過大,建議每批次新增的數(shù)據(jù)量控制在 1000 條以內(nèi)。
- 要新增的指定字段不能為 null,需要手動設(shè)置默認(rèn)值。
- 如果要新增的指定字段在實(shí)體類中有對應(yīng)的字段值,會被忽略。
總結(jié)
到此這篇關(guān)于mybatis-plus用insertBatchSomeColumn方法批量新增指定字段的文章就介紹到這了,更多相關(guān)mybatis-plus批量新增insertBatchSomeColumn內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC HttpMessageConverter報文信息轉(zhuǎn)換器
??HttpMessageConverter???,報文信息轉(zhuǎn)換器,將請求報文轉(zhuǎn)換為Java對象,或?qū)ava對象轉(zhuǎn)換為響應(yīng)報文。???HttpMessageConverter???提供了兩個注解和兩個類型:??@RequestBody,@ResponseBody???,??RequestEntity,ResponseEntity??2023-01-01
SpringBoot如何實(shí)現(xiàn)接口版本控制
這篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)接口版本控制,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
Java遞歸以及根據(jù)節(jié)點(diǎn)取子集合方式
文章介紹了Java中遞歸的使用方法,包括如何根據(jù)節(jié)點(diǎn)構(gòu)建樹形結(jié)構(gòu)以及如何反向遞歸獲取所有子節(jié)點(diǎn),提供了遞歸方法的參數(shù)解釋和示例代碼,希望對大家有所幫助2024-12-12
SpringBoot發(fā)送郵件功能 驗(yàn)證碼5分鐘過期
這篇文章主要為大家詳細(xì)介紹了SpringBoot發(fā)送郵件功能,驗(yàn)證碼5分鐘過期,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-03-03
MyBatis核心概念?+?環(huán)境搭建?+?CRUD實(shí)戰(zhàn)詳解
文章主要介紹了MyBatis的核心知識,從JDBC痛點(diǎn)開始,闡述了MyBatis的優(yōu)勢,包括連接池管理、SQL與Java代碼解耦、自動結(jié)果集映射、參數(shù)自動映射等,感興趣的朋友跟隨小編一起看看吧2026-05-05

