【第14章】MyBatis-Plus批量操作

文章目錄

  • 前言
  • 一、功能概覽
  • 二、類結構說明
    • 1.MybatisBatch<?>
    • 2.MybatisBatch.Method<?>
    • 3. BatchMethod<?>
    • 4.使用步驟
    • 5.返回值說明
  • 三、使用示例
    • 1. execute方法
    • 2. 示例一:實體類型數據
    • 3. 示例二:非實體類型數據
    • 4. 示例三:自定義方法插入(無注解)
    • 5. 示例四:自定義方法插入(帶注解)
  • 四、saveOrUpdate方法
    • 1. 跨sqlSession示例
    • 2. 共用sqlSession示例
  • 五、事務處理示例
    • 1. Spring事務處理示例
  • 總結


前言

批量操作是一種高效處理大量數據的技術,它允許開發者一次性執行多個數據庫操作,從而減少與數據庫的交互次數,提高數據處理的效率和性能。在MyBatis-Plus中,批量操作主要用于以下幾個方面:

  • 數據插入(Insert):批量插入是批量操作中最常見的應用場景之一。通過一次性插入多條記錄,可以顯著減少SQL語句的執行次數,加快數據寫入速度。這在數據遷移、初始化數據等場景中尤為有用。
  • 數據更新(Update):批量更新允許同時修改多條記錄的特定字段,適用于需要對大量數據進行統一變更的情況,如批量修改用戶狀態、更新產品價格等。
  • 數據刪除(Delete):批量刪除操作可以快速移除數據庫中的多條記錄,常用于數據清理、用戶注銷等場景。

添加鏈接描述


一、功能概覽

  • 支持版本:3.5.4 +
  • 事務控制:需手動管理(默認關閉)
  • 執行結果:返回批量處理結果,便于業務判斷成功與否
  • 數據寫入:取決于代碼是否正確執行到flushStatements
  • 兼容性:支持Spring與非Spring項目
  • 異常類型:執行拋出PersistenceException
  • 建議:對于saveOrUpdate方法,建議保持簡單的新增或更新操作

二、類結構說明

1.MybatisBatch<?>

  • 泛型:實際數據類型
  • sqlSessionFactory:可通過容器獲取,非Spring容器下需自行初始化Mybatis并記錄上下文
  • dataList:實際批量數據處理列表(不可為空)

2.MybatisBatch.Method<?>

實際為BatchMethod,簡化框架內部操作方法調用。

  • 泛型:實際Mapper方法參數類型
  • mapperClass:具體的Mapper類

3. BatchMethod<?>

  • 泛型:實際Mapper方法參數類型
  • statementId:執行的MappedStatement ID
  • parameterConvert:參數類型轉換處理器,用于數據類型與Mapper方法參數不一致時的轉換

4.使用步驟

  1. 創建MybatisBatch實例(綁定數據與sqlSessionFactory)
  2. 創建MybatisBatch.Method實例(確定執行的Mapper類方法)
  3. 執行操作(將批量參數轉換為Mapper方法所需參數)

5.返回值說明

返回類型:List

返回內容:每次執行MappedStatement + SQL的操作結果分組。

注意:例如批量根據ID更新,若10條數據中5條更新一個字段,5條更新兩個字段,則返回值為容量為2的List,分別存儲5條記錄的更新情況。

三、使用示例

框架提供MybatisBatchUtils進行靜態方法調用。

1. execute方法

適用于insert, update, delete操作。

2. 示例一:實體類型數據

List<H2User> userList = Arrays.asList(new H2User(2000L, "測試"), new H2User(2001L, "測試"));
MybatisBatch<H2User> mybatisBatch = new MybatisBatch<>(sqlSessionFactory, userList);
MybatisBatch.Method<H2User> method = new MybatisBatch.Method<>(H2UserMapper.class);
mybatisBatch.execute(method.insert());

3. 示例二:非實體類型數據

