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:
分为以下三种情况:
- 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
- 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
- 如果传入的参数是多个的时候,就会被封装成一个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>
结果成功了:
只是猜想,日后等知识积累到了这个知识,再回来订正和完善。