mybatis 使用foreach标签批量更新数据

7 篇文章 0 订阅
4 篇文章 0 订阅

今天领导安排了个批量插入数据的任务,就简单搞了一下,在此记录一下

先来说一下foreach标签用法

属性描述
collection

表示迭代集合的名称,可以使用@Param注解指定,如下图所示,该参数为必选

item表示本次迭代获取的元素,若collection为List、Set或者数组,则表示其中的元素;若collection为map,则代表key-value的value,该参数为必选
open表示该语句以什么开始,最常用的是左括弧’(’,注意:mybatis会将该字符拼接到整体的sql语句之前,并且只拼接一次,该参数为可选项
close表示该语句以什么结束,最常用的是右括弧’)’,注意:mybatis会将该字符拼接到整体的sql语句之后,该参数为可选项
separatormybatis会在每次迭代后给sql语句append上separator属性指定的字符,该参数为可选项,一般用于加个,
index在list、Set和数组中,index表示当前迭代的位置,在map中,index代指是元素的key,该参数是可选项
  

 

 

 

 

 

 

 

 

 

 

如果入参是list

 /**
     * 批量修改企业审批状态
     */
    @Test
    public void BatchModifyStatus() {
        List<WaybillArea> waybillAreas = new ArrayList<WaybillArea>();
        WaybillArea waybillArea01= new WaybillArea();
        waybillArea01.setId(1);
        waybillAreas.add(waybillArea01);
        WaybillArea waybillArea02= new WaybillArea();
        waybillArea02.setId(4);
        waybillAreas.add(waybillArea02);
        WaybillArea waybillArea03= new WaybillArea();
        waybillArea03.setId(5);
        waybillAreas.add(waybillArea03);
        WaybillArea waybillArea04= new WaybillArea();
        waybillArea04.setId(6);
        waybillAreas.add(waybillArea04);
         waybillOwnerService.batchModifyStatus(waybillAreas);
    }
<!--批量修改企业审核状态-->
<update id="batchModifyStatus"  parameterType="list">
  update waybill_owner set owner_zt = CASE id
  <foreach collection="list"  item="item" >
    WHEN #{item.id} THEN 5
  </foreach>
  END
  <where>
    id in
    <foreach collection="list"  item="item" open="(" separator="," close=")" >
      #{item.id}
    </foreach>
  </where>
</update>

入参是list类型,系统遍历,collection="list"类型是list, item="item" 是每个对象,我取到对象在.出对象的属性。

第二个foreach 我还使用了open,separator,close ,省的手动加括号和,

打印sql如下


update waybill_owner set owner_zt = CASE id
 WHEN 1 THEN 5
 WHEN 4 THEN 5 
 WHEN 5 THEN 5 
 WHEN 6 THEN 5 
 END
 WHERE id in ( 1 , 4 , 5 , 6 );

这个sql的意思是 更新waybill_owner表的owner_zt字段值,当这条数据的id等于1的时候,owner_zt的值更新为5,当这条数据的id等于4的时候,更新为5.。。。,where in 中是所有的id,即要更新数据的id,和when 后的值是对应的。

我是批量操作同样字段只是每条数据不一样,所以是这样表示。

即是将条件语句写在了一起。

这里的where部分不影响代码的执行,但是会提高sql执行的效率。

如果想要一次更新多个字段可以这样写

UPDATE waybill_owner SET
    owner_code = CASE id
        WHEN 4 THEN 1
        WHEN 5 THEN 1
        WHEN 6 THEN 1
    END,
    area = CASE id
        WHEN 4 THEN 1
        WHEN 5 THEN 1
        WHEN 6 THEN  1
    END
WHERE id IN (4,5,6)

更新waybill_owner表的owner_code和area字段

 

如果入参是map或者set类型

如果collection类型为map,则index代表key,item代表对应的value,可以这样进行批量插入

这里写图片描述

 

 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值