Mybatis批量更新的两种方式

https://cloud.tencent.com/developer/article/1430952

动态SQL元素
if set trim foreach
批量更新
映射方法

int updateOrderItem(List<OrderItem> list);

实体类字段

public class OrderItem {
    private Integer id;
    private Integer orderId;
    private Integer productId;
    private Integer count;
    //省略...
    }

测试代码

List<OrderItem> list=new ArrayList<>();
OrderItem orderItem=new OrderItem();
orderItem.setCount(66);
orderItem.setId(1);
OrderItem orderItem1=new OrderItem();
orderItem1.setCount(5);
orderItem1.setId(2);
list.add(orderItem);
list.add(orderItem1);
orderItemMapper.updateOrderItem(list);

方式一

<update id="updateOrderItem"  parameterType="java.util.List">
  <foreach collection="list" item="item"  separator=";">
    update order_item
    <set>
      <if test="item.orderId != null">
        order_id = #{item.orderId},
      </if>
      <if test="item.productId != null">
        product_id = #{item.productId},
      </if>
      <if test="item.count != null">
        count = #{item.count}
      </if>
    </set>
    where id = #{item.id}
  </foreach>
</update>

对应SQL:

[cn.srblog.dao.OrderItemMapper.updateOrderItem]-==>  Preparing: update order_item SET count = ? where id = ? ; update order_item SET count = ? where id = ? 
[cn.srblog.dao.OrderItemMapper.updateOrderItem]-==> Parameters: 66(Integer), 1(Integer), 5(Integer), 2(Integer)
[cn.srblog.dao.OrderItemMapper.updateOrderItem]-<==    Updates: 1

此方式需要允许MySQL的一次执行多条SQL

url=jdbc:mysql://localhost:3306/ssm?characterEncoding=utf-8&allowMultiQueries=true

方式二

<update id="updateOrderItem"  parameterType="java.util.List">
      update order_item
      <trim prefix="set" suffixOverrides=",">
        <trim prefix="orderId = case" suffix="end,">
          <foreach collection="list" item="item">
            <if test="item.orderId != null">
              when id=#{item.id} then #{item.orderId}
            </if>
          </foreach>
        </trim>
        <trim prefix="productId = case" suffix="end,">
          <foreach collection="list" item="item">
            <if test="item.productId != null">
              when id=#{item.id} then #{item.productId}
            </if>
          </foreach>
        </trim>
        <trim prefix="count = case" suffix="end,">
          <foreach collection="list" item="item">
            <if test="item.count != null">
              when id=#{item.id} then #{item.count}
            </if>
          </foreach>
        </trim>
      </trim>
  </update>

对应SQL

[cn.srblog.dao.OrderItemMapper.updateOrderItem]-==>  Preparing: update order_item set count = case when id=? then ? when id=? then ? end 
[cn.srblog.dao.OrderItemMapper.updateOrderItem]-==> Parameters: 1(Integer), 66(Integer), 2(Integer), 5(Integer)
[cn.srblog.dao.OrderItemMapper.updateOrderItem]-<==    Updates: 3

应用
在这里插入图片描述
collection需要和parm对应
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值