today a question let me happy(抓狂)

头儿分了一个小任务,让修改循环调用dao层的那些不啦不啦不啦,鉴于之前写过批量更新的玩意,so 很快代码就修改完了,but 测的时候发现总是报错,很诡异,mmp 万分不解,以前就是这么写的,为嘛在这个项目就GG了?

后来还是广大人民群众给我指了条明道。OK,let us see

方法一:

<update id="updateByPrimaryKeyBatch" parameterType="java.util.Map">
<foreach collection="infos" item="item" >
update ${t_sr_process_detail}
<set>
<if test="item.tenantId != null and item.tenantId != ''">
TENANT_ID = #{item.tenantId,jdbcType=VARCHAR},
</if>
<if test="item.lgId != null">
LG_ID = #{item.lgId,jdbcType=BIGINT},
</if>
<if test="item.routeLgId != null">
ROUTE_LG_ID = #{item.routeLgId,jdbcType=BIGINT},
</if>
.....
</set>
where DSPS_PROC_ID = #{item.dspsProcId,jdbcType=BIGINT};
</foreach>
</update>
这就是我最先想到的,直接循环,构造出多条update语句 但是,很不幸的是 mysql默认不支持这种写法,其实它是不支持多条以‘;’分割的sql
解决方式:在jdbcURL配置追加:allowMultiQueries=true
方法二:

<update id="updateByPrimaryKeyBatch" parameterType="java.util.Map">
  update ${t_sr_process_detail}
    <trim prefix="set" suffixOverrides=",">
      <trim prefix="TENANT_ID =case" suffix="end,">
        <foreach collection="infos" item="item">
          <if test="item.tenantId !=null and item.tenantId != ''">
            when DSPS_PROC_ID=#{item.dspsProcId} then #{item.tenantId,jdbcType=VARCHAR}
          </if>
        </foreach>
      </trim>
    <trim prefix="LG_ID =case" suffix="end,">
      <foreach collection="infos" item="item">
        <if test="item.lgId != null">
          when DSPS_PROC_ID=#{item.dspsProcId} then #{item.lgId,jdbcType=BIGINT}
        </if>
      </foreach>
    </trim>
    <trim prefix="ROUTE_LG_ID =case" suffix="end,">
      <foreach collection="infos" item="item">
        <if test="item.routeLgId != null">
          when DSPS_PROC_ID=#{item.dspsProcId} then #{item.routeLgId,jdbcType=BIGINT}
        </if>
      </foreach>
    </trim>
    <trim prefix="WRKFM_ID =case" suffix="end,">
      <foreach collection="infos" item="item">
        <if test="item.wrkfmId != null">
          when DSPS_PROC_ID=#{item.dspsProcId} then #{item.wrkfmId,jdbcType=BIGINT}
        </if>
      </foreach>
    </trim>
    .....
  </trim>
  where DSPS_PROC_ID in
    <foreach collection="infos" item="item" separator="," open="(" close=")">
      #{item.dspsProcId,jdbcType=BIGINT}
    </foreach>
</update>

方法二据说效率高,其实不然,经过测试,发现方法二的速度明显慢与方法一,因为参数太多,使用case when 则每个参数都会循环,so we checked the first method .

 

mysql批量update的两种方法的更多相关文章

  1. c#mysql批量更新的两种方法

    总体而言update 更新上传速度还是慢. 1:  简单的insert  速度稍稍比MySqlDataAdapter慢一点 配合dapper 配置文件 <?xml version="1 ...

  2. mybatis 根据id批量删除的两种方法

    原文:https://blog.csdn.net/qq_40010745/article/details/81032218 mybatis 根据id批量删除的两种方法   第一种,直接传递给mappe ...

  3. mysql批量更新的两种方式效率试验<二>

    Mysql两种批量更新的对比 简介: mysql搭载mybits框架批量更新有两种方式,一种是在xml中循环整个update语句,中间以‘:’隔开,还有一种是使用case when 变相实现批量更新, ...

  4. mybatis学习之路----批量更新数据两种方法效率对比

    原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...

  5. mysql 批量更新的四种方法

    批量更新的方法: 1 ) 逐条更新 代码如下: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 如果更新 ...

  6. 【ADO.NET-中级】百万级数据的批量插入的两种方法测试

    在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量 ...

  7. mysql 清空表的两种方法

    一.Delete DELETE FROM `table`; 二.Truncate TRUNCATE `table`; 第一种方法其实就是去掉where条件,没有了条件,也就是删除掉表里面的所有记录了: ...

  8. MySQL 创建数据库的两种方法

    使用 mysqladmin 创建数据库 使用普通用户,你可能需要特定的权限来创建或者删除 MySQL 数据库. 所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 mysql mys ...

  9. VIM 批量注释的两种方法 (转)

    方法一 ctrl+v 进入列编辑模式,向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I(shift+i),再插入注释符,比如"//",再按Esc,就会全部注释了 批 ...

随机推荐

  1. DENIED Redis is running in protected mode

    1.开源软件往往做的非常出色,错误的时候,会告诉你原因,以及怎么修改,仔细阅读就能明白.比如这个错误: [root@localhost src]# ./redis-cli -h 172.16.2.16 ...

  2. 访问天地图WMTS服务的正确姿势

    天地图2018版对天地图应用开发流程进行了升级改造,主要有两点变化: (1)接口升级为tianditu.gov.cn政府域名,支持HTTP/HTTPS协议,原有服务域名tianditu.com继续保留 ...

  3. C# 多线程调用静态方法或者静态实例中的同一个方法-方法内部的变量是线程安全的

    C#  多线程调用静态方法或者静态实例中的同一个方法-方法内部的变量是线程安全的 using System;using System.Threading;using System.Threading. ...

  4. jetty9.4缓存文件目录自定义

    jetty9.4安装包解压之后,有几个修改的地方和jetty7.6有不同,需要单独注意一下: 1. 端口设置 端口设置在${jetty_home}/start.ini中 2. 缓存文件生成目录 项目通 ...

  5. 【Tensorflow】Tensorflow r1.0, Ubuntu, gpu, conda安装说明

    Install Anaconda and python 1. cuda-8.0 download cuda_8.0.61_375.26_linux.run ./cuda_8.0.61_375.26_l ...

  6. 【ThinkPHP】解析ThinkPHP5创建模块

    在根目录下有一个build.php文件,该文件是自动生成的,自动创建模块.build.php的文件内容如下: <?php return [ // 生成应用公共文件 '__file__' => ...

  7. tesseract 4.0 ocr图像识别利器,可识别文字。图片越高清越准确

    //总地址 https://github.com/tesseract-ocr/tesseract/wiki //windows exe tesseract 4.0下载: https://github. ...

  8. Android jks 签名文件 生成

    Android Win7 上使用cmd生成Jks cmd 命令 C:\Program Files\Java\jre1.8.0_111\bin>keytool -genkeypair -alias ...

  9. 物联网架构成长之路(27)-Docker练习之Zookeeper安装

    0. 前言 准备了解一下消息队列MQ,对比了一些开源的中间件,最后选择Kafka作为以后用到的消息队列,消息队列的应用场景及Kafka与其他消息队列的优缺点这里就不细说了,具体的可以参考其他博客说明. ...

  10. ASP.NET MVC 右键点击添加没有区域(Area)、控制器、试图等选项

    在MVC项目中准备添加控制器.区域时发现没有控制器这个选项,当时没有在意以为VS出问题了,网上所搜了一下,有人说没有安装:Microsoft.AspNet.Mvc或者需要升级. 本次的解决如下: 1) ...