List<Long> ids = Arrays.asList(120000L, 120001L);
MybatisBatch<Long> mybatisBatch = new MybatisBatch<>(sqlSessionFactory, ids);
MybatisBatch.Method<H2User> method = new MybatisBatch.Method<>(H2UserMapper.class);
mybatisBatch.execute(method.insert(id -> {H2User h2User = new H2User();h2User.setTestId(id);return h2User;
}));

4. 示例三:自定義方法插入(無注解)

// mapper方法定義
@Insert("insert into h2user(name,version) values( #{name}, #{version})")
int myInsertWithoutParam(H2User user1);// 準備數據
List<H2User> h2UserList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {h2UserList.add(new H2User("myInsertWithoutParam" + i));
}MybatisBatch<H2User> mybatisBatch = new MybatisBatch<>(sqlSessionFactory, h2UserList);
MybatisBatch.Method<H2User> method = new MybatisBatch.Method<>(H2UserMapper.class);
mybatisBatch.execute(method.get("myInsertWithoutParam"));

5. 示例四:自定義方法插入(帶注解)

// 帶注解的mapper方法定義
@Insert("insert into h2user(name,version) values( #{user1.name}, #{user1.version})")
int myInsertWithParam(@Param("user1") H2User user1);// 準備數據
List<H2User> h2UserList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {h2UserList.add(new H2User("myInsertWithParam" + i));
}MybatisBatch<H2User> mybatisBatch = new MybatisBatch<>(sqlSessionFactory, h2UserList);
MybatisBatch.Method<H2User> method = new MybatisBatch.Method<>(H2UserMapper.class);
mybatisBatch.execute(method.get("myInsertWithParam", (user) -> {Map<String, Object> map = new HashMap<>();map.put("user1", user);return map;
}));

四、saveOrUpdate方法

執行保存或更新操作。

注意:跨sqlSession下需注意緩存和數據感知問題。

1. 跨sqlSession示例

