以下是根据自己在实际项目中遇到的一个问题总结的关于mybatis中foreach的用法
需求:要查询同时具有某些资质(资质表SUPPLIER_APTITUDE)的供应商(供应商表SUPPLIER_INFO)
数据库实现语句:(假设要查找的资质名称为‘ISO’和'SMII')
select * from SUPPLIER_INFO where SUPPLIER_ID in
(select SUPPLIER_ID from SUPPLIER_APTITUDE
where APTITUDE_NAME like 'ISO'
intersect
select SUPPLIER_ID from SUPPLIER_APTITUDE
w here APTITUDE_NAME like 'SMII'
)
mybatis实现语句
<select id="selectSupplierByWhere" resultType="Supplier">
select * from SUPPLIER_INFO where SUPPLIER_ID in
<foreach collection=’aptitudeNameList’ item=”aptitudeName” index=index open=”(” separator=” intersect” close=”)”>
select SUPPLIER_ID from SUPPLIER_APTITUDE Where APTITUDE_NAME like ‘%’ || #{aptitudeName} || ‘%’
</foreach>
其中:
collection表示所要遍历的集合,属性类型可以是List,Array,Map
- 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list .
- 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array .
- 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key.
item表示集合中每一个元素进行迭代是的别名(#{}中的名要与item一致)
index表示迭代过程中迭代到的位置
open表示语句以什么开始,close表示以什么结束和open成对出现
separator表示每次迭代之间以什么作为分隔符,常用的有,/or/and等等