MyBatis - 批量update

1、更新单条记录 

UPDATE course SET name ='course1'WHEREid= 'id1';

2、更新多条记录的同一个字段为同一个值

UPDATE course SET name='course1' WHERE id in('id1','id2','id3);

3、更新多条记录为多个字段为不同的值

比较普通的写法,是通过循环,依次执行update语句。

一条记录update一次,性能比较差,容易造成阻塞

3.1 思路

MySQL没有提供直接的方法来实现批量更新,但可以使用case when语法来实现这个功能。

 UPDATE course
    SET name = 
        CASE id 
        WHEN 1 THEN 'name1'
        WHEN 2 THEN 'name2'
        WHEN 3 THEN 'name3'
    END, 
    title =
        CASE id 
        WHEN 1 THEN 'New Title 1'
        WHEN 2 THEN 'New Title 2'
        WHEN 3 THEN 'New Title 3'
    END
WHERE id IN (1,2,3)

这条sql的意思是,如果id为1,则name的值为name1,title的值为New Title1;依此类推。

3.2 写法一

<updateid="updateBatch"parameterType="list">
            update course
            <trim prefix="set" suffixOverrides=",">
             <trim prefix="name=case" suffix="end,">
                 <foreach collection="list" item="item" index="index">
                         <if test="item.name!=null">
                          when id=#{item.id} then #{item.name}
                         </if>
                 </foreach>
              </trim>
              <trim prefix="title =case" suffix="end,">
                 <foreach collection="list" item="item" index="index">
                         <if test="item.title!=null">
                          when id=#{item.id} then #{item.title}
                         </if>
                 </foreach>
              </trim>
             </trim>
            where
            <foreach collection="list" separator="or" item="item" index="index">
              id=#{item.id}
          </foreach>
</update>

3.3 写法二

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

3.4 <foreach>

foreach元素的属性主要有 item,index,collection,open,separator,close。

  • item表示集合中每一个元素进行迭代时的别名,
  • index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,
  • collection,必填,最容易出错
    • 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
    • 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
    • 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map或者Object。
  • open表示该语句以什么开始,
  • separator表示在每次进行迭代之间以什么符号作为分隔符,
  • close表示以什么结束。

3.5 <trim>

  • prefix,suffix  表示在 trim 标签包裹的部分的前面或者后面添加内容 
  • 如果同时有 prefixOverrides,suffixOverrides  表示会用 prefix,suffix 覆盖 Overrides 中的内容。 
  • 如果只有 prefixOverrides,suffixOverrides  表示删除开头的或结尾的 xxxOverides 指定的内容。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值