动态sql XML 的foreach循环

作用:

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的问题:

这是最基本的用法,但是会出现一个无问题,就是前面需要一个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是冲突的

这样,就完美的解决了之前的问题,虽然现在想想很简单,但是当时用了一些时间才解决。

经验分享 程序员 微信小程序 职场和发展