Mybatis批量更新的两种方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_20122925/article/details/89448152

前言

在使用Mybatis框架的过程中,经常会通过构建动态SQL来处理批量插入,批量更新数据等相关操作,本文将以批量更新为例,简单介绍其使用过程

动态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

猜你喜欢

转载自blog.csdn.net/qq_20122925/article/details/89448152