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批量更新的主要内容,如果未能解决你的问题,请参考以下文章