封面学校夜景

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. K8S——Pod

    一.Pod概念 二.Pod存在的意义 三.Pod的实现机制 四.Pod镜像拉取策略 五.Pod资源限制 六.Pod重启机制 七.Pod的健康检查 八.Pod调度策略(创建Pod流程)

  2. Hamcrest 断言框架

    Hamcrest是一个为了测试为目的,能组合成灵活表达式的匹配器类库.用于编断言的框架,使用这个框架编写断言,提高可读性及开发测试的效率,提供了大量"匹配器"方法,每个匹配器用于执 ...

  3. weblogic之XXE利用与分析

    weblogic之XXE利用与分析 本篇文章漏洞环境使用p神的CVE-2018-2628 本机IP:192.168.202.1 被攻击主机IP:192.168.202.129 一. xxer工具 1. ...

  4. Python小技巧:这17个骚操作你都OK吗?

    导读:Python 是一门非常优美的语言,其简洁易用令人不得不感概人生苦短.本文中带我们回顾了 17 个非常有用的 Python 技巧,例如查找.分割和合并列表等.这 17 个技巧都非常简单,但它们都 ...

  5. K8s Master当作Node使用的方法

    1.使用下面的命令操作使得master 可以作为node使用 承载pod kubectl taint nodes --all node-role.kubernetes.io/master- 可能会出现 ...

  6. Java实现导入Excel文件

    一.配置文件名称.路径.内容: <bean id="multipartResolver" class="org.springframework.web.multip ...

  7. 一起学习PHP中GD库的使用(一)

    又到了一个大家非常熟悉的库了,对于图像图形的处理来说,GD 库是 PHPer 们绕不过去的一道坎.从很早很早的 CMS 或者 Discuz 时代,各类开源软件在安装的时候就会明确地指出 GD 库是它们 ...

  8. Jmeter系列(3)- 常用断言之响应断言

    断言的作用 确定请求是有效还是无效的 添加断言 面板模块介绍 Apply to 作用:指定断言作用范围 Main sample and sub-sample:作用于主main sample和子sub- ...

  9. ci框架 查询构造器类

    $this->db->get() 该方法执行 SELECT 语句并返回查询结果,可以得到一个表的所有数据: $query = $this->db->get('mytable') ...

  10. cas的基础配置

    去除HTTPS的j基础认证方式 cas的:deployerConfigContext.xml <!-- Required for proxy ticket mechanism. -->&l ...