亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

MyBatis-Plus 是基于 MyBatis 進(jìn)行封裝的一套優(yōu)秀的持久層框架,它提供了豐富的便捷操作方法和強(qiáng)大的代碼生成器,大大簡(jiǎn)化了 MyBatis 的使用。在 MyBatis-Plus 中,我們可以使用 insertBatchSomeColumn 方法來(lái)實(shí)現(xiàn)批量新增指定字段的操作。

mybatis-plus的 IService接口 默認(rèn)提供 saveBatch批量插入,也是唯一一個(gè)默認(rèn)批量插入,在數(shù)據(jù)量不是很大的情況下可以直接使用,但這種是一條一條執(zhí)行的效率上會(huì)有一定的瓶頸,在這里先看下saveBatch的執(zhí)行情況

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

 注意看,方法有一個(gè)事務(wù)注解,說(shuō)明插入整批數(shù)據(jù)會(huì)作為一個(gè)事務(wù)進(jìn)行,

默認(rèn)1000條一次,怪不得執(zhí)行時(shí)每隔1000條會(huì)處于一個(gè)準(zhǔn)備執(zhí)行狀態(tài),等待幾秒后才會(huì)往下執(zhí)行(這里等待的時(shí)間就是1000個(gè)單條的insert語(yǔ)句執(zhí)行的時(shí)間)

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

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

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

這里就是真正執(zhí)行的方法了,idxLimit會(huì)對(duì)比DEFAULT_BATCH_SIZE和集合長(zhǎng)度兩個(gè)數(shù)中的最小數(shù),作為批量大小,也就是說(shuō)當(dāng)集合長(zhǎng)度不夠1000,那么執(zhí)行的時(shí)候批量大小就是集合的長(zhǎng)度,就執(zhí)行一次。

for循環(huán)中的consumer:對(duì)應(yīng)的類型是一個(gè)函數(shù)式接口,代表一個(gè)接受兩個(gè)輸入?yún)?shù)且不返回任何內(nèi)容的操作符。意思是給定兩個(gè)參數(shù)sqlSession、循環(huán)中當(dāng)前element對(duì)象,執(zhí)行一次傳遞過(guò)來(lái)的consumer匿名函數(shù)。也就是上邊源碼里的插入匿名函數(shù)。

當(dāng)i == indLimit時(shí):執(zhí)行一次預(yù)插入,并重新計(jì)算idxLimit的值

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

sqlSession.flushStatements():當(dāng)有處于事務(wù)中的時(shí)候,起到一種預(yù)插入的作用,執(zhí)行了這行代碼之后,要插入的數(shù)據(jù)會(huì)鎖定數(shù)據(jù)庫(kù)的一行記錄,并把數(shù)據(jù)庫(kù)默認(rèn)返回的主鍵賦值給插入的對(duì)象,這樣就可以把該對(duì)象的主鍵賦值給其他需要的對(duì)象中去了,這里不是事務(wù)提交啊。

最后方法執(zhí)行完后@Transactional注解會(huì)默認(rèn)提交事務(wù),如果調(diào)用的方法上還有@Transactional注解,默認(rèn)的事務(wù)傳播類型是Propagation.REQUIRED,不會(huì)新開(kāi)啟事務(wù),如果沒(méi)有@Transactional注解才會(huì)新開(kāi)起事務(wù)

下面我們使用真正的批量新增方法insertBatchSomeColumn,看看兩者的區(qū)別

1. 什么是批量新增指定字段

批量新增指定字段是指在一次 SQL 語(yǔ)句中執(zhí)行多條 INSERT 語(yǔ)句,但是只插入指定的字段。批量新增指定字段可以提高數(shù)據(jù)操作效率,減少數(shù)據(jù)庫(kù)與應(yīng)用程序之間的網(wǎng)絡(luò)傳輸次數(shù),減輕數(shù)據(jù)庫(kù)服務(wù)器的壓力,提高系統(tǒng)的并發(fā)性能。

2. MyBatis-Plus 批量新增指定字段的方法的使用

mybatis-plus提供了InsertBatchSomeColumn批量insert方法。通過(guò)SQL 自動(dòng)注入器接口 ISqlInjector注入通用方法 SQL 語(yǔ)句 然后繼承 BaseMapper 添加自定義方法,全局配置 sqlInjector 注入 MP 會(huì)自動(dòng)將類所有方法注入到 mybatis 容器中。我們需要通過(guò)這種方式注入下。

/**
 * 自定義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繼承的這里改為繼承剛書(shū)寫(xiě)的自定義mapper

/**
 * 
 * 
 * @author wutian
 * @email ${email}
 * @date 2022-10-03 22:12:06
 */
@Mapper
public interface BreakDownCluesDao extends EasyBaseMapper<ExcelBreakdownClues> {
}

調(diào)用測(cè)試

可以看到明顯的區(qū)別,sql只執(zhí)行了一條,后面都是入?yún)⒍禾?hào)相隔的形式,耗時(shí)也有所優(yōu)化,這是插入數(shù)量不是很多的情況,如果是上萬(wàn)條或者上千萬(wàn)條數(shù)據(jù),這種形式的優(yōu)越性就體現(xiàn)出來(lái)了 

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

在使用 MyBatis-Plus 進(jìn)行批量新增指定字段時(shí),需要注意以下幾點(diǎn):

  • 每次新增的數(shù)據(jù)量不要過(guò)大,建議每批次新增的數(shù)據(jù)量控制在 1000 條以內(nèi)。
  • 要新增的指定字段不能為 null,需要手動(dòng)設(shè)置默認(rèn)值。
  • 如果要新增的指定字段在實(shí)體類中有對(duì)應(yīng)的字段值,會(huì)被忽略。

總結(jié)

到此這篇關(guān)于mybatis-plus用insertBatchSomeColumn方法批量新增指定字段的文章就介紹到這了,更多相關(guān)mybatis-plus批量新增insertBatchSomeColumn內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

    由于byte被認(rèn)為是unsigned byte,所以最高位的1將會(huì)被解釋為符號(hào)位,另外Java中存儲(chǔ)是按照補(bǔ)碼存儲(chǔ),所以1000 0111會(huì)被認(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容器的啟動(dòng)流程圖展開(kāi)其內(nèi)容的相關(guān)資料,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • 2020年支持java8的Java反編譯工具匯總(推薦)

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

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

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

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

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

    JavaSE是為了開(kāi)發(fā)桌面應(yīng)用程序和控制臺(tái)應(yīng)用程序而設(shè)計(jì)的,使用JavaSE可以編寫(xiě)?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,幫助開(kāi)發(fā)者創(chuàng)建更具自描述性和可發(fā)現(xiàn)性的Web服務(wù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 解決lambda表達(dá)式內(nèi)出現(xiàn)異常無(wú)法throw拋出的問(wèn)題

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

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

    Java判斷一個(gè)實(shí)體是不是空的簡(jiǎn)單方法

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

    SpringBoot中@Import注解的使用方式

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

    解決idea爆紅 cant resolve symbol String的問(wèn)題解析

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

最新評(píng)論