Mybatis批量更新数据

本文介绍使用MyBatis实现数据库批量更新的两种方法。第一种方法适用于更新字段值相同的场景;第二种方法通过配置数据库连接允许多条SQL同时执行,适用于每条记录更新字段值不同的情况。

http://www.cnblogs.com/haimishasha/p/5697740.html

第一种方式

 

  1. <update id="updateBatch" parameterType="Map">    
  2.         update aa   set     
  3.             a=#{fptm},    
  4.             b=#{csoftrain}    
  5.         where c in     
  6.         <foreach collection="cs" index="index" item="item" pen="("separator=","close=")">    
  7.             #{item}    
  8.         </foreach>  
  9. </update>  


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

 

第二种方式

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

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

 

  1. <update id="batchUpdate"  parameterType="java.util.List">  
  2.         
  3.           <foreach collection="list" item="item" index="index" open="" close="" separator=";">  
  4.                 update test   
  5.                 <set>  
  6.                   test=${item.test}+1  
  7.                 </set>  
  8.                 where id = ${item.id}  
  9.          </foreach>  
  10.             
  11.     </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优先
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值