Java--Mybatis批量更新

Posted MinggeQingchun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java--Mybatis批量更新相关的知识,希望对你有一定的参考价值。

一、for each 标签

想要实现批量更新我们就需要使用到for each标签

对于foreach标签的解释参考了网上的资料,具体如下:
1、foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
2、foreach元素的属性主要有 item,index,collection,open,separator,close
(1)item 表示集合中每一个元素进行迭代时的别名
(2)index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置
(3)open 表示该语句以什么开始
(4)separator 表示在每次进行迭代之间以什么符号作为分隔 符
(5)close 表示以什么结束

在使用for each的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
(1)如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
(2)如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
(3)如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map

二、批量更新update

1、传 list 集合
单个字段

  批量更新测试
  <update id="updateByBatch" parameterType="java.util.List">
    update t_goods
    set NODE_ID=
    <foreach collection="list" item="item" index="index"
             separator=" " open="case" close="end">
      when GOODS_ID=#{item.goodsId} then #{item.nodeId}
    </foreach>
    where GOODS_ID in
    <foreach collection="list" index="index" item="item"
             separator="," open="(" close=")">
      #{item.goodsId,jdbcType=BIGINT}
    </foreach>
  </update>

单个字段方法二

  <update id="updateByBatch" parameterType="java.util.List">
    UPDATE
    t_goods
    SET NODE_ID = CASE
    <foreach collection="list" item="item" index="index">
      WHEN GOODS_ID = #{item.goodsId} THEN #{item.nodeId}
    </foreach>
    END
    WHERE GOODS_ID IN
    <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
      #{item.goodsId}
    </foreach>
  </update>

以上单字段更新实际执行:

UPDATE t_goods SET NODE_ID = CASE WHEN GOODS_ID = ? THEN ? END WHERE GOODS_ID IN ( ? )

多个字段

<update id="updateBatch" parameterType="java.util.List">
    update t_user
    <trim prefix="set" suffixOverrides=",">
        <trim prefix="STATUS =case" suffix="end,">
            <foreach collection="list" item="item" index="index">
                <if test="item.status!=null">
                    when USER_ID=#{item.userId} then #{item.status}
                </if>
            </foreach>
        </trim>
        <trim prefix="OPERATE_TIME =case" suffix="end,">
            <foreach collection="list" item="item" index="index">
                <if test="item.operateTime!=null">
                    when USER_ID=#{item.userId} then #{item.operateTime}
                </if>
            </foreach>
        </trim>
        <trim prefix="OPERATOR =case" suffix="end," >
            <foreach collection="list" item="item" index="index">
                <if test="item.operator!=null">
                    when USER_ID=#{item.userId} then #{item.operator}
                </if>
            </foreach>
        </trim>
    </trim>
    where
    <foreach collection="list" separator="or" item="item" index="index" >
        USER_ID=#{item.userId}
    </foreach>
</update>
 int updateBatch(List<WaterEle> list);

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

<update id="updateByBatchPrimaryKey" parameterType="java.util.Map">
    UPDATE t_goods
    SET NODE_ID = #{nodeId}
    WHERE GOODS_ID IN (${goodsIdList})
</update>
UPDATE t_goods SET NODE_ID = ? WHERE GOODS_ID IN (1,2,5);    

2、传map/ 传String(同批量删除的"传map/ 传String")

<update id="deleteByPrimaryKey" parameterType="java.util.Map">
    UPDATE t_order_checkout
    SET NODE_ID = #{nodeId, jdbcType=VARCHAR}, OPERATOR = #{operator, jdbcType=VARCHAR}
    WHERE CHECKOUT_ID IN (${checkoutIdList})
</update>

以上是关于Java--Mybatis批量更新的主要内容,如果未能解决你的问题,请参考以下文章

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

java MyBatis的批量插入

推荐学java——MyBatis高级

js常用代码片段(更新中)

推荐学java——MyBatis高级

推荐学java——MyBatis高级