foreach主要是用于一个循环,大部分用到的是循环的生成sql,下面说一下动态foreach的属性:
foreach元素的属性主要有item,index,collection,open,separator,close。
1、collection表示如何来得到这个集合,如果传入的直接为一个List,那么collection值就为list,如果直接传入的为一个array不可变数组,那么collection值就为array,如果传入的为一个dto,比如dto里面的array变量名为idLists,那么collection的值就为idLists。
2、item表示集合中每一个元素进行迭代时的别名,比如item为value,那么,每次获取的都使用#{value}即可
3、index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,一般很少使用这个
4、open表示该语句以什么开始
5、separator表示在每次进行迭代之间以什么符号作为分隔符
6、close表示以什么结束
二、原理:
动态SQL,最后都会根据条件拼成SQL,foreach也不例外,原理为:
首先根据collection来得到集合,然后写入open字符,然后开始遍历:
foreach元素的属性主要有item,index,collection,open,separator,close。
1、collection表示如何来得到这个集合,如果传入的直接为一个List,那么collection值就为list,如果直接传入的为一个array不可变数组,那么collection值就为array,如果传入的为一个dto,比如dto里面的array变量名为idLists,那么collection的值就为idLists。
2、item表示集合中每一个元素进行迭代时的别名,比如item为value,那么,每次获取的都使用#{value}即可
3、index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,一般很少使用这个
4、open表示该语句以什么开始
5、separator表示在每次进行迭代之间以什么符号作为分隔符
6、close表示以什么结束
二、原理:
动态SQL,最后都会根据条件拼成SQL,foreach也不例外,原理为:
首先根据collection来得到集合,然后写入open字符,然后开始遍历:
每次遍历,都会执行里面的条件得到生成的sql,然后加入separator,遍历完成之后,加入close字符。
ServiceMapper.xml
<update id="productShelves"> UPDATE pm_service SET state=3 WHERE id IN <foreach collection="ids" item="id" index="index" open="(" separator="," close=")" > #{id} </foreach> </update>ServiceMapper.java
ServiceServiceImpl.java
IserviceService.java
provider中引用:
总结: item 的值 必须要和每次循环的#{} 中的值一样
collection: 接收参数时不需要 #注入,直接写参数名就可以