Mybatis批量更新数据

批量传参样例:

[{"sid": "111", "createTime": "2025-03-11 09:12:00", "pbilId": "pbil_id_111"}, 
{"sid": "222", "createTime": "2025-03-11 09:13:00", "pbilId": "pbil_id_222"}, 
{"sid": "333", "createTime": "2025-03-11 09:14:00", "pbilId": "pbil_id_333"},
{"sid": "444", "createTime": "2025-03-11 09:15:00", "pbilId": "pbil_id_444"},
{"sid": "555", "createTime": "2025-03-11 09:16:00", "pbilId": "pbil_id_555"}]

批量更新语句:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhongbao.alarm.mapper.alarm.AlarmAllMapper">

<update id="updateTTestBatch" parameterType="java.util.List">
	update  T_test
	<set>
	    <trim prefix="create_time = case" suffix="end,">
	        <foreach collection="list" item="item" index="index">
	            <if test="item.createTime != null">
	                when sid=#{item.sid} then cast(#{item.createTime} as timestamp)
	            </if>
	        </foreach>
	    </trim>
		<trim prefix="pbil_id = case" suffix="end,">
	        <foreach collection="list" item="item" index="index">
	            <if test="item.pbilId != null">
	                when sid=#{item.sid} then #{item.pbilId}
	            </if>
	        </foreach>
	    </trim>
	</set>
	where sid in
	<foreach collection="list" separator="," item="item" open="(" close=")">
	    #{item.sid}
	</foreach>
</update>
</mapper>

上述sql语句翻译过来即是

update  T_test		
set	
    create_time = case
					when sid='111' then cast('2025-03-11 09:12:00' as timestamp)
					when sid='222' then cast('2025-03-11 09:13:00' as timestamp)
					when sid='333' then cast('2025-03-11 09:14:00' as timestamp)
					when sid='444' then cast('2025-03-11 09:15:00' as timestamp)
					when sid='555' then cast('2025-03-11 09:16:00' as timestamp)
	              end,
	pbil_id = case
				when sid='111' then 'pbil_id_111'
				when sid='222' then 'pbil_id_222'
				when sid='333' then 'pbil_id_333'
				when sid='444' then 'pbil_id_444'
				when sid='555' then 'pbil_id_555'
			  end
where sid in (
	'111', '222', '333', '444', '555'
)	

表结构如下

create table T_test (

	id  		serial,
	sid  		varchar(32),
	create_time timestamp,
	pbil_id  	varchar(32)
)
<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优先
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值