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

Mybatis實現(xiàn)批量更新數(shù)據(jù)(批量update)

 更新時間:2026年04月11日 08:43:20   作者:凡人歌者徐  
本文介紹了MyBatis批量更新數(shù)據(jù)的兩種方案,方案一使用foreach標簽拼接多條update語句,通過在數(shù)據(jù)庫連接URL中指定allowMultiQueries參數(shù)值為true來支持多條語句的執(zhí)行,提高效率;方案二拼接成一條SQL,但SQL語句會非常復雜且難以閱讀,不推薦使用

前言

當我們使用mybatis的時候,可能經常會碰到一批數(shù)據(jù)的批量更新問題,因為如果一條數(shù)據(jù)一更新,那每一條數(shù)據(jù)就需要涉及到一次數(shù)據(jù)庫的操作,包括網(wǎng)絡IO以及磁盤IO,可想而知,這個效率是非常低下的。而平時我們很少直接使用原生jdbc直接操作數(shù)據(jù)庫,而是會使用比較成熟的ORM框架,那么今天我們就來總結一下,如何使用mybatis做批量更新。

方案一(個人推薦)

在mybatis的xml文件中,使用foreach動態(tài)標簽拼接SQL語句,每一條數(shù)據(jù)的更新語句對應一條update語句,多條語句最終使用";"號進行拼接。

<update id="updateBatchById">
    <foreach collection="list" item="item" separator=";">
        update
            `t_student`
        set
            `name` = #{item.name},
            `age` = #{item.age}
        where
            id = #{item.id}
    </foreach>
</update>

測試執(zhí)行的時候,通過控制臺打印,我們可以很方便地看到上述代碼最終生成的SQL語句就是按照我們的本意是由";"號拼接的語句串。

這條SQL長串會一次性發(fā)送給數(shù)據(jù)庫執(zhí)行,只需要進行一次網(wǎng)絡IO,提高了效率。

當然,默認情況下,數(shù)據(jù)庫是不支持執(zhí)行這樣由";“號拼接的長串的,執(zhí)行的時候會報錯,提示說執(zhí)行的SQL有語法錯誤

我們需要通過在數(shù)據(jù)庫連接URL中指定allowMultiQueries參數(shù)值為true告訴數(shù)據(jù)庫以支持”;"號分隔的多條語句的執(zhí)行。

spring.datasource.url=jdbc:mysql://localhost:3306/test?allowMultiQueries=true

方案二(個人不推薦)

同樣是使用foreach動態(tài)標簽拼接SQL語句,但是這種方案是最終拼接成一條SQL,而不是多條SQL的長串。

update `t_student`
<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="(" close=")" separator=",">
    #{item.id}
</foreach>

最終控制臺打印出的SQL如下

UPDATE `t_student` 
SET `name` =
CASE
		WHEN `id` = 1 THEN
		'張三' 
		WHEN `id` = 2 THEN
		'李四' 
		WHEN `id` = 3 THEN
		'王五' 
		WHEN `id` = 4 THEN
		'趙六' 
	END,
	`age` =
CASE
		WHEN `id` = 1 THEN
		40 
		WHEN `id` = 2 THEN
		34 
		WHEN `id` = 3 THEN
		55 
		WHEN `id` = 4 THEN
		76 
	END 
WHERE
	`id` IN ( 1, 2, 3, 4 )

