成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MyBatis 批量更新實現技術解析

開發 開發工具
在企業級應用開發中,數據的批量處理是常見需求。當面對需要同時更新多條數據記錄的場景時,使用MyBatis實現批量更新可以有效提升數據處理效率,減少數據庫交互次數。

前言

在企業級應用開發中,數據的批量處理是常見需求。當面對需要同時更新多條數據記錄的場景時,使用MyBatis實現批量更新可以有效提升數據處理效率,減少數據庫交互次數。

實現方式

循環單條更新

@Service
public class UserServiceImpl implements UserService {
    
    @Autowired
    private UserMapper userMapper;
    
    @Transactional
    public void batchUpdate(List<User> userList) {
        for (User user : userList) {
            userMapper.updateUser(user);
        }
    }
}

對應的XML映射文件:

<update id="updateUser" parameterType="com.example.entity.User">
  UPDATE user
  SET username = #{username},
      age = #{age},
      email = #{email}
  WHERE id = #{id}
</update>
  • 優點:實現簡單,無需特殊配置;單條SQL結構清晰,易于調試。
  • 缺點:性能較差,每執行一次更新都要與數據庫建立一次連接,數據庫通信開銷大;對于大數據量操作,事務管理壓力大。
  • 適用場景:數據量較小(幾十條以內)、對性能要求不高的場景。

原生saveOrUpdateBatch

default boolean saveOrUpdateBatch(Collection<T> entityList) {
    return this.saveOrUpdateBatch(entityList, 1000);
}
public static <E> boolean executeBatch(Class<?> entityClass, Log log, Collection<E> list, int batchSize, BiConsumer<SqlSession, E> consumer) {
    Assert.isFalse(batchSize < 1, "batchSize must not be less than one", new Object[0]);
    return !CollectionUtils.isEmpty(list) && executeBatch(entityClass, log, (sqlSession) -> {
        int size = list.size();
        int i = 1;

        for(Iterator var6 = list.iterator(); var6.hasNext(); ++i) {
            E element = var6.next();
            consumer.accept(sqlSession, element);
            if (i % batchSize == 0 || i == size) {
                sqlSession.flushStatements();
            }
        }

    });
}

最終來到了executeBatch()方法,可以看到這很明顯是在一條一條循環更新,通過sqlSession.flushStatements()將一個個單條插入的update語句分批次進行提交,而且是同一個sqlSession,這相比遍歷集合循環update來說有一定的性能提升,但是這并不是sql層面真正的批量插入。

使用 foreach 標簽拼接 SQL

<update id="batchUpdateUser" parameterType="java.util.List">
  <foreach collection="list" item="item" separator=";">
    UPDATE user
    SET username = #{item.username},
        age = #{item.age},
        email = #{item.email}
    WHERE id = #{item.id}
  </foreach>
</update>

注意事項:需要在數據庫連接配置中添加allowMultiQueries=true參數,以支持多條SQL語句的執行

  • 優點:只需一次數據庫連接,減少了通信開銷,性能明顯優于循環單條更新。
  • 缺點:SQL語句長度隨數據量增長,可能達到數據庫限制。
  • 適用場景:數據量中等(幾百條)、數據庫支持多語句執行的場景。

使用 Case When 結構

<update id="batchUpdateUser" parameterType="java.util.List">
  UPDATE user
  SET 
    username = CASE
      <foreach collection="list" item="item">
        WHEN id = #{item.id} THEN #{item.username}
      </foreach>
    END,
    age = CASE
      <foreach collection="list" item="item">
        WHEN id = #{item.id} THEN #{item.age}
      </foreach>
    END,
    email = CASE
      <foreach collection="list" item="item">
        WHEN id = #{item.id} THEN #{item.email}
      </foreach>
    END
  WHERE id IN
  <foreach collection="list" item="item" open="(" separator="," close=")">
    #{item.id}
  </foreach>
</update>
  • 優點:一條SQL語句完成所有更新,數據庫只需要解析一次SQL,執行效率高;事務原子性得到保證;大多數數據庫都支持這種語法。
  • 缺點:SQL結構復雜,可讀性較差;SQL 語句長度隨數據量增長,可能達到數據庫限制。
  • 適用場景:數據量中等偏大(幾千條)、需要保證事務原子性的場景。

使用 ExecutorType.BATCH

public void batchUpdate(List<User> userList) {
    SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    try {
        for (User user : userList) {
            userMapper.update(user);
        }
        sqlSession.commit();
    } catch (Exception e) {
        sqlSession.rollback();
        throw e;
    } finally {
        sqlSession.close();
    }
}
  • 優點:性能最高,尤其是在處理大量數據時。
  • 缺點:代碼復雜度較高,需要手動管理SqlSession和事務。
  • 適用場景:數據量中等偏大(幾千條)、需要保證事務原子性的場景

總結

方式

性能

適用場景

優點

缺點

foreach 拼接多個 UPDATE

中等

數據量較小,數據庫支持多語句執行

實現簡單,直觀易懂

需要數據庫支持多語句,SQL 語句可能過長

CASE WHEN 語句

較高

數據規則,更新字段較少

只執行一條 SQL,減少數據庫交互

SQL 復雜度高,可讀性差

ExecutorType.BATCH

最高

數據量大,對性能要求高

性能最優

代碼復雜度高,需要手動管理事務


責任編輯:武曉燕 來源: 一安未來
相關推薦

2009-09-24 09:45:23

Hibernate批量

2009-09-25 11:34:54

Hibernate處理Hibernate批量

2025-02-10 00:14:00

2011-05-24 11:28:20

OTN光交叉

2021-09-27 07:56:41

MyBatis Plu數據庫批量插入

2011-04-29 09:15:10

Ubuntu 11.0

2024-07-31 09:56:20

2009-09-17 13:44:19

2021-07-27 22:30:15

Windows 11Windows微軟

2013-10-30 09:45:48

Zigbee藍牙無線

2022-09-29 10:06:56

SQLMySQL服務端

2009-06-03 10:02:53

Hibernate批量刪除

2010-02-23 09:33:39

Hibernate批量Hibernate批量

2011-05-26 15:53:59

數據庫更新維護

2023-07-26 07:18:54

死鎖線程池

2012-04-13 13:58:52

數據加密

2011-04-02 11:02:24

2024-09-24 10:41:57

MyBatis編程

2009-06-12 14:44:30

Hibernate A批量更新

2021-10-13 20:17:07

微軟Windows 11Windows
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人在线播放网站 | 免费观看一级黄色录像 | www成人啪啪18| 午夜久久久 | 亚洲精品久久久久久久久久久久久 | 国产91视频一区二区 | 91视频91| 一级日批片 | 在线免费观看视频黄 | 久久综合影院 | 精品综合久久久 | 粉嫩av久久一区二区三区 | 超碰精品在线 | 久久久久久久久91 | 91在线视频网址 | 国产久 | 免费同性女女aaa免费网站 | 麻豆久久久9性大片 | 精品成人佐山爱一区二区 | 四虎在线播放 | 成人国产在线观看 | 香蕉久久av | 91中文| 91精品一区二区三区久久久久 | 欧美三级电影在线播放 | 免费看一区二区三区 | 97超碰中文网 | 成人黄色电影在线观看 | 国产一区二区精品在线 | 成人av资源在线 | 久久欧美高清二区三区 | 1区2区视频 | 在线观看国产视频 | 北条麻妃一区二区三区在线观看 | 久久亚洲天堂 | 桃花av在线 | 日韩综合一区 | 中文字幕在线一区二区三区 | 久久99精品国产 | av在线黄 | 国产精品美女久久久久aⅴ国产馆 |