Mybatis批量更新数据

本文对比了两种SQL批量更新方法:一种是使用foreach遍历更新多个字段,另一种是设置允许多查询并执行多条SQL语句。讨论了每种方法的适用场景及优缺点。

第一种方式

<update id="updateBatch" parameterType="Map">  
        update aa   set   
            a=#{fptm},  
            b=#{csoftrain}  
        where c in   
        <foreach collection="cs" index="index" item="item" pen="("separator=","close=")">  
            #{item}  
        </foreach>
</update>

但是这种方式修改的字段值都是一样的。

第二种方式

修改数据库连接配置:&allowMultiQueries=true

比如:jdbc:mysql://192.168.1.236:3306/test?useUnicode=true&amp;characterEncoding=UTF-8&allowMultiQueries=true

<update id="batchUpdate"  parameterType="java.util.List">
      
          <foreach collection="list" item="item" index="index" open="" close="" separator=";">
                update test 
                <set>
                  test=${item.test}+1
                </set>
                where id = ${item.id}
         </foreach>
          
    </update>

这种方式,可以一次执行多条SQL语句
<think> 我们讨论MyBatis批量更新数据的几种常见方式。根据前面的对话,用户可能已经了解foreach方式生成多条SQL语句,但MyBatis还有其他批量更新方法。 我们需要覆盖主要的批量更新方案,并简要说明其适用场景和性能特点。 注意:最后必须按照要求输出3-5个相关问题。 常见批量更新方法: 1. 使用<foreach>生成多条UPDATE语句(如之前所示) 2. 使用ExecutorType.BATCH配合SqlSession 3. 使用CASE WHEN语句构建单条复杂SQL(适用于MySQL等) 4. 使用UNION ALL临时表更新(较少用,适用于特殊场景) 我们将重点介绍前三种,并给出示例代码。 </think> ### MyBatis批量更新数据实现方案 #### 核心方法比较 | **方法** | **实现原理** | **适用场景** | **性能** | |-----------------------|---------------------------------------|----------------------------------|--------------| | **foreach拼接SQL** | 生成多条独立UPDATE语句 | 中小批量(<1000条) | 中等 | | **BATCH执行器** | JDBC批处理提交 | 大批量更新(>5000条) | 最优 | | **CASE-WHEN动态SQL** | 单SQL通过条件分支更新多行 | 字段相同的批量更新 | 较快 | | **临时表关联更新** | 创建临时表JOIN更新 | 多表关联复杂更新 | 中等 | --- #### 1. foreach 批量更新(最常用) ```xml <update id="batchUpdate"> <foreach collection="list" item="item" separator=";"> UPDATE user SET name=#{item.name}, email=#{item.email} WHERE id=#{item.id} </foreach> </update> ``` **输出SQL:** ```sql UPDATE user SET name='A' WHERE id=1; UPDATE user SET name='B' WHERE id=2; ``` --- #### 2. BATCH执行器(高性能大批量) ```java try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) { UserMapper mapper = session.getMapper(UserMapper.class); for (User user : userList) { mapper.updateUser(user); // 单条update操作 } session.commit(); // 一次性提交所有操作 } ``` **优势:** - 减少数据库交互次数(1000次更新 → 1次网络请求) - 内存占用优化(JDBC批处理缓冲区) --- #### 3. CASE-WHEN动态更新MySQL/Oracle) ```xml <update id="batchUpdate"> 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> WHERE id IN <foreach collection="list" item="item" open="(" separator="," close=")"> #{item.id} </foreach> </update> ``` **输出SQL:** ```sql UPDATE user SET name = CASE WHEN id=1 THEN 'A' WHEN id=2 THEN 'B' END WHERE id IN (1,2) ``` --- #### 4. 临时表关联更新(PostgreSQL/SQL Server) ```xml <update id="batchUpdate"> WITH temp_data (id, name) AS ( VALUES <foreach collection="list" item="item" separator=","> (#{item.id}, #{item.name}) </foreach> ) UPDATE user u SET name = t.name FROM temp_data t WHERE u.id = t.id </update> ``` > **性能建议**: > - ≤500条:foreach方案 > - 500~10000条:BATCH执行器 > - >10000条:分批次+BATCH执行器 > - 字段统一更新:CASE-WHEN优先
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值