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

Mybatis-plus 批量插入太慢的問題解決(提升插入性能)

 更新時(shí)間:2021年11月09日 10:47:23   作者:Crystalqy  
公司使用的Mybatis-Plus操作SQL,用過Mybatis-Plus的小伙伴一定知道他有很多API提供給我們使用,但是批量插入大數(shù)據(jù)太慢應(yīng)該怎么解決,本文就詳細(xì)的介紹一下,感興趣的可以了解一下

MyBatis-Plus(簡(jiǎn)稱MP)是一個(gè)MyBatis的增強(qiáng)工具,旨在MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生。

特點(diǎn)

無侵入:只做增強(qiáng)不做改變,引入它不會(huì)對(duì)現(xiàn)有工程產(chǎn)生影響,如絲般順滑

損耗?。?jiǎn)?dòng)即會(huì)自動(dòng)注入基本 CURD,性能基本無損耗,直接面向?qū)ο蟛僮?/p>

強(qiáng)大的 CRUD 操作:內(nèi)置通用 Mapper、通用 Service,僅僅通過少量配置即可實(shí)現(xiàn)單表大部分 CRUD 操作,更有強(qiáng)大的條件構(gòu)造器,滿足各類使用需求

支持 Lambda 形式調(diào)用:通過 Lambda 表達(dá)式,方便的編寫各類查詢條件,無需再擔(dān)心字段寫錯(cuò)

支持主鍵自動(dòng)生成:支持多達(dá) 4 種主鍵策略(內(nèi)含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題

支持 ActiveRecord 模式:支持 ActiveRecord 形式調(diào)用,實(shí)體類只需繼承 Model 類即可進(jìn)行強(qiáng)大的 CRUD 操作

支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )

內(nèi)置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用

內(nèi)置分頁插件:基于 MyBatis 物理分頁,開發(fā)者無需關(guān)心具體操作,配置好插件之后,寫分頁等同于普通 List 查詢

分頁插件支持多種數(shù)據(jù)庫:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多種數(shù)據(jù)庫

內(nèi)置性能分析插件:可輸出 Sql 語句以及其執(zhí)行時(shí)間,建議開發(fā)測(cè)試時(shí)啟用該功能,能快速揪出慢查詢

內(nèi)置全局?jǐn)r截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規(guī)則,預(yù)防誤操作

MP功能強(qiáng)大,但是上線后發(fā)現(xiàn)有一個(gè)問題,他內(nèi)置的saveBatch批量插入功能有著巨大的隱患,查看源碼發(fā)現(xiàn)他是這么實(shí)現(xiàn)的

其中關(guān)鍵的方法executeBatch源碼為:

啟動(dòng)服務(wù)后,用Postman調(diào)試,后臺(tái)打印如下:

從圖上可以看出這個(gè)所謂的批量插入接口,其實(shí)就是一個(gè)for循環(huán)插入,所以會(huì)對(duì)數(shù)據(jù)庫產(chǎn)生很大的壓力,第一反應(yīng)是手工實(shí)現(xiàn),這樣

INSERT INTO test (a, b, c) VALUES
<foreach collection="list" item="item" separator=",">
    (#{item.a}, #{item.b}, #{item.c})
</foreach>

但是仔細(xì)閱讀源碼發(fā)現(xiàn),他的CRUD方法其實(shí)都是實(shí)現(xiàn)了一個(gè)叫做AbstractMethod的類的,類繼承如圖

其中我們看到有一個(gè)方法是InsertBatchSomeColumn,這個(gè)方法實(shí)際上就是我們手寫的那種批量插入的功能的實(shí)現(xiàn)了,我們現(xiàn)在要做的是把這個(gè)方法注入到我們的工程中,并且替換掉之前的saveBatch方法

第一步:新增我們自己的SQL注入器,用來擴(kuò)展批量插入

public class CxmSqlInjector extends DefaultSqlInjector{
    
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        // 防止父類的方法不可使用
        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
        // 添加批量插入的方法
        methodList.add(new InsertBatchSomeColumn());
        return methodList;
    }
 
}

第二步:把上面的類注入到Spring中

第三步:在我們的BaseDAO中聲明該方法

第四步:重寫saveBatch

最后再調(diào)用saveBatch的時(shí)候就會(huì)發(fā)現(xiàn)完成了批量插入的時(shí)候不是for 循環(huán)插入了,大功告成?。。?/p>

