MyBatis批量操作XML的完整實(shí)現(xiàn)方案
MyBatis 通過 XML 映射文件實(shí)現(xiàn)批量插入(insert)、更新(update)和刪除(delete)的完整方案
1. 批量插入(insert)
1.1 單條SQL批量插入(推薦)
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO user(name, age, email) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.name}, #{item.age}, #{item.email})
</foreach>
</insert>1.2 批量插入并返回主鍵(MySQL)
<insert id="batchInsert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user(name, age, email) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.name}, #{item.age}, #{item.email})
</foreach>
</insert>1.3 批量插入(Oracle特殊語法)
<insert id="batchInsert">
INSERT ALL
<foreach collection="list" item="item">
INTO user(id, name, age, email)
VALUES(#{item.id}, #{item.name}, #{item.age}, #{item.email})
</foreach>
SELECT 1 FROM DUAL
</insert>2. 批量更新(update)
2.1 使用CASE WHEN批量更新(MySQL)
<update id="batchUpdate" parameterType="java.util.List">
UPDATE user
<trim prefix="SET" suffixOverrides=",">
<trim prefix="name = CASE" suffix="END,">
<foreach collection="list" item="item">
WHEN id = #{item.id} THEN #{item.name}
</foreach>
</trim>
<trim prefix="age = CASE" suffix="END,">
<foreach collection="list" item="item">
WHEN id = #{item.id} THEN #{item.age}
</foreach>
</trim>
<trim prefix="email = CASE" suffix="END">
<foreach collection="list" item="item">
WHEN id = #{item.id} THEN #{item.email}
</foreach>
</trim>
</trim>
WHERE id IN
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item.id}
</foreach>
</update>2.2 批量更新(Oracle)
<update id="batchUpdate" parameterType="java.util.List">
<foreach collection="list" item="item" open="BEGIN" close=";END;" separator=";">
UPDATE user SET
name = #{item.name},
age = #{item.age},
email = #{item.email}
WHERE id = #{item.id}
</foreach>
</update>3. 批量刪除(delete)
3.1 普通批量刪除
<delete id="batchDelete" parameterType="java.util.List">
DELETE FROM user WHERE id IN
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item.id}
</foreach>
</delete>3.2 批量刪除(Oracle)
<delete id="batchDelete" parameterType="java.util.List">
<foreach collection="list" item="item" open="BEGIN" close=";END;" separator=";">
DELETE FROM user WHERE id = #{item.id}
</foreach>
</delete>4. 動(dòng)態(tài)批量操作
4.1 動(dòng)態(tài)批量插入(根據(jù)條件)
<insert id="dynamicBatchInsert">
INSERT INTO user(name, age, email) VALUES
<foreach collection="list" item="item" separator=",">
<if test="item.name != null and item.email != null">
(#{item.name}, #{item.age}, #{item.email})
</if>
</foreach>
</insert>4.2 批量更新非空字段
<update id="batchUpdateSelective" parameterType="java.util.List">
UPDATE user
<trim prefix="SET" suffixOverrides=",">
<trim prefix="name = CASE" suffix="END,">
<foreach collection="list" item="item">
<if test="item.name != null">
WHEN id = #{item.id} THEN #{item.name}
</if>
</foreach>
</trim>
<trim prefix="age = CASE" suffix="END,">
<foreach collection="list" item="item">
<if test="item.age != null">
WHEN id = #{item.id} THEN #{item.age}
</if>
</foreach>
</trim>
</trim>
WHERE id IN
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item.id}
</foreach>
</update>5. 最佳實(shí)踐建議
- 批量大小控制:每批處理500-1000條數(shù)據(jù)最佳
- 事務(wù)管理:確保批量操作在一個(gè)事務(wù)中完成
- JDBC參數(shù):MySQL添加
rewriteBatchedStatements=true - 執(zhí)行器類型:對于大量數(shù)據(jù)考慮使用
ExecutorType.BATCH - 錯(cuò)誤處理:考慮分批處理,避免單批失敗導(dǎo)致全部回滾
到此這篇關(guān)于MyBatis批量操作XML的完整實(shí)現(xiàn)方案的文章就介紹到這了,更多相關(guān)MyBatis批量操作XML內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
從Date到LocalDateTime解析Java JDBC時(shí)間類型映射
在軟件開發(fā)中,時(shí)間處理一直是一個(gè)復(fù)雜而微妙的問題,時(shí)區(qū)、夏令時(shí)、精度、數(shù)據(jù)庫兼容性等問題時(shí)常困擾著開發(fā)者,本文將從歷史演進(jìn)的角度,深入探討JDBC時(shí)間類型映射的最佳實(shí)踐,并解釋背后的原理2025-12-12
Java8中Optional類型和Kotlin中可空類型的使用對比
這篇文章主要給大家介紹了關(guān)于Java8中Optional類型和Kotlin中可空類型的使用對比,文中通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
Java向MySQL添加中文數(shù)據(jù)數(shù)據(jù)庫顯示亂碼的解決方案
在用springboot做項(xiàng)目時(shí),由于重新安裝了本地Mysql數(shù)據(jù)庫(5.7版本)在前臺(tái)向數(shù)據(jù)庫插入和更新數(shù)據(jù)可的時(shí)候,涉及中文的時(shí)候在數(shù)據(jù)庫一直顯示異常,所以本文給大家介紹了相關(guān)的解決方案,需要的朋友可以參考下2024-02-02
Springboot啟動(dòng)后執(zhí)行方法小結(jié)
本文主要介紹了Springboot啟動(dòng)后執(zhí)行方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
基于SpringBoot和Vue3的博客平臺(tái)文章列表與分頁功能實(shí)現(xiàn)
在前面的教程中,我們已經(jīng)實(shí)現(xiàn)了基于Spring Boot和Vue3的發(fā)布、編輯、刪除文章功能。本教程將繼續(xù)引導(dǎo)您實(shí)現(xiàn)博客平臺(tái)的文章列表與分頁功能,需要的朋友可以參考閱讀2023-04-04
maven如何在tomcat8中實(shí)現(xiàn)自動(dòng)部署
本篇文章主要介紹了maven如何在tomcat8中實(shí)現(xiàn)自動(dòng)部署,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10

