欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間: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í)行時(shí)每隔1000條會處于一個準(zhǔn)備執(zhí)行狀態(tài),等待幾秒后才會往下執(zhí)行(這里等待的時(shí)間就是1000個單條的insert語句執(zhí)行的時(shí)間)

再往下點(diǎn)是一個saveBatch接口,參數(shù)分別是插入的對象集合、插入批次數(shù)量也就是默認(rèn)的1000

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

繼續(xù)往下進(jìn)入executeBatch

這里就是真正執(zhí)行的方法了,idxLimit會對比DEFAULT_BATCH_SIZE和集合長度兩個數(shù)中的最小數(shù),作為批量大小,也就是說當(dāng)集合長度不夠1000,那么執(zhí)行的時(shí)候批量大小就是集合的長度,就執(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時(shí):執(zhí)行一次預(yù)插入,并重新計(jì)算idxLimit的值

if中idxLimit計(jì)算規(guī)則:當(dāng)前idxLimit加batchSize(默認(rèn)1000) 和 集合長度 取最小值,計(jì)算出來的結(jié)果肯定不會超過集合的長度,最后的批次時(shí)idxLimit等于集合的長度,將這個值作為下一次執(zhí)行預(yù)插入的時(shí)間點(diǎn)。

sqlSession.flushStatements():當(dāng)有處于事務(wù)中的時(shí)候,起到一種預(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)⒍禾栂喔舻男问?耗時(shí)也有所優(yōu)化,這是插入數(shù)量不是很多的情況,如果是上萬條或者上千萬條數(shù)據(jù),這種形式的優(yōu)越性就體現(xiàn)出來了 

3. 批量新增指定字段的注意事項(xiàng)

在使用 MyBatis-Plus 進(jìn)行批量新增指定字段時(shí),需要注意以下幾點(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)文章

  • Java輸出通過InetAddress獲得的IP地址數(shù)組詳細(xì)解析

    Java輸出通過InetAddress獲得的IP地址數(shù)組詳細(xì)解析

    由于byte被認(rèn)為是unsigned byte,所以最高位的1將會被解釋為符號位,另外Java中存儲是按照補(bǔ)碼存儲,所以1000 0111會被認(rèn)為是補(bǔ)碼形式,轉(zhuǎn)換成原碼便是1111 0001,轉(zhuǎn)換成十進(jìn)制數(shù)便是-121
    2013-09-09
  • Java中Spring技巧之?dāng)U展點(diǎn)的應(yīng)用

    Java中Spring技巧之?dāng)U展點(diǎn)的應(yīng)用

    這篇文章主要介紹了Java中Spring技巧之?dāng)U展點(diǎn)的應(yīng)用,下文Spring容器的啟動流程圖展開其內(nèi)容的相關(guān)資料,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • 2020年支持java8的Java反編譯工具匯總(推薦)

    2020年支持java8的Java反編譯工具匯總(推薦)

    這篇文章主要介紹了2020年支持java8的Java反編譯工具匯總,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java利用位運(yùn)算實(shí)現(xiàn)比較兩個數(shù)的大小

    Java利用位運(yùn)算實(shí)現(xiàn)比較兩個數(shù)的大小

    這篇文章主要為大家介紹了,在Java中如何不用任何比較判斷符(>,==,<),返回兩個數(shù)( 32 位整數(shù))中較大的數(shù),感興趣的可以了解一下
    2022-08-08
  • JavaSE程序邏輯控制實(shí)現(xiàn)詳細(xì)圖文教程

    JavaSE程序邏輯控制實(shí)現(xiàn)詳細(xì)圖文教程

    JavaSE是為了開發(fā)桌面應(yīng)用程序和控制臺應(yīng)用程序而設(shè)計(jì)的,使用JavaSE可以編寫?yīng)毩⑦\(yùn)行的Java應(yīng)用程序,這篇文章主要給大家介紹了關(guān)于JavaSE程序邏輯控制實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • SpringHateoas超媒體API之資源表示與鏈接關(guān)系詳解

    SpringHateoas超媒體API之資源表示與鏈接關(guān)系詳解

    本文將深入探討Spring HATEOAS的核心概念、資源表示方式以及如何構(gòu)建豐富的超媒體API,幫助開發(fā)者創(chuàng)建更具自描述性和可發(fā)現(xiàn)性的Web服務(wù),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 解決lambda表達(dá)式內(nèi)出現(xiàn)異常無法throw拋出的問題

    解決lambda表達(dá)式內(nèi)出現(xiàn)異常無法throw拋出的問題

    這篇文章主要介紹了lambda表達(dá)式內(nèi)出現(xiàn)異常無法throw拋出的解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java判斷一個實(shí)體是不是空的簡單方法

    Java判斷一個實(shí)體是不是空的簡單方法

    這篇文章主要給大家介紹了關(guān)于Java判斷一個實(shí)體是不是空的簡單方法,實(shí)際項(xiàng)目中我們會有很多地方需要判空校驗(yàn),文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下
    2023-07-07
  • SpringBoot中@Import注解的使用方式

    SpringBoot中@Import注解的使用方式

    這篇文章主要介紹了SpringBoot中@Import注解的使用方式,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • 解決idea爆紅 cant resolve symbol String的問題解析

    解決idea爆紅 cant resolve symbol String的問題解析

    連著出差幾個禮拜沒有使用idea開發(fā)工具,突然一天打開電腦發(fā)現(xiàn)idea里的代碼全部爆紅,懵逼不如所措,很多朋友建議我按住Alt+回車設(shè)置jdk就能解決,但是仍然報(bào)錯,經(jīng)過幾個小時(shí)的倒騰最終解決,遇到此問題的朋友參考下本文吧
    2021-06-06

最新評論