亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Mybatis中進行批量修改的方法小結

 更新時間:2025年08月07日 08:21:18   作者:熊貓片沃子  
我們在使用?Mybatis?框架進行實現(xiàn)數(shù)據(jù)庫操作的時候,通常會遇到一些需要進行批量修改的方式,本文對常見的?Mybatis?批量修改方法并進行了總結,希望對大家有所幫助

我們在使用 Mybatis 框架進行實現(xiàn)數(shù)據(jù)庫操作的時候,通常會遇到一些需要進行批量修改的方式,不同的方式可適用不同的場景,也會出現(xiàn)一些優(yōu)缺點。本文常見的 Mybatis 批量修改方法并進行總結:

1. 循環(huán)修改

通過 Java 循環(huán)調用單個 update 語句實現(xiàn)批量修改,不考慮性能,最簡單,最偷懶的方式。

Mapper 接口

void updateUser(User user);

XML 映射

<update id="updateUser">
    UPDATE user 
    SET name = #{name}, age = #{age}
    WHERE id = #{id}
</update>

Service中調用

for (User user : userList) {
    userMapper.updateUser(user);
}

特點

  • 實現(xiàn)簡單,易于理解和維護
  • 性能差(需要多次進行數(shù)據(jù)庫連接和交互)
  • 適用于數(shù)據(jù)量極小的場景

2. 使用 MyBatis 的 foreach 標簽構建批量修改SQL

通過 foreach 標簽動態(tài)生成批量更新語句。

Mapper 接口

void batchUpdate(@Param("list") List<User> userList);

XML 映射

<update id="batchUpdate">
    UPDATE user 
    SET name = CASE
        <foreach collection="list" item="item" index="index">
            WHEN id = #{item.id} THEN #{item.name}
        </foreach>
    END,
    age = CASE
        <foreach collection="list" item="item" index="index">
            WHEN id = #{item.id} THEN #{item.age}
        </foreach>
    END
    WHERE id IN
    <foreach collection="list" item="item" separator="," open="(" close=")">
        #{item.id}
    </foreach>
</update>

特點

  • 一次數(shù)據(jù)庫連接完成批量操作
  • SQL 語句長度隨數(shù)據(jù)量增長,有可能超過數(shù)據(jù)庫限制
  • 適用于中等數(shù)據(jù)量(建議不超過 1000 條)

3. 多條 SQL 語句批量執(zhí)行

在一條 SQL 中包含多個 update 語句,用分號分隔。 Mapper 接口

void batchUpdateMultiSQL(@Param("list") List<User> userList);

XML 映射

<update id="batchUpdateMultiSQL">
    <foreach collection="list" item="item" separator=";">
        UPDATE user 
        SET name = #{item.name}, age = #{item.age}
        WHERE id = #{item.id}
    </foreach>
</update>

注意:進行這個操作的時候,需要在數(shù)據(jù)庫連接 URL 中添加 allowMultiQueries=true 參數(shù)(以 MySQL 為例)。

特點

  • 實現(xiàn)簡單,SQL 語句清晰
  • 同樣存在 SQL 長度限制問題
  • 部分數(shù)據(jù)庫可能不支持(需數(shù)據(jù)庫特性支持)

4. 使用 BatchExecutor(MyBatis 批量執(zhí)行器)

配置 MyBatis 執(zhí)行器為 BATCH 模式,主要作用是累積所有Sql語句進行一次性執(zhí)行的操作。

實現(xiàn)方式

SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
UserMapper userMapper = session.getMapper(UserMapper.class);

for (User user : userList) {
    userMapper.updateUser(user);
}

session.commit();
session.close();

