mybatis 批量更新数据 mysql
方式1
简单粗暴,写一个更新的方法,循环调用就是了,但是效率就比较低了。性能较差。
方式2
批处理,类似于:
UPDATE stu SET name='jia' ,score=213 WHERE id =1;
UPDATE stu SET name='jia2' ,score=456 WHERE id =2;
UPDATE stu SET name='jia3',score=222 WHERE id =3
xml文件这样写
<update id="test">
<foreach separator=";" collection="list" item="s" index="index">
update stu
<set>
name=#{s.name},score=#{s.score}
</set>
where id =#{s.id}
</foreach>
</update>
打印的sql像这样
==> Preparing: update stu SET name=?,score=? where id =? ; update stu SET name=?,score=? where id =? ; update stu SET name=?,score=? where id =?
==> Parameters: jias1(String), 123(Integer), 1(Integer), jias2(String), 123(Integer), 2(Integer), jias3(String), 123(Integer), 3(Integer)
<== Updates: 1
但Mybatis映射文件中的sql语句默认是不支持以" ; " 结尾的,也就是不支持多条sql语句的执行。所以需要在连接mysql的url上加 &allowMultiQueries=true 这个才可以执行。
方式3
mysql没有提供批量更新的方式,但是可以通过一些技巧实现,例如
UPDATE stu SET
name = CASE id
WHEN 1 THEN 'jiajia'
WHEN 2 THEN 'wanghusai'
WHEN 3 THEN 'wangha'
END,
score = CASE id
WHEN 1 THEN 12.3
WHEN 2 THEN 52.2
WHEN 3 THEN 33.2
END
WHERE id IN (1,2,3)
xml配置文件可以这样实现
<update id="test2">
update stu
set name=
<foreach collection="list" item="item" index="index" separator=" " open="case id" close="end">
when #{item.id} then #{item.name}
</foreach>
,score=
<foreach collection="list" item="item" index="index" separator=" " open="case id" close="end">
when #{item.id} then #{item.score}
</foreach>
where id in
<foreach collection="list" index="index" item="item" separator="," open="(" close=")">
#{item.id}
</foreach>
</update>
打印的sql语句就是这样:
==> Preparing: update stu set name= case id when ? then ? when ? then ? when ? then ? end ,score= case id when ? then ? when ? then ? when ? then ? end where id in ( ? , ? , ? )
==> Parameters: 1(Integer), jias1(String), 2(Integer), jias2(String), 3(Integer), jias3(String), 1(Integer), 123(Integer), 2(Integer), 123(Integer), 3(Integer), 123(Integer), 1(Integer), 2(Integer), 3(Integer)
<== Updates: 3