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. SharePoint Excel Service - Couldn't Open the Workbook.

    Error meesage: "Couldn't Open the Workbook. Wow, That's a big workbook. Unfortunately, we can't ...

  2. 与临时对象的斗争(上)ZZ

    C++ 是一门以效率见长的语言(虽然近来越来越多的人“不齿”谈及效率,我深以为不然,在某一次的程序编写中不对效率锱铢必较并不意味意味着我们就不应该追求更多的更好的做法).总之吧,相比起其它语言,程序员 ...

  3. debian linux sudo 无法执行以添加普通用户到sudo

    安装debian时,默认创建了root用户,和一个普通用户: 用普通用户登录电脑,无法执行sudo命令: 查看 /etc/sudoers 无此文件: 那么说明,本机没有安装sudo 解决方式: 终端 ...

  4. go-ehtereum编译:

    git clone https://github.com/ethereum/go-ethereum.git cd go-ethereum && git checkout make ge ...

  5. C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用

    C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备)  https://blog.csdn.net/u013519551/article/details/51220841 1. . ...

  6. Data Model for Message Receiver

    1. Physical Data Model 2. SQL Statements drop database MessageReceiver go /*======================== ...

  7. Git Flow 分支管理简述

    概述 Git 是什么 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的 ...

  8. [moosefs] storage class

    chapter 1 moosefs 3.1 storage class 功能的介绍 1.1 什么是storage class 在moosefs中,storage class允许指定文件的chunks存 ...

  9. keras 设置GPU使用率

     import tensorflow as tffrom keras.backend.tensorflow_backend import set_session config = tf.ConfigP ...

  10. iOS中UITextField输入判断小数点后两位

    在输入金额的UITextField中,要给予三个规则的判断 1. 只能输入数字(可以通过设置键盘类型为Decimal Pad) 2. 小数点只能有一个 3. 小数点后最多有两位数字 (可以通过正则表达 ...