mybatis批量删除的foreach标签

本文详细解析了MyBatis框架中foreach标签的使用方法及参数含义,包括collection、item、index、open、close和separator的用途,通过实例展示了批量删除操作的正确实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

foreach标签的含义

下面我们来看一看foreach标签的参数含义。

 <delete id="delDataFilesByIds" parameterType="java.lang.String">
        delete from  datafile where id in
        <foreach collection="ids"  open="(" close=")" separator=","  item="item" >
            #{item}
        </foreach>
    </delete>

collection

分为以下三种情况:

  1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
  2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
  3. 如果传入的参数是多个的时候,就会被封装成一个Map了,参数名就是key值,这时候collection的属性值就是Map中对应的key值。 3. 如果传入的参数是多个的时候,就会被封装成一个Map了,参数名就是key值,这时候collection的属性值就是Map中对应的key值。

我们来看一看其他参数:

item
item 的值是本次迭代获取的元素,就是将ids数组的元素每次取一个赋值给item,下面#{item}也是item变量中取值。

index
是当前迭代的次数

open、close、separator用来拼接sql语句。

遇到的错误

我们先来看一下我之前之前遇到的一个小错误。报出了如下的错误:
org.apache.ibatis.binding.BindingException: Parameter ‘array’ not found. Available parameters are [ids, param1]
在这里插入图片描述

当时的代码如下:
mapper接口的代码如下:

int delDataFilesByIds(@Param("ids") String[] ids);

mapper.xml的代码:

<delete id="delDataFilesByIds" parameterType="java.lang.String">
        delete from  datafile where id in
        <foreach collection="array"  open="(" close=")" separator=","  item="item" >
            #{item}
        </foreach>
    </delete>

当时怎么都想不明白的,总觉得没有错。去百度,找到了下面的写法。

另一种写法

我们先来看一下正确的代码,mapper接口的方法如下:

int delDataFilesByIds(@Param("ids") String[] ids);

mapper的xml文件如下:


<delete id="delDataFilesByIds" parameterType="java.lang.String">
   delete from  datafile where id in
    <foreach collection="ids"  open="(" close=")" separator=","  item="item" >
        #{item}
    </foreach>
</delete>

结果如下:
在这里插入图片描述
我们可以看到批量删除确实是成功了。

结合上面的collection的解释,我猜想了一下,应该是加了@Param注解导致了mybatis认为它就是多个参数的情况,所以只能按照map中的key取值,就把array当成key了,而此时map中只有ids一个key,所以当然报错了。

于是我就改成了下面情况:
去掉了@Param注解再用array
mapper文件:

int delDataFilesByIds(String[] ids);

xml文件:

 <delete id="delDataFilesByIds" parameterType="java.lang.String">
        delete from  datafile where id in
        <foreach collection="array"  open="(" close=")" separator=","  item="item" >
            #{item}
        </foreach>
    </delete>

结果成功了:
在这里插入图片描述
只是猜想,日后等知识积累到了这个知识,再回来订正和完善。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值