SELECT S.ID,S.BRAND,S.TYPE,S.CODE,S.NAME FROM STORE_INFO
WHERE S.TYPE IN
<foreach collection="type" item="t" index="index" open="(" separator="," close=")">
#{t}
</foreach>
<if test="store_code != null and store_code != ''">AND S.CODE LIKE CONCAT(CONCAT('%',#{store_code}),'%')</if>
<if test="store_name != null and store_name != ''">AND S.NAME LIKE CONCAT(CONCAT('%',#{store_name}),'%')</if>
ORDER BY S.BRAND
首先说IN关键字:
传入参数是集合时,通常SQL会使用IN关键字,如果不使用框架,则需要如下操作:
①要么根据list.size()构建一个”(1,3,5)”的str,然后拼接到原SQL上(有注入风险)
②要么根据list.size()构建一个”(?,?,?)”的str,重构PreparedStatement
框架实际上是为我们实现了后者的操作。
注意:collection是传入的实际参数名;item是用于遍历的参数名,可以自己定义。
其次说LIKE关键字:
当进行模糊匹配时,需要LIKE关键字和%。在不使用框架时,需要传参前重构参数:
store_name = "%"+ store_name+"%";
由于框架不支持%#{store_name}%的写法,所以必须借助CONCAT函数。
注意:Oracle数据库中的CONCAT函数只支持2个参数,所以,如果前后都有%,需要嵌套。