最近需要把前端传回来的两个字符串列表查找数据库一张表,当两张表为空时要返回全部的数据,重要的是还要做分页,因此就限定了条件判断只能在SQL完成。最终满足需求的代码如下:
select * from ufo_deviceinfo
<where>
<if test="F_CustomerName != null and F_CustomerName.size > 0">
F_CustomerName IN
<foreach item="item" index="index" collection="F_CustomerName" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="F_Province != null and F_Province.size > 0">
or F_Province IN
<foreach item="item" index="index" collection="F_Province" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</where> limit #{begin} , #{size}
注意参数类型是List<String>
以下是一些总结。
#{ }和${ }的区别
#{} 只是替换?,相当于PreparedStatement使用占位符去替换参数,可以防止sql注入。
${} 是进行字符串拼接,相当于sql语句中的Statement,使用字符串去拼接sql;${} 可以是sql中的任一部分传入到Statement中,不能防止sql注入
简单说可以理解为:
#{} 相当于对数据加上了引号,预编译的时候相当于占位符号,能够防止sql注入。
${} 没有给数据加上引号,预编译是相当于字符串拼接,所以不能防止sql注入。
list.size用#{}是取不出来的,需要用${},把#换成$就可以了。
#{}能够有效防止SQL注入,但是也有它的缺点,它会把传入的数据自动加上一个双引号,所以如果要的是数字的话,就会比较尴尬。
而${}可以直接解析出原本的数据,所以需要数值比较的话,还是要加${}。
if 标签
test是if标签的唯一属性,它用来判断后面的条件是否成立。如果条件成立,就将if标签内的内容拼接到sql语句中
多个if连接,只要自身条件成立就会实现sql语句拼接,和其他if标签无关
where和set
<where></where>
<set></set>
where标签相当于在sql语句中拼接一个where单词,里面可以填写条件
set标签相当于在sql语句中拼接一个set单词,当对数据修改时可以修改,里面也可以填写部分语句
两个标签都没有属性,就是直接在语句中拼接上where或set
choose when otherwise 三个标签通常一起使用。
作用:
1.一旦有条件成立的when,后续的when则不会执行
2.当所有的when都不执行时,才会执行otherwise
foreach标签可以遍历集合。所以我们在使用foreach时,传入的参数都是集合。
其中各元素说明:
collection
:传入集合参数名称id
:循环对象名称,自己设置open
:开始符号,与close一起使用,就是循环输出的结果外面加上所需要的符号close
:结束符号separator
:设置迭代元素之间的间隔符