Mybaits的批量操作包括批量删除 批量增加和批量更新

Posted meizhoulqp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybaits的批量操作包括批量删除 批量增加和批量更新相关的知识,希望对你有一定的参考价值。

学前小课堂:

          <!-- 引入sql片段 refid :被引入sql片段的id-->

          <include refid="condition_sql_by_trim"/>

        <!-- 动态SQL语句trim标签

    perfix : 动态sql语句的前缀 (WHERE,SET)
              prefixOverrides : 自动截取掉或者替换条(WHERE 多余后面 关键字 :AND-OR)

   -->

          <!-- 动态sql语句 foreach 循环标签
              <foreach collection="" open="" close="" item="" separator=""></foreach>
              collection : 要循环集合或者数组
              open :开始位置符号 前小括号 (
              close : 开始位置符号 后小括号 )
              item : 每次循环的数据
              separator : 分隔符 逗号 ,
          -->

<!--判断-->

<if test="name !=null"> name = #{name},</if>

 

一、批量删除

<!-- 批量删除 -->
      <delete id="deleteByIds" parameterType="list">
          <!-- delete from user where id in (1,3,5,56,8) -->
          delete from user where id in
          
          <!-- 动态sql语句 foreach 循环标签 
              <foreach collection="" open="" close="" item="" separator=""></foreach>
              collection : 要循环集合或者数组 
              open :开始位置符号 前小括号 (
              close : 开始位置符号 后小括号 )
              item : 每次循环的数据
              separator : 分隔符 逗号 ,
          -->
          <foreach collection="ids" open="(" close=")" item="id" separator=",">
              #{id}
          </foreach>
      </delete>

二、批量插入

      <!-- 批量插入 -->
      <insert id="batchInsert" parameterType="list">
          <!-- 
              insert into user (name,password,age) values
              (xxx,x,xx),(xxx1,x1,xx1),(xxx2,x2,xx2)
           -->
          insert into user (name,password,age) values
          
          <!--  动态sql语句 foreach 循环标签 -->
          <foreach collection="users" separator="," item="user">
              (#{user.name},#{user.password},#{user.age})
          </foreach>
          
      </insert>

三、批量更新

批量更新的写法一般有三种,在更新数量较少的情况下,前两种性能不相上下。但是在更新字段增加,更新条数较多(500以上)建议使用第三种写法。

  • 常规写法,拼接多个单条更新语句。
  • CASE...WHEN... 写法
  • JOIN 写法

①Batch Update

spring/mybatis/JDBI都支持这种批量更新方式。
这种更新方式需要设置jdbc连接的参数:

allowMultiQueries=true
# 完整url举例
jdbc.url=jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true

具体实现以Spring的JdbcTemplate为例。
batchUpdate的主要代码如下图:

技术图片

 

 ②CASE WHEN

<update id="updateBatch" parameterType="java.util.List">
        update mydata_table
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="status =case" suffix="end,">
                <foreach collection="list" item="item" index="index">
                     when id=#{item.id} then #{item.status}
                </foreach>
            </trim>
        </trim>
        where id in
        <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
            #{item.id,jdbcType=BIGINT}
        </foreach>

结构如下:

  update mydata_table 
    set status = 
    case
        when id = #{item.id} then #{item.status}//此处应该是<foreach>展开值
        ...
    end
    where id in (...);

UPDATE test SET code = ( CASE WHEN id = 1 THEN 11 WHEN id = 2 THEN 22 WHEN id = 3 THEN 33 END ) WHERE id IN (1,2,3);

注意:CASE WHEN一定要和WHERE语句一起使用,否则UPDATE会遍历和更新数据库中所有的行。会把未出现在WHEN中的数据都更新成null,如果code列设置为NOT NULL则会报错,否则会置为NULL或者默认值

三、JOIN

UPDATE `test` a JOIN 
(
SELECT 1 AS id, 11 AS code, ‘holy‘ AS name
UNION 
SELECT 2 AS id, 22 AS code, ‘shit‘ AS name
) b USING(id, code)
SET a.name=b.name;

上述SQL要表达的更新语义是:将id=1且code=11的name更新为‘holy‘,将id=2且code=22的name更新为‘shit‘。
注意,条件字段必须放在USING

技术图片

 

以上是关于Mybaits的批量操作包括批量删除 批量增加和批量更新的主要内容,如果未能解决你的问题,请参考以下文章

Mybaits-Plus操作CRUD

es 批量查询,修改,删除,增加操作

java如何对数据库的数据进行批量删除之后接着做批量增加,删除和增加是一次操作完成

Spring boot集成Redis—进行增加,更新,查询,批量删除等操作

mybaits的xml中写批量更新

使用“一条”SQL语句完成批量插入和批量删除操作