mybatis批量删除的foreach标签

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]
mybatis批量删除的foreach标签_第1张图片

当时的代码如下:
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>

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

你可能感兴趣的:(mybatis)