mybatis如何批量修改数据
⽬录
批量修改主要有两种⽅式
第⼀种
第⼆种
mysql及mybatis批量更新数据update
mysql批量更新update
mybatis实现批量更新update
批量修改主要有两种⽅式
第⼀种
可以通过for循环⼀条⼀条修改数据,这样会影响效率,因此我不推荐,所以在这⾥我也不多说。
第⼆种
通过修改mybatis中l⽂件,如下:
<update id="updateRoleMenus" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
update TB_ROLE_MENU
<set>
FID=#{item.fid}
</set>
where ROLEID = #{leid}
</foreach>
</update>
mysql及mybatis批量更新数据update
mysql批量更新update
使⽤case when语句,数据表如下:
case1:
其中age为⾮空字段。sql如下
update test1
set age=case
when id=2 then 1
when id =3 then 2
end
where id in (2,3,4)
对id为2,3,4的设置age字段,id为2的设置为1,3的设置为2,结果为:
Column ‘age’ cannot be null.
原因是由于id=4没有被上⾯的when匹配到,因此会被默认设为空null。即未被匹配到的记录并不会保持原来的数值,⽽是会被设置为null。
case2:
如果想设默认值,可写为:
update test1
set age=case
when id=2 then 1
when id =3 then 2
else 30
end
where id in (2,3,4)
结果是
可见id=4的设为了30,也就是通过else default_value可以对未被匹配到的⾏设置默认值。
case3:
如果想对未匹配到的⾏设置未原来的值,则可写为:
update test1
set age=case
when id=2 then 1
when id =3 then 2
when id =4 then test1.age
end
where id in (2,3,4)
这样就可以通过test1.age来使id=4的⾏保持原值。在mybatis中可看到这种写法的⽤处。
mybatis实现批量更新update
对应上⾯的各种case,来写xml。
通常在写代码的时候,有时候不更新的字段就不会设置到对象⾥,⽐如Person对象分别有id,name,age三个属性对应数据库的三个字段,如果不想更新id=4的age时,就通常不设置age的值,也就是age=null,这样在case1⾥,就会被误设为null,详细见如下代码。
case1:
update test1
<set>
<trim prefix="age=case" suffix="end,">
<foreach collection="list" item="item" index="index">
<if test="item.age !=null">
when id=#{item.id} then #{item.age}
</if>
</foreach>
</trim>
<trim prefix="name=case" suffix="end,">
<foreach collection="list" item="item" index="index">
when id=#{item.id} then #{item.name}
</foreach>
</trim>
</set>
where id in
<foreach collection="list" item="item" index="index" separator="," open="(" close=")">
#{item.id}
</foreach>
当传⼊的list中person对象有三个,分别对应id=2,3,4,若不想更新4的age,⽽只想更新4的姓名,则id=4的person对象age 就会被设为null,这样传⼊该sql时,id=4的数据不会被when匹配,⽽⼜没有设置默认值,则原数据会被删除并设为null。
case2:
update test1
<set>
<trim prefix="age=case" suffix="end,">
<foreach collection="list" item="item" index="index">
<if test="item.age !=null">
when id=#{item.id} then #{item.age}
</if>
</foreach>
else 30
</trim>
<trim prefix="name=case" suffix="end,">
<foreach collection="list" item="item" index="index">
when id=#{item.id} then #{item.name}
</foreach>
</trim>
</set>
where id in
<foreach collection="list" item="item" index="index" separator="," open="(" close=")">
#{item.id}
</foreach>
该代码由于设置了else 30,因此会id=4的数据在不设置age的情况下会被更新为30。
case3:
update test1
<set>
<trim prefix="age=case" suffix="end,">
<foreach collection="list" item="item" index="index">
<if test="item.age !=null">
when id=#{item.id} then #{item.age}
</if>
<if test="item.age ==null">
when id=#{item.id} then test1.age
</if>
</foreach>
</trim>
<trim prefix="name=case" suffix="end,">
<foreach collection="list" item="item" index="index">
when id=#{item.id} then #{item.name}
</foreach>
</trim>
</set>
where id in
<foreach collection="list" item="item" index="index" separator="," open="(" close=")">
#{item.id}
</foreach>
通过if标签,若传⼊的属性为null,则保持数据库原值。
补充:批量更新sql语句
更新多条数据同⼀字段为同⼀值:
UPDATE test1 SET age=24 WHERE id in(2,3,4);
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论