@Autowired
private H2UserMapper userMapper;List<H2User> h2UserList = new ArrayList<>();
for (int i = 0; i < 100; i++) {h2UserList.add(new H2User(Long.valueOf(40000 + i), "test" + i));
}
MybatisBatch.Method<H2User> mapperMethod = new MybatisBatch.Method<>(H2UserMapper.class);new MybatisBatch<>(sqlSessionFactory, h2UserList).saveOrUpdate(mapperMethod.insert(), // 指定insert方法((sqlSession, h2User) -> userMapper.selectById(h2User.getTestId()) == null), // 判斷條件mapperMethod.updateById()); // 指定update方法

2. 共用sqlSession示例

List<H2User> h2UserList = new ArrayList<>();
for (int i = 0; i < 100; i++) {h2UserList.add(new H2User(Long.valueOf(50000 + i), "test" + i));
}
MybatisBatch.Method<H2User> mapperMethod = new MybatisBatch.Method<>(H2UserMapper.class);new MybatisBatch<>(sqlSessionFactory, h2UserList).saveOrUpdate(mapperMethod.insert(), // 指定insert方法((sqlSession, h2User) -> sqlSession.selectList(mapperMethod.get("selectById").getStatementId(), h2User.getTestId()).isEmpty()), // 判斷條件mapperMethod.updateById()); // 指定update方法

五、事務處理示例

1. Spring事務處理示例

@Autowired
private TransactionTemplate transactionTemplate;transactionTemplate.execute((TransactionCallback<List<BatchResult>>) status -> {MybatisBatch.Method<H2User> mapperMethod = new MybatisBatch.Method<>(H2UserMapper.class);// 執行批量插入MybatisBatchUtils.execute(sqlSessionFactory, h2UserList, mapperMethod.insert());throw new RuntimeException("出錯了");
});

總結

回到頂部

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40152.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40152.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40152.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

茗鶴 | 如何借助APS高級計劃排程系統提高汽車整車制造的效率

在我們做了詳盡的市場調研及頭部汽車制造企業排程需求溝通后&#xff0c;我們發現盡管企業有很多的業務系統做支撐&#xff0c;在計劃排程領域&#xff0c;所有的汽車制造總裝廠仍舊使用人工“Excel”做排產規劃&#xff0c;其中少部分也會借助MRP、第三方輔助排產工具。鑒于我…

ChatGPT:Java中的對象引用實現方式

ChatGPT&#xff1a;Java中的對象引用實現方式 如果使用句柄的話&#xff0c;那么 Java 堆中將會劃分出一塊內存來作為句柄池&#xff0c;reference 中存儲的就是對象的句柄地址&#xff0c;而句柄中包含了對象實例數據與對象類型數據各自的具體地址信息。 你提到的句柄機制是…

JVM原理(十一):JVM虛擬機六種必需對類進行初始化的情況

Java虛擬機把描述類的數據從Class文件加載到內存&#xff0c;并對數據進行校驗、轉換解析和初始化&#xff0c;最終形成可以被虛擬機直接使用的Java類型&#xff0c;這個過程被稱作虛擬機的類加載機制。Java天生可以動態擴展的語言特性就是依賴運行期間動態加載和動態鏈接這個特…

104.二叉樹的最大深度

給定一個二叉樹 root &#xff0c;返回其最大深度。 二叉樹的 最大深度 是指從根節點到最遠葉子節點的最長路徑上的節點數。 示例 1&#xff1a; 輸入&#xff1a;root [3,9,20,null,null,15,7] 輸出&#xff1a;3 示例 2&#xff1a; 輸入&#xff1a;root [1,null,2] 輸出…

相機參數與圖像處理技術解析

01. 相機內參和外參的含義&#xff1f;如果將圖像放大兩倍&#xff0c;內外參如何變化&#xff1f; 相機有兩個最基礎的數據&#xff1a;內參(Instrinsics)和外參(Extrinsics)&#xff0c;內參主要描述的是相機的CCD/CMOS感光片尺寸/分辨率以及光學鏡頭的系數&#xff0c;外參主…

每日兩題 / 20. 有效的括號 155. 最小棧(LeetCode熱題100)

20. 有效的括號 - 力扣&#xff08;LeetCode&#xff09; 遇到左括號入棧 遇到右括號判斷棧頂是否為匹配的左括號 最后判斷棧是否為空 func isValid(s string) bool {var stk []runefor _, value : range s {if value ( || value { || value [ {stk append(stk, value)}…

阿里巴巴圖標庫iconfont的使用方式

文章目錄 什么是 iconfong創建一個自己的項目如何使用Unicode 使用方法Font class 使用方式Symbol 使用方式還有一種使用方式 在線鏈接&#xff08;不推薦&#xff0c;但可用于測試&#xff09; 什么是 iconfong Iconfont 是一種圖標字體服務。它將各種圖標設計轉換為字體格式…

數據庫的約束與索引

數據庫的約束與索引 文章目錄 數據庫的約束與索引一、約束1、定義2、主鍵索引3、唯一約束4、非空約束5、外鍵約束 二、索引1、定義2、主鍵索引3、唯一索引4、普通索引5、全文索引 三、深入索引面試題&#xff08;一&#xff09;面試題&#xff08;二&#xff09;面試題&#xf…

【設計模式】行為型-狀態模式

在變幻的時光中&#xff0c;狀態如詩篇般細膩流轉。 文章目錄 一、可調節的燈光二、狀態模式三、狀態模式的核心組件四、運用狀態模式五、狀態模式的應用場景六、小結推薦閱讀 一、可調節的燈光 場景假設&#xff1a;我們有一個電燈&#xff0c;它可以被打開和關閉。用戶可以…

snap和apt的區別簡單了解

Linux中沒有tree命令的時候提示安裝的時候出現了兩個命令&#xff0c;簡單看了看兩者有何區別&#xff08;一般用apt就可以了&#xff09;&#xff1a; sudo snap install tree 和 sudo apt install tree 這兩個命令都是用來安裝 tree 命令行工具的&#xff0c;但它們使用的是不…

在線教育平臺,easyexcel使用案例

控制器 因為如何想要在讀數據的時候操作數據庫&#xff0c;就必須使用構造方法傳dao 或者service&#xff0c;因為這個不歸spring管理&#xff0c;不能自動注入&#xff0c;所以參數里需要傳遞service 或者 dao AutowiredIEduSubjectService subjectService;添加課程分類的方法…

Anaconda學習常見問題匯總

問題1&#xff1a;Fatal error in launcher: Unable to create process using ‘“d:\anaconda\isntall\envs\learn1\python.exe 在進行anaconda學習時&#xff0c;在控制臺輸入&#xff1a;pip list想要查看環境里的內容時發生錯誤&#xff1a; Fatal error in launcher: Un…

個人博客|PHP源碼|支持多國語言切換

一. 前言 今天小編給大家帶來了一款可學習&#xff0c;可商用的&#xff0c;支持多國語言的個人博客網站源碼&#xff0c;支持二開&#xff0c;無加密。此博客相當簡潔&#xff0c;也適合海外。詳細界面和功能見下面視頻演示。 如果您正好有此需求源碼&#xff0c;請聯系小編…

軟件資產管理系統:提升企業軟件資產透明度與合規性的終極解決方案!

在當今數字化轉型浪潮中&#xff0c;企業軟件資產管理的重要性日益凸顯。然而&#xff0c;傳統的手工管理方式往往效率低下&#xff0c;難以應對快速變化的軟件環境。SmartLic軟件資產管理系統應運而生&#xff0c;它以先進的技術手段&#xff0c;為企業提供全面的軟件資產管理…

開源自動化熱鍵映射工具autohotkey十大用法及精選腳本

AutoHotkey&#xff08;AHK&#xff09;是一款功能強大的熱鍵腳本語言工具&#xff0c;它允許用戶通過編寫腳本來自動化鍵盤、鼠標等設備的操作&#xff0c;從而極大地提高工作效率。以下是AutoHotkey的十大經典用法&#xff0c;這些用法不僅解放了用戶的雙手&#xff0c;還展示…

程序化交易廣告及其應用

什么是程序化交易廣告&#xff1f; 程序化交易廣告是以實時競價技術即RTB&#xff08;real-time bidding&#xff09;為核心的廣告交易方式。說到這里&#xff0c;你可能會有疑問&#xff1a;像百度搜索關鍵詞廣告還有百度網盟的廣告&#xff0c;不也是CPC實時競價的嗎&#x…

MDX的魔法:探索SQL Server中的多維表達式

&#x1f4ca; MDX的魔法&#xff1a;探索SQL Server中的多維表達式 在商業智能和數據分析領域&#xff0c;SQL Server提供了一種強大的工具來處理多維數據集&#xff0c;這就是多維表達式&#xff08;Multidimensional Expressions&#xff0c;簡稱MDX&#xff09;。MDX是一種…

論文學習_UVSCAN: Detecting Third-Party Component Usage Violations in IoT Firmware

論文名稱發表時間發表期刊期刊等級研究單位 Understanding the Security Risks Introduced by Third-Party Components in IoT Firmware 2024年IEEE TDSCCCF A佐治亞理工學院 1. 引言 研究背景&#xff1a;物聯網&#xff08;IoT&#xff09;已經無處不在&#xff0c;為我們…

HQChart報價列表高級應用教程7-走勢列數據對接

HQChart報價列表高級應用教程7-走勢列數據對接 走勢列小程序效果圖PC效果圖HQChart代碼地址走勢列類型配置走勢列數據格式示例走勢列 單獨使用一列顯示每個股票的走勢圖 小程序效果圖 PC效果圖 HQChart代碼地址 地址:github.com/jones2000/HQChart 走勢列類型 REPORT_COL…

[工業網絡] 模型建立

普渡大學ICS參考模型 普渡企業參考架構&#xff08;PERA&#xff09;是由西奧多J威廉姆斯&#xff08;Theodore J. Williams&#xff09;和普渡大學計算機集成制造工業大學聯盟的成員在1990年代開發的企業架構參考模型。該模型被ISA-99&#xff08;現為ISA/IEC 62443&#xff…