foreach在xml动态sql总用于数组集合等参数的接收
collection:传递过来的数组或集合等参数名称(collection="参数名")
index:通过下标0,1,2来循环取出每个元素(index="index")
item:每循环一次所取出的参数 取别名,这个可以随便填,与#{items}表达式中的参数对应(item="items")
separator:每次取出的参数以某种符号分割,例如逗号、空格等(separator="",separator=",")
open:以什么开始
close:以什么结束
<if test="content!= null and content!= ''">
<foreach collection="content" item="items" index="index" separator="">
OR CONTENT = #{items}
</foreach>
</trim>
</if>
这是最基本的用法,但是会出现一个无问题,就是前面需要一个and,不需要or 因为每次虚幻都会加一个or,所以我们需要将第一个or去掉。
所以,也就用到了trim标签,trim标签总共有四个属性
prefix:增加前缀
suffix:增加后缀
prefixOverrides:去掉前缀
suffixOverrides:去掉后缀
那么经过修改,代码变成了:
<if test="content!= null and content!= ''">
<trim prefixOverrides="OR">
<foreach collection="content" item="items" index="index" separator="">
OR CONTENT = #{items}
</foreach>
</trim>
</if>
这样,前缀的or就去掉了,很多时候,foreach都是和trim标签搭配来用
我原本以为,这样就完了,但是还有一个坑等着我
那就是,这样的sql,前面肯定有一个and,这个要怎么加呢,首先肯定不能用trim加,因为会循环出现两次。而且两个or语句还需要加上口号,这又怎么修改呢
直接上代码
<if test="content!= null and content!= ''">
AND(
<trim prefixOverrides="OR">
<foreach collection="content" item="items" index="index" separator="">
OR CONTENT = #{items}
</foreach>
</trim>
)
</if>
可能有人会说,直接用open("AND ("),close(")")不就好了吗,问题是,这两个属性和trim是冲突的
这样,就完美的解决了之前的问题,虽然现在想想很简单,但是当时用了一些时间才解决。