封面学校夜景

xdm,祝大家节日快乐!!

今天听《路过人间》演唱会Live限定版,爱上了一句歌词。

说来惭愧,人对爱只学会,视死如归。

1.业务需求

如下:

前台传给我一个 documentIdList<UpdateDocumentAnswer> 对象给我。

执行条件:通过这个documentIdList<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 动态批量修改的更多相关文章

  1. MySQL+MyBatis下批量修改数据的问题

    今天处理数据批量的更新,场景是这样子的,web站管理的字典功能,需要添加一个记录的整体描述,以及详细内容的描述.一个字典整体概述只有一组信息,但是其详细内容,会有很多项,不确定. 这个场景,在关系型数 ...

  2. MyBatis动态批量插入、更新Mysql数据库的通用实现方案

    一.业务背景 由于需要从A数据库提取大量数据同步到B系统,采用了tomikos+jta进行分布式事务管理,先将系统数据源切换到数据提供方,将需要同步的数据查询出来,然后再将系统数据源切换到数据接收方, ...

  3. MyBatis批量修改操作

    1.需求 后台管理页面,查询频道列表,需要批量修改频道的状态,批量上线和下线 2.MyBatis配置 这是mysql的配置,注意需要加上&allowMultiQueries=true配置 jd ...

  4. Sql批量添加,批量查询,批量删除,批量修改。mybatis都有对应标签

    Sql批量添加,批量查询,批量删除,批量修改.mybatis都有对应标签

  5. mybatis批量修改

    使用mybats经常要用到批量修改或者删除,贴出批量修改的代码.如果是批量删除,可将update换成delete. <update id="changestatus" par ...

  6. mybatis 批量新增-批量修改-批量删除操作

    mapper.xml <!-- 批量新增 --> <insert id="saveBatch" parameterType="java.util.Lis ...

  7. 161102、MyBatis中批量插入

    方法一: <insert id="insertbatch" parameterType="java.util.List"> <selectKe ...

  8. 超全MyBatis动态SQL详解!( 看完SQL爽多了)

    MyBatis 令人喜欢的一大特性就是动态 SQL. 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的. MyBatis 动态 SQL 的出现, 解决了这个麻烦. My ...

  9. 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 ...

随机推荐

  1. element后端管理布局

    <template> <el-container> <el-header> <Header></Header> <span class ...

  2. golang 判断平台是32位还是64位

    在strconv包中有个常量 const intSize  =  32  <<  (  ^uint(0)  >>  63  ) const IntSize = intSize ...

  3. 逐条更新数据 sql

    declare @tid int        declare @fid int declare @i int declare @j int set @j=(select count(*) from ...

  4. 如何在win10中Java中JDK的安装和path,classpath的环境配置

    1,第一步,不用说肯定是去下一个java JDK了.目前最新版本的java JDK应该是JDK 7.0,这个就自己去百度一下了,好多网站都可以找到.2,第二步就是安装JDK虚拟机了,按照它里面的提示一 ...

  5. PHP中的那些魔术常量

    之前我们已经了解了一些常用的魔术方法,除了魔术方法外,PHP还提供一些魔术常量,相信大家在日常的工作中也都使用过,这里给大家做一个总结. 其实PHP还提供了很多常量但都依赖于各类扩展库,而有几个常量是 ...

  6. 使用metaweblog API实现通用博客发布 之 版本控制

    使用metaweblog API实现通用博客发布 之 版本控制 接上一篇本地图片自动上传以及替换路径,继续解决使用API发布博客的版本控制问题. 当本地文档修订更新以后,如何发现版本更新,并自动发布到 ...

  7. PHP 一个树为另一棵树的子结构 [TO BE CONTINUED]

    输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) <?php class TreeNode { private $val; private $left; ...

  8. Selenium多浏览器并行测试

    如果需要同时在IE.firefox.chrome进行测试,可以使用grid. Selenium Grid是一个智能代理服务器,允许Selenium测试将命令路由到远程Web浏览器实例.其目的是提供一种 ...

  9. 监控linux服务器工具nmon的使用

    做压测时,需要查看服务器中的cpu.内存变化,但由于服务器是linux环境,则需要监控linux服务器的工具,下面用到的工具是nmon. 1.安装nmon.在网上下载nmon安装包,在linux服务器 ...

  10. 一篇文章告诉你Python接口自动化测试中读取Text,Excel,Yaml文件的方法

    前言 不管是做Ui自动化和接口自动,代码和数据要分离,会用到Text,Excel,Yaml.今天讲讲如何读取文件数据 Python也可以读取ini文件,传送门 记住一点:测试的数据是不能写死在代码里面 ...