mybatis如何批量修改数据

 更新时间:2022年03月14日 11:47:39   作者:白雪茫茫  
这篇文章主要介绍了mybatis如何批量修改数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

批量修改主要有两种方式

第一种

可以通过for循环一条一条修改数据,这样会影响效率,因此我不推荐,所以在这里我也不多说。

第二种

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

<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 = #{item.roleid} 
      </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,则保持数据库原值。

补充:

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

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java多态(动力节点Java学院整理)

    Java多态(动力节点Java学院整理)

    多态是指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。接下来通过本文给大家介绍java多态相关知识,感兴趣的朋友一起学习吧
    2017-04-04
  • 使用restTemplate.postForEntity()的问题

    使用restTemplate.postForEntity()的问题

    这篇文章主要介绍了使用restTemplate.postForEntity()的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • mybatis报错 resultMapException的解决

    mybatis报错 resultMapException的解决

    这篇文章主要介绍了mybatis报错 resultMapException的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java动态添加view的方法

    Java动态添加view的方法

    这篇文章主要介绍了Java动态添加view的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-01-01
  • Java并发编程之Semaphore详解

    Java并发编程之Semaphore详解

    这篇文章主要介绍了Java并发编程之concurrent包中的Semaphore详解,信号量Semaphore一般用来表示可用资源的个数,相当于一个计数器,可类比生活中停车场牌子上面显示的停车场剩余车位数量,需要的朋友可以参考下
    2023-12-12
  • 使用Backoff策略提高HttpClient连接管理的效率

    使用Backoff策略提高HttpClient连接管理的效率

    这篇文章主要为大家介绍了Backoff策略提高HttpClient连接管理的效率使用解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • SpringBoot集成netty实现websocket通信功能

    SpringBoot集成netty实现websocket通信功能

    Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端,WebSocket 是一种网络通信协议,相比传统的HTTP协议,本文给大家介绍了SpringBoot集成netty实现websocket通信功能,需要的朋友可以参考下
    2024-03-03
  • Spring Boot管理用户数据的操作步骤

    Spring Boot管理用户数据的操作步骤

    SpringBoot结合Thymeleaf模板引擎,可以快速搭建Web应用,介绍了使用SpringBoot处理JSON数据的基本过程,包括创建实体类、视图页面和控制器,通过这些步骤,即可完成基于SpringBoot和Thymeleaf的简单Web开发,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • 新手了解java 类,对象以及封装基础知识

    新手了解java 类,对象以及封装基础知识

    JS是一门面向对象语言,其对象是用prototype属性来模拟的,本文介绍了如何封装JS对象,具有一定的参考价值,下面跟着小编一起来看下吧,希望对你有所帮助
    2021-07-07
  • Java continue break制作简单聊天室程序

    Java continue break制作简单聊天室程序

    这篇文章主要为大家详细介绍了Java continue break制作简单聊天室程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10

最新评论