可以發(fā)現(xiàn),如果批量數(shù)據(jù)量太大,要更新的字段太多,那這個SQL就會非常難看且復雜,充斥大量的case when判斷,而且這種case when感覺也會增大數(shù)據(jù)庫壓力,因為這種case when都需要數(shù)據(jù)庫自己去做判斷,所以個人感覺不太好,所以不推薦。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java-URLDecoder、URLEncoder使用及說明

    Java-URLDecoder、URLEncoder使用及說明

    本文介紹了Java中URLDecoder和URLEncoder類的使用方法,包括編碼和解碼規(guī)則、推薦的編碼方案、解碼器處理非法字符的方法以及URL編碼和解碼的示例
    2024-12-12
  • mybatis單元測試過程(無需啟動容器)

    mybatis單元測試過程(無需啟動容器)

    在MyBatis中,單元測試無需啟動容器即可進行,主要涉及Configuration類、Executor接口及其實現(xiàn)類,以及XMLMapperBuilder的作用,Configuration類是配置的承載者,負責初始化并解析配置文件,Executor接口及其實現(xiàn)類
    2024-09-09
  • java獲取文件擴展名的方法小結【正則與字符串截取】

    java獲取文件擴展名的方法小結【正則與字符串截取】

    這篇文章主要介紹了java獲取文件擴展名的方法,結合實例形式分析了使用正則與字符串截取兩種獲取擴展名的操作技巧,需要的朋友可以參考下
    2017-01-01
  • 深入淺析SPI機制在JDK與Spring?Boot中的應用

    深入淺析SPI機制在JDK與Spring?Boot中的應用

    SPI是一種使軟件框架或庫更加模塊化、可擴展和可維護的有效方法。通過遵循“開閉原則”,?SPI?確保了系統(tǒng)的穩(wěn)定性和靈活性,從而滿足了不斷變化的業(yè)務需求,這篇文章主要介紹了SPI機制在JDK與Spring?Boot中的應用,需要的朋友可以參考下
    2023-09-09
  • Java Socket編程(四) 重復和并發(fā)服務器

    Java Socket編程(四) 重復和并發(fā)服務器

    Java Socket編程(四) 重復和并發(fā)服務器...
    2006-12-12
  • springboot配置log日志按天按類緩存實現(xiàn)過程

    springboot配置log日志按天按類緩存實現(xiàn)過程

    文章介紹了如何配置Spring Boot項目中的`application.yml`文件,并在同級目錄下創(chuàng)建`logback-spring.xml`文件以自定義日志設置,最后,展示了運行結果的圖示
    2026-01-01
  • Java String字符串補0或空格的實現(xiàn)代碼

    Java String字符串補0或空格的實現(xiàn)代碼

    這篇文章主要介紹了Java String字符串補0或空格的實現(xiàn)代碼,代碼簡單易懂,非常不錯,具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-09-09
  • Java中ASCII到十六進制的轉換指南

    Java中ASCII到十六進制的轉換指南

    在軟件開發(fā)、網(wǎng)絡通信與底層系統(tǒng)交互中,ASCII 字符與十六進制表示之間的轉換是一項基礎且高頻的操作,本文將從計算機編碼的底層邏輯出發(fā),結合 Java 平臺的特性,系統(tǒng)探討 ASCII 轉十六進制的核心機制、應用場景、設計考量與最佳實踐,需要的朋友可以參考下
    2026-05-05
  • 如何用Java的swing編寫簡單計算器

    如何用Java的swing編寫簡單計算器

    這篇文章主要給大家介紹了關于如何用Java的swing編寫簡單計算器的相關資料,通過本文可以設計一個圖形界面的簡易計算器,完成簡單的算術運算符,可以完成加法、減法、乘法、除法和取余運算,需要的朋友可以參考下
    2023-12-12
  • SpringMvc靜態(tài)資源訪問實現(xiàn)方法代碼實例

    SpringMvc靜態(tài)資源訪問實現(xiàn)方法代碼實例

    這篇文章主要介紹了SpringMvc靜態(tài)資源訪問實現(xiàn)方法代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08

最新評論

富阳市| 云梦县| 麦盖提县| 衡山县| 津市市| 罗江县| 乐昌市| 应城市| 衡山县| 麦盖提县| 岳池县| 兴和县| 同仁县| 灌云县| 油尖旺区| 郓城县| 礼泉县| 麻栗坡县| 游戏| 莱芜市| 镇平县| 长垣县| 阳山县| 铜山县| 津南区| 高台县| 西乌| 张家口市| 武乡县| 汾西县| 弥勒县| 武鸣县| 宿州市| 荃湾区| 利津县| 清水河县| 台北县| 齐河县| 碌曲县| 栾川县| 万山特区|