第一种写法:一条记录update一次,性能比较差,容易造成阻塞。
<update id="updateBatch" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
update course
<set>
name=${item.name},
title=${item.title},
</set>
where id = ${item.id}
</foreach>
</update>
第二种mybatis写法,foreach + case when
<update id="updateBatch" parameterType="list">
update course
<trim prefix="set" suffixOverrides=",">
<trim prefix="name =case" suffix="end,">
<foreach collection="list" item="item" index="index">
when id=#{item.id} then #{item.name}
</foreach>
</trim>
<trim prefix="title =case" suffix="end,">
<foreach collection="list" item="item" index="index">
when id=#{item.id} then #{item.title}
</foreach>
</trim>
</trim>
where
id IN
<foreach collection="list" item="item" index="index" separator="," open="(" close=")>
#{item.id}
</foreach>
</update>
-- 转换为sql:
UPDATE course
SET name = CASE id
WHEN 1 THEN 'name1'
WHEN 2 THEN 'name2'
WHEN 3 THEN 'name3'
END,
title = CASE id
WHEN 1 THEN 'New Title 1'
WHEN 2 THEN 'New Title 2'
WHEN 3 THEN 'New Title 3'
END
WHERE id IN (1,2,3)
第三种写法:使用临时表联表更新
<update id="updateBatch">
update course,
(
<foreach item="item" collection="list" separator=" UNION ALL ">
select #{item.id} as id, #{item.name} as name, #{item.title} as title
</foreach>
) temp_course
set
course.name = temp_course.name,
course.title = temp_course.title
where course.id = temp_course.id
</update>
-- 转为sql :
update
wms_use_stock course,
(
select
1 as id,
'name_1' as name ,
'title_1' as title
UNION ALL
select
2 as id,
'name_2' as name ,
'title_2' as title
) temp_course
set
course.name = temp_course.name,
course.title = temp_course.title
where course.id = temp_course.id