特點

  • MyBatis 內部優(yōu)化的批量處理方式
  • 減少網絡交互和事務提交次數(shù)
  • 內存占用可能較高(需注意批量大?。?/li>
  • 適用于大數(shù)據(jù)量批量操作

5. 使用數(shù)據(jù)庫特定的批量更新語法

某些數(shù)據(jù)庫提供了專有的批量更新語法,如 PostgreSQL 的 UPDATE ... FROM 語法。

PostgreSQL 示例

<update id="batchUpdatePostgreSQL">
    UPDATE user u
    SET name = c.name, age = c.age
    FROM (
        VALUES
        <foreach collection="list" item="item" separator=",">
            (#{item.id}, #{item.name}, #{item.age})
        </foreach>
    ) AS c(id, name, age)
    WHERE u.id = c.id
</update>

特點

  • 性能好,充分利用數(shù)據(jù)庫特性
  • 數(shù)據(jù)庫兼容性差,移植性低
  • 適用于固定使用特定數(shù)據(jù)庫的場景

方法比較總結

方法優(yōu)點缺點適用場景
循環(huán)修改簡單直觀,易于調試性能差,多次交互數(shù)據(jù)量極小(<10 條)
foreach 構建 CASE 語句一次交互,兼容性好SQL 長度有限制中等數(shù)據(jù)量(<1000 條)
多條 SQL 語句批量執(zhí)行實現(xiàn)簡單,SQL 清晰需數(shù)據(jù)庫支持,有長度限制數(shù)據(jù)量較小,且數(shù)據(jù)庫支持
BatchExecutor性能好,MyBatis 原生支持內存占用高,需手動管理會話大數(shù)據(jù)量批量操作
數(shù)據(jù)庫特定語法性能最優(yōu),利用數(shù)據(jù)庫特性兼容性差,移植性低固定數(shù)據(jù)庫,追求極致性能

個人建議

數(shù)據(jù)量小時(<100 條),優(yōu)先考慮 foreach 構建 CASE 語句。

數(shù)據(jù)量大時(>1000 條),建議使用 BatchExecutor 并分批處理(每批 500-1000 條)。

考慮數(shù)據(jù)庫特性,如果項目固定使用某一數(shù)據(jù)庫,可采用其專有的批量語法。

避免循環(huán)單次修改,除非數(shù)據(jù)量極小且對性能無要求。

最主要一點,選擇合適的批量修改方式需綜合考慮數(shù)據(jù)量大小、數(shù)據(jù)庫類型、性能要求和代碼可維護性等因素。

到此這篇關于Mybatis中進行批量修改的方法小結的文章就介紹到這了,更多相關Mybatis批量修改內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java+opencv3.2.0實現(xiàn)hough直線檢測

    Java+opencv3.2.0實現(xiàn)hough直線檢測

    這篇文章主要為大家詳細介紹了Java+opencv3.2.0之hough直線檢測,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 隱藏idea的.idea和.mvn文件的解決方案

    隱藏idea的.idea和.mvn文件的解決方案

    這篇文章主要介紹了隱藏idea的.idea和.mvn文件的解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Centos7.3下jre1.8安裝和配置教程

    Centos7.3下jre1.8安裝和配置教程

    這篇文章主要為大家詳細介紹了Centos7.3下jre1.8安裝和配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Jackson使用示例-Bean、XML、Json之間相互轉換

    Jackson使用示例-Bean、XML、Json之間相互轉換

    Jackson是一個強大工具,可用于Json、XML、實體之間的相互轉換,JacksonXmlElementWrapper用于指定List等集合類,外圍標簽名,JacksonXmlProperty指定包裝標簽名,或者指定標簽內部屬性名,JacksonXmlRootElement指定生成xml根標簽的名字,JacksonXmlText指定當前這個值
    2024-05-05
  • java自定義任務類定時執(zhí)行任務示例 callable和future接口使用方法

    java自定義任務類定時執(zhí)行任務示例 callable和future接口使用方法

    Callable是類似于Runnable的接口,實現(xiàn)Callable接口的類和實現(xiàn)Runnable的類都是可被其它線程執(zhí)行的任務
    2014-01-01
  • 舉例講解設計模式中的訪問者模式在Java編程中的運用

    舉例講解設計模式中的訪問者模式在Java編程中的運用

    這篇文章主要介紹了舉例講解設計模式中的訪問者模式在Java編程中的運用,訪問者模式是一種將算法與對象結構分離的軟件設計模式,需要的朋友可以參考下
    2016-05-05
  • MyBatis-Plus 如何單元測試的實現(xiàn)

    MyBatis-Plus 如何單元測試的實現(xiàn)

    這篇文章主要介紹了MyBatis-Plus 如何單元測試的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Java將word文件轉成pdf文件的操作方法

    Java將word文件轉成pdf文件的操作方法

    這篇文章主要介紹了Java將word文件轉成pdf文件的操作方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • 在springboot中對kafka進行讀寫的示例代碼

    在springboot中對kafka進行讀寫的示例代碼

    本篇文章主要介紹了在springboot中對kafka進行讀寫的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java設計模式之策略模式詳解和示例

    Java設計模式之策略模式詳解和示例

    這篇文章主要介紹了Java設計模式之策略模式詳解和示例,策略模式就是一種行為可能會因為不同的邏輯造成多個算法,比如人吃飯,美國人吃飯用刀叉,中國吃飯用筷子,都是吃飯的行為但是使用的工具(算法)不一樣,需要的朋友可以參考下
    2024-01-01

最新評論