mybatis使用foreach使用
1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list,需要dubug确定下传入的参数是不是List<String>,如果是List<Bean>就会报错。
2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array。
3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可。
collection: 要做foreach的对象,作为入参时,List对象默认用"list"代替作为键,数组对象有"array"代替作为键,Map对象没有默认的键。当然在作为入参时可以使用@Param("keyName")来设置键,设置keyName后,list,array将会失效。
<delete id="deleteByPermissionIds" parameterType="java.util.List"> delete from public.tpermission_operation where permission_id in <foreach collection="list" item="item" index="index" open="(" separator="," close=")"> <if test="index%1000 == 999"> ) or permission_id in ( </if> #{item} </foreach> </delete> <delete id="deleteByPermissionIds" parameterType="java.lang.String"> delete from public.tpermission_operation where permission_id in <foreach collection="array" item="item" index="index" open="(" separator="," close=")"> <if test="index%1000 == 999"> ) or permission_id in ( </if> #{item} </foreach> </delete> <delete id="deleteByPermissionIds" parameterType="java.util.Map"> delete from public.tpermission_operation where permission_id in <foreach collection="listInMap" item="item" index="index" open="(" separator="," close=")"> <if test="index%1000 == 999"> ) or permission_id in ( </if> #{listInMap} </foreach> </delete>
备注:
<if test="index%1000 == 999"> ) or permission_id in ( </if>
使用in超过1000个id会报错,可使用 in()or()写法解决。
ibatis中写法:
Java类中的参数List<Test> test(List<String> ids)
where a.id in <iterate conjunction="," open="(" close=")"> #ids[]# </iterate>