到此這篇關(guān)于Mybatis-plus 批量插入太慢的問題解決(提升插入性能)的文章就介紹到這了,更多相關(guān)Mybatis-plus 批量插入太慢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文掌握SpringBoot多環(huán)境配置

    一文掌握SpringBoot多環(huán)境配置

    在實(shí)際項(xiàng)目的開發(fā)過程中,我們程序往往需要在不同環(huán)境中運(yùn)行,每個(gè)環(huán)境中的配置參數(shù)可能都會(huì)有所不同,例如數(shù)據(jù)庫連接信息、文件服務(wù)器等等,下面小編給大家介紹SpringBoot多環(huán)境配置,感興趣的朋友一起看看吧
    2024-04-04
  • Java中try-catch的使用及注意細(xì)節(jié)

    Java中try-catch的使用及注意細(xì)節(jié)

    現(xiàn)在有很多的語言都支持try-catch,比如常見的就是c++,java等,這篇文章主要給大家介紹了關(guān)于Java中try-catch的使用及注意細(xì)節(jié)的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • springboot集成CAS實(shí)現(xiàn)單點(diǎn)登錄的示例代碼

    springboot集成CAS實(shí)現(xiàn)單點(diǎn)登錄的示例代碼

    這篇文章主要介紹了springboot集成CAS實(shí)現(xiàn)單點(diǎn)登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • @PathVariable、@RequestParam和@RequestBody的區(qū)別

    @PathVariable、@RequestParam和@RequestBody的區(qū)別

    本文主要介紹了@PathVariable、@RequestParam和@RequestBody的區(qū)別和使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 一文教你使用Java?Calendar類進(jìn)行日期計(jì)算

    一文教你使用Java?Calendar類進(jìn)行日期計(jì)算

    在日常開發(fā)中,我們常常需要進(jìn)行日期計(jì)算,比如計(jì)算兩個(gè)日期之間的天數(shù)、月數(shù),在Java中,我們可以使用Java?Calendar類來進(jìn)行日期計(jì)算,下面就跟隨小編一起來學(xué)習(xí)一下吧
    2023-10-10
  • SpringBoot接入支付寶支付的方法步驟

    SpringBoot接入支付寶支付的方法步驟

    這篇文章主要介紹了SpringBoot接入支付寶支付的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Spring Boot項(xiàng)目實(shí)戰(zhàn)之?dāng)r截器與過濾器

    Spring Boot項(xiàng)目實(shí)戰(zhàn)之?dāng)r截器與過濾器

    這篇文章主要介紹了Spring Boot項(xiàng)目實(shí)戰(zhàn)之?dāng)r截器與過濾器,文中給大家詳細(xì)介紹了springboot 攔截器和過濾器的基本概念,過濾器的配置,需要的朋友可以參考下
    2018-01-01
  • Java編寫實(shí)現(xiàn)九宮格應(yīng)用

    Java編寫實(shí)現(xiàn)九宮格應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了Java編寫實(shí)現(xiàn)九宮格應(yīng)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java定時(shí)器Timer簡(jiǎn)述

    Java定時(shí)器Timer簡(jiǎn)述

    本文主要介紹了Java定時(shí)器Timer的相關(guān)知識(shí),具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • 詳解Java的設(shè)計(jì)模式編程中的原型模式

    詳解Java的設(shè)計(jì)模式編程中的原型模式

    這篇文章主要介紹了Java的設(shè)計(jì)模式編程中的原型模式,處理對(duì)象復(fù)制時(shí)要特別注意淺拷貝和深拷貝的問題,需要的朋友可以參考下
    2016-02-02

最新評(píng)論

阿城市| 沙雅县| 定兴县| 宣汉县| 广宗县| 维西| 康定县| 邹城市| 湄潭县| 阜阳市| 竹北市| 明光市| 泸州市| 合作市| 黎城县| 施秉县| 陕西省| 沿河| 叙永县| 晴隆县| 阜新市| 安吉县| 天台县| 东海县| 华宁县| 乐东| 无棣县| 龙州县| 万盛区| 滕州市| 东海县| 灯塔市| 平遥县| 桃园市| 唐河县| 松江区| 文山县| 景德镇市| 饶平县| 钟山县| 汕头市|