最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis-plus用insertBatchSomeColumn方法批量新增指定字段

 更新時間:2023年05月19日 14:19:24   作者:暗武逢天  
mybatisPlus底層的新增方法是一條一條的新增的,下面這篇文章主要給大家介紹了關(guān)于mybatis-plus用insertBatchSomeColumn方法批量新增指定字段的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

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)換器

    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)接口版本控制

    這篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)接口版本控制,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java遞歸以及根據(jù)節(jié)點(diǎn)取子集合方式

    Java遞歸以及根據(jù)節(jié)點(diǎn)取子集合方式

    文章介紹了Java中遞歸的使用方法,包括如何根據(jù)節(jié)點(diǎn)構(gòu)建樹形結(jié)構(gòu)以及如何反向遞歸獲取所有子節(jié)點(diǎn),提供了遞歸方法的參數(shù)解釋和示例代碼,希望對大家有所幫助
    2024-12-12
  • Java如何設(shè)置PDF文檔背景色詳解

    Java如何設(shè)置PDF文檔背景色詳解

    這篇文章主要介紹了Java如何設(shè)置PDF文檔背景色詳解,一般生成的PDF文檔默認(rèn)的文檔底色為白色,我們可以通過一定方法來更改文檔的背景色,以達(dá)到文檔美化以及保護(hù)雙眼的作用。 以下內(nèi)容提供了Java編程來設(shè)置PDF背景色的方法,需要的朋友可以參考下
    2019-07-07
  • SpringBoot發(fā)送郵件功能 驗(yàn)證碼5分鐘過期

    SpringBoot發(fā)送郵件功能 驗(yàn)證碼5分鐘過期

    這篇文章主要為大家詳細(xì)介紹了SpringBoot發(fā)送郵件功能,驗(yàn)證碼5分鐘過期,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • java多線程編程實(shí)例

    java多線程編程實(shí)例

    這篇文章主要介紹了java多線程編程實(shí)例,分享了幾則多線程的實(shí)例代碼,具有一定參考價值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下。
    2017-11-11
  • maven解決依賴沖突的三種解決方法

    maven解決依賴沖突的三種解決方法

    依賴沖突是指項(xiàng)目依賴的某一個jar包,有多個不同的版本,因而造成了包版本沖突,本文主要介紹了maven解決依賴沖突的三種解決方法,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • MyBatis核心概念?+?環(huán)境搭建?+?CRUD實(shí)戰(zhàn)詳解

    MyBatis核心概念?+?環(huán)境搭建?+?CRUD實(shí)戰(zhàn)詳解

    文章主要介紹了MyBatis的核心知識,從JDBC痛點(diǎn)開始,闡述了MyBatis的優(yōu)勢,包括連接池管理、SQL與Java代碼解耦、自動結(jié)果集映射、參數(shù)自動映射等,感興趣的朋友跟隨小編一起看看吧
    2026-05-05
  • java取某段/某個時間段的值的方法

    java取某段/某個時間段的值的方法

    這篇文章主要介紹了java取某段/某個時間段的值的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • spring打包到j(luò)ar包的問題解決

    spring打包到j(luò)ar包的問題解決

    這篇文章主要給大家介紹了關(guān)于spring打包到j(luò)ar包遇到的問題的解決方法,文中通過實(shí)例代碼結(jié)束的非常詳細(xì),對大家的學(xué)習(xí)或者使用spring打包具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評論

莱西市| 马关县| 峡江县| 宜都市| 格尔木市| 雷州市| 顺义区| 辉县市| 伊通| 沂水县| 珠海市| 邳州市| 汉中市| 汉中市| 菏泽市| 安吉县| 长汀县| 富裕县| 巴林右旗| 盱眙县| 西吉县| 高唐县| 启东市| 县级市| 布尔津县| 玉门市| 朝阳县| 浏阳市| 吴堡县| 勃利县| 郸城县| 吉林市| 濮阳县| 巨野县| 彭泽县| 南江县| 肇州县| 定边县| 南投县| 武功县| 沅江市|