Mybatis 动态批量修改
封面:学校夜景
xdm,祝大家节日快乐!!
今天听《路过人间》演唱会Live限定版,爱上了一句歌词。
说来惭愧,人对爱只学会,视死如归。
1.业务需求
如下:
前台传给我一个 documentId和List<UpdateDocumentAnswer> 对象给我。
执行条件:通过这个documentId和List<UpdateDocumentAnswer>中对UpdateDocumentAnswer.id,修改document_answer表的数据。
简单说:就是希望通过一条update语句,根据不同的条件改变多条需要改变的数据。

思考一:
我们先按照我们最简单的思维思考:
即拆成一句一句执行,for循环执行多条 update 语句。
update document_answer set where document_id=#{documentId} and id=#{answer.id}
这样写的话,我们的mapper层接收的参数,应该为:
int patchByDocumentId(@Param("documentId") Long documentId,@Param("answers") UpdateDocumentAnswer answers);
实现是可以实现的,但是因为需要执行多条update语句,效率是真的不敢恭维。
如果大家有尝试过,都会知道,for循环执行sql语句是真的要不得的。一条普通的sql,我们都要优化完再优化,更别说一个方法要执行多条sql语句了。
所有就啥勒??

推荐大家使用 百度、Bing、Google进行搜索
我们想到过这种问题,大概率别人也会遇上的,搜一搜,确实有答案低。
所以我们接着进入思考二吧。
思考二:
还记得文章前面所说:就是希望通过一条update语句,根据不同的条件改变多条需要改变的数据。
我们直接 搜怎么一条update用不同条件修改多条数据勒
就是会搜到一个下面的这样的sql语句。
update 表名 set
列1=
case
when 条件1 then 值1
when 条件2 then 值2 end,
列2=
case
when 条件1 then 值1
when 条件2 then 值2 end,
where 条件
说实话,看到这条语句的那一刻,感觉自己又没有学过mysql了,连crud工程师都算不上(捂脸)。
解释:
我们要 修改列1, 当when 条件1 满足时,则将 列1 修改为 then 后面跟着的 值1,when 条件2 满足,则将列1修改为then 后面跟着的值2。
这样一样,我们就可以执行多条语句了啊。
2.实现
我们将之前的mapper层的接口传入的参数做一下更改。
int patchByDocumentId(@Param("documentId") Long documentId,@Param("answers") List<UpdateDocumentAnswer> answers);
mapper.xml的实现如下:
<update id="patchByDocumentId">
update document_answer
<set>
<trim prefix="template_question_id = case" suffix="end,">
<foreach collection="answers" item="answer">
<if test="answer.templateQuestionId != null">
when id=#{answer.id} then #{answer.templateQuestionId}
</if>
</foreach>
</trim>
<trim prefix="answer = case" suffix="end,">
<foreach collection="answers" item="answer">
<if test="answer.answer != null">
when id=#{answer.id} then #{answer.answer}
</if>
</foreach>
</trim>
<trim prefix="comments = case" suffix="end,">
<foreach collection="answers" item="answer">
<if test="answer.comments != null">
when id=#{answer.id} then #{answer.comments}
</if>
</foreach>
</trim>
</set>
<where>
document_id=#{documentId}
<if test="answers != null">
and id in
<foreach collection="answers" separator="," item="answer" open="(" close=")">
#{answer.id}
</foreach>
</if>
</where>
</update>
生成的sql日志
update document_answer
SET
template_question_id =
case
when id=? then ?
when id=? then ? end,
answer =
case
when id=? then ?
when id=? then ? end,
comments =
case
when id=? then ?
when id=? then ? end
WHERE document_id=? and id in ( ? , ? )
换上我们想要的值:
update document_answer
SET
template_question_id =
case
when id=1 then 2
when id=1 then 3 end,
answer =
case
when id=1 then '内容1'
when id=2 then '内容2' end,
comments =
case
when id=1 then '评论1'
when id=2 then '评论2' end
WHERE document_id=2 and id in ( 1 , 2 )
执行规则: 上面这种方式,更新的记录的数量取决于list集合的数量,且每条记录中的值和对应记录的ID是一一对应的。
结束了,周日更文一篇。
后语
我们一起加油吧
你好,我是博主
宁在春:主页希望本篇文章能让你感到有所收获!!!
祝
我们:待别日相见时,都已有所成。欢迎大家一起讨论问题,躺了
Mybatis 动态批量修改的更多相关文章
- MySQL+MyBatis下批量修改数据的问题
今天处理数据批量的更新,场景是这样子的,web站管理的字典功能,需要添加一个记录的整体描述,以及详细内容的描述.一个字典整体概述只有一组信息,但是其详细内容,会有很多项,不确定. 这个场景,在关系型数 ...
- MyBatis动态批量插入、更新Mysql数据库的通用实现方案
一.业务背景 由于需要从A数据库提取大量数据同步到B系统,采用了tomikos+jta进行分布式事务管理,先将系统数据源切换到数据提供方,将需要同步的数据查询出来,然后再将系统数据源切换到数据接收方, ...
- MyBatis批量修改操作
1.需求 后台管理页面,查询频道列表,需要批量修改频道的状态,批量上线和下线 2.MyBatis配置 这是mysql的配置,注意需要加上&allowMultiQueries=true配置 jd ...
- Sql批量添加,批量查询,批量删除,批量修改。mybatis都有对应标签
Sql批量添加,批量查询,批量删除,批量修改.mybatis都有对应标签
- mybatis批量修改
使用mybats经常要用到批量修改或者删除,贴出批量修改的代码.如果是批量删除,可将update换成delete. <update id="changestatus" par ...
- mybatis 批量新增-批量修改-批量删除操作
mapper.xml <!-- 批量新增 --> <insert id="saveBatch" parameterType="java.util.Lis ...
- 161102、MyBatis中批量插入
方法一: <insert id="insertbatch" parameterType="java.util.List"> <selectKe ...
- 超全MyBatis动态SQL详解!( 看完SQL爽多了)
MyBatis 令人喜欢的一大特性就是动态 SQL. 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的. MyBatis 动态 SQL 的出现, 解决了这个麻烦. My ...
- MyBatis动态SQL(认真看看, 以后写SQL就爽多了)
目录 0 一起来学习 mybatis 1 数据准备 2 if 标签 2.1 在 WHERE 条件中使用 if 标签 2.1.1 查询条件 2.1.2 动态 SQL 2.1.3 测试 2.2 在 UPD ...
随机推荐
- 20210808 Hunter,Defence,Connect
考场 乍一看都不可做 T1 算了半天样例,一直算出来 \(\frac{81}{400}\),直接丢了 T1 推了推发现是求最长连续 \(0\) 的数量,那就是线段树合并加上<玫瑰花精> T ...
- 将两个byte型拼接成16位二进制,再转化为十进制
short s = 0; //一个16位整形变量,初值为 0000 0000 0000 0000 byte b1 = 1; //一个byte的变量,作为转换后的高8位,假设初值为 0000 0001 ...
- 10个实战及面试常用Linux Shell脚本编写
来自:http://blog.51cto.com/lizhenliang/1929044 注意事项 1)开头加解释器:#!/bin/bash 2)语法缩进,使用四个空格:多加注释说明. 3)命名建议规 ...
- Hadoop 2.x安装
1.关闭防火墙 systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止firewall开 ...
- python类、对象
python类.对象 学习完本篇,你将会深入掌握 什么是类,对象 了解类和对象之间的关系 能独立创建一个People(人类),属性有姓名.性别.年龄.提供一个有参的构造方法,编写一个show方法,输出 ...
- win7任务计划提示”该任务映像已损坏或已篡改“
打开任务计划,弹出了下面的对话框[该任务映像已损坏或已篡改.(异常来自HRESULT:0x80041321)] 首先你以管理员的身份运行cmd命令,打开运行窗口 输入:chcp 437,并回车,回车后 ...
- springboot 配置 application.properties相关
springboot 有读取外部配置文件的方法,如下优先级: 第一种是在jar包的同一目录下建一个config文件夹,然后把配置文件放到这个文件夹下.第二种是直接把配置文件放到jar包的同级目录.第三 ...
- ecshop商品批量上传之EC助理1.28支持ECshop2.7.3方法
目前官方随着ECShop V2.73的发布也发布了相对应的EC助理1.30版.默认EC助理1.28也支持到ECShop V2.72,要想让EC助理1.28也支持到ECShop V2.73,那要了解EC ...
- centos7.X 系统初始化>>优化
1 修改网卡为eth0 cd /etc/sysconfig/network-scripts/ vim ifcfg-eno16777729TYPE=EthernetBOOTPROTO=staticIPA ...
- 《DotNet Web应用单文件部署系列》三、混淆dll文件
众所周知,C#编译后的dll文件可被反编译,网上搜索"C# 反编译"会出现一大堆资料.为了提高反编译成本,我们必须对dll文件进行混淆处理. 目前,C#混淆工具很多,我推荐obfu ...