运维开发网

mybatis如何批量修改数据

运维开发网 https://www.qedev.com 2022-10-25 19:09 出处:网络
这篇文章主要介绍了mybatis如何批量修改数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

这篇文章主要介绍了mybatis如何批量修改数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


批量修改主要有两种方式


第一种

可以通过for循环逐个修改数据,这样会影响效率,所以我不推荐,这里就不多说了。


第二种

通过修改mybatis中的mapper.xml文件,如下所示:

lt;update id="updateRoleMenus" parameterType="java.util.List"gt; lt;foreach collection="list" item="item" index="index" open="" close="" separator=";"gt; update TB_ROLE_MENU lt;setgt; FID=#{item.fid} lt;/setgt; where ROLEID = #{item.roleid} lt;/foreachgt; lt;/updategt;


mysql及mybatis批量更新数据update


mysql批量更新update

使用case when语句,数据表如下:


案例1:

其中年龄不是空字段。Sql如下所示

update test1set age=casewhen id=2 then 1when id =3 then 2endwhere id in (2,3,4)

对于id为2、3和4的年龄字段,id 2的设置为1,ID 3的设置为2。结果是:

列lsquoagersquo不能为空。

原因是id=4与上面的when不匹配,所以会默认设置为空null。也就是说,不匹配的记录将不会保留其原始值,而是被设置为null。

案例2:

如果要设置默认值,可以写成:

update test1set age=casewhen id=2 then 1when id =3 then 2else 30endwhere id in (2,3,4)

结果是


可以看到id=4设置为30,即可以通过else default_value为不匹配的行设置默认值。

案例3:

如果要为不匹配的行设置原始值,可以编写如下内容:

update test1set age=casewhen id=2 then 1when id =3 then 2when id =4 then test1.ageendwhere id in (2,3,4)

这样,id=4的行可以通过test1.age保持原来的值,你可以在mybatis中看到这种写法的用处。


mybatis实现批量更新update

对应以上各种情况,编写xml。

通常,在编写代码时,有时不更新的字段不会在对象中设置。例如,Person对象有三个属性,即id、姓名和年龄,它们对应于数据库中的三个字段。如果不想更新id=4的年龄,通常不会设置age的值,即age=null,在case1中会被误设为null。有关详细信息,请参见以下代码。

案例1:

update test1lt;setgt;lt;trim prefix="age=case" suffix="end,"gt;lt;foreach collection="list" item="item" index="index"gt;lt;if test="item.age !=null"gt;when id=#{item.id} then #{item.age}lt;/ifgt;lt;/foreachgt;lt;/trimgt;lt;trim prefix="name=case" suffix="end,"gt;lt;foreach collection="list" item="item" index="index"gt;when id=#{item.id} then #{item.name}lt;/foreachgt;lt;/trimgt;lt;/setgt;where id inlt;foreach collection="list" item="item" index="index" separator="," open="(" close=")"gt;#{item.id}lt;/foreachgt;

当传入的列表中有三个person对象,分别对应id=2、3、4时,如果不想更新4的年龄,而只想更新4的名字,那么id=4的person对象的年龄将被设置为null。这样传入sql时,id=4的数据不会被when匹配,也不会设置默认值,所以会删除原始数据,设置为null。

案例2:

update test1lt;setgt;lt;trim prefix="age=case" suffix="end,"gt;lt;foreach collection="list" item="item" index="index"gt;lt;if test="item.age !=null"gt;when id=#{item.id} then #{item.age}lt;/ifgt;lt;/foreachgt;else 30lt;/trimgt;lt;trim prefix="name=case" suffix="end,"gt;lt;foreach collection="list" item="item" index="index"gt;when id=#{item.id} then #{item.name}lt;/foreachgt;lt;/trimgt;lt;/setgt;where id inlt;foreach collection="list" item="item" index="index" separator="," open="(" close=")"gt;#{item.id}lt;/foreachgt;

因为这段代码中设置了else 30,所以id=4的数据会更新为30,而不设置年龄。

案例3:

update test1lt;setgt;lt;trim prefix="age=case" suffix="end,"gt;lt;foreach collection="list" item="item" index="index"gt;lt;if test="item.age !=null"gt;when id=#{item.id} then #{item.age}lt;/ifgt;lt;if test="item.age ==null"gt;when id=#{item.id} then test1.agelt;/ifgt;lt;/foreachgt;lt;/trimgt;lt;trim prefix="name=case" suffix="end,"gt;lt;foreach collection="list" item="item" index="index"gt;when id=#{item.id} then #{item.name}lt;/foreachgt;lt;/trimgt;lt;/setgt;where id inlt;foreach collection="list" item="item" index="index" separator="," open="(" close=")"gt;#{item.id}lt;/foreachgt;

通过if标签,如果传递的属性为null,那么将保留数据库的原始值。

补充:

将多条数据的同一字段更新为相同的值:

UPDATE test1 SET age=24 WHERE id in(2,3,4);

以上个人经验,希望能给你一个参考

0

精彩评论

暂无评论...
验证码 换一张
取 消