mybatis實(shí)現(xiàn)批量更新全過(guò)程
mybatis實(shí)現(xiàn)批量更新
注:Mybatis實(shí)現(xiàn)批量更新有三種方式,分別是使用foreach標(biāo)簽、使用SQL的case when語(yǔ)句和使用動(dòng)態(tài)SQL的choose語(yǔ)句。
具體實(shí)現(xiàn)方法如下:
1:使用foreach標(biāo)簽
<update id="pubAndTakes">
<foreach collection="idList" item="item" separator=";" open="begin" close=";end;">
UPDATE LY_SJS_WDZM_YXLXD_PZRY SET ZT = '1' , CJSJ = TO_CHAR(SYSDATE,'yyyy-MM-dd hh:mm:ss')
,BBH = #{item.bbh}
WHERE ZT = #{item.zt} AND ID = #{item.id}
</foreach>
</update>2:使用SQL的case when語(yǔ)句
<update id="updateBatch" parameterType="java.util.List">
UPDATE your_table
SET your_column1 =
<foreach collection="list" item="item" separator=",">
WHEN your_id = #{item.id} THEN #{item.column1}
</foreach>
WHERE your_id IN
<foreach collection="list" item="item" open="(" close=")" separator=",">
#{item.id}
</foreach>
</update>
3:使用 Case 語(yǔ)句
在 SQL 更新語(yǔ)句中使用 CASE 語(yǔ)句,根據(jù)條件進(jìn)行更新。這種方式可以避免使用 foreach 或 BatchExecutor,但對(duì)于大量數(shù)據(jù)可能性能較差。
<update id="updateBatch" parameterType="java.util.List">
UPDATE your_table
SET your_column1 =
CASE
<foreach collection="list" item="item" separator=" ">
WHEN your_id = #{item.id} THEN #{item.column1}
</foreach>
END,
your_column2 =
CASE
<foreach collection="list" item="item" separator=" ">
WHEN your_id = #{item.id} THEN #{item.column2}
</foreach>
END
WHERE your_id IN
<foreach collection="list" item="item" open="(" close=")" separator=",">
#{item.id}
</foreach>
</update>
這種方式的 SQL 語(yǔ)句會(huì)根據(jù)條件進(jìn)行更新,適用于一次性批量更新較少的記錄。
注:
使用BatchExecutor批處理器
MyBatis 提供了 BatchExecutor 批處理器,可以在一次數(shù)據(jù)庫(kù)會(huì)話中批量執(zhí)行多個(gè) SQL 語(yǔ)句。這種方式需要在代碼中手動(dòng)創(chuàng)建批處理器,并調(diào)用 batch 方法執(zhí)行批量更新。
注意,此方式可能不支持所有數(shù)據(jù)庫(kù),因此請(qǐng)仔細(xì)查閱文檔以確認(rèn)你的數(shù)據(jù)庫(kù)是否支持。
SqlSession sqlSession = sqlSessionFactory
.openSession(ExecutorType.BATCH, false);
YourMapper mapper = sqlSession.getMapper(YourMapper.class);
try {
for (YourEntity entity : entities) {
mapper.update(entity);
}
sqlSession.commit();
} finally {
sqlSession.close();
}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot實(shí)現(xiàn)用戶名查找用戶功能
本文主要介紹了springboot實(shí)現(xiàn)用戶名查找用戶功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Java 如何將表格數(shù)據(jù)導(dǎo)入word文檔中
這篇文章主要介紹了Java將表格數(shù)據(jù)導(dǎo)入word文檔中的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
淺析Spring Boot單體應(yīng)用熔斷技術(shù)的使用
這篇文章主要介紹了淺析Spring Boot單體應(yīng)用熔斷技術(shù)的使用,幫助大家更好的理解和使用spirngboot框架,感興趣的朋友可以了解下2021-01-01
Mybatis聯(lián)合查詢XML與注解對(duì)比分析
文章對(duì)比了MyBatis中XML配置方式和注解方式查詢多表關(guān)聯(lián)的效率和實(shí)現(xiàn)方式,XML配置方式執(zhí)行聯(lián)合查詢效率較高,但注解方式雖然可以獨(dú)立使用,但在處理復(fù)雜映射時(shí)不如XML靈活2026-03-03
在Spring?AI?中配置多個(gè)?LLM?客戶端的詳細(xì)過(guò)程
本文探討了如何在單個(gè)Spring?AI應(yīng)用中集成多個(gè)LLM,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2025-10-10
IDEA實(shí)現(xiàn)純java項(xiàng)目并打包jar的步驟(不使用Maven,Spring)
在Java開(kāi)發(fā)中我們通常會(huì)將我們的項(xiàng)目打包成可執(zhí)行的Jar包,以便于在其他環(huán)境中部署和運(yùn)行,這篇文章主要介紹了IDEA實(shí)現(xiàn)純java項(xiàng)目并打包jar(不使用Maven,Spring)的相關(guān)資料,需要的朋友可以參考下2025-08-08
Java使用JDBC連接Oracle_MSSQL實(shí)例代碼
這篇文章主要介紹了Java使用JDBC連接Oracle_MSSQL實(shí)例代碼,需要的朋友可以參考下2014-01-01
程序包org.springframework不存在的解決辦法
這篇文章主要介紹了程序包org.springframework不存在的解決辦法,在使用IDEA創(chuàng)建SpringBoot項(xiàng)目時(shí),剛打開(kāi)無(wú)法正常運(yùn)行,本文通過(guò)圖文結(jié)合的方式給大家介紹的非常詳細(xì),具有一定參考價(jià)值,需要的朋友可以參考下2024-07-07

