MyBatis在SQL语句中的一些总结

最近需要把前端传回来的两个字符串列表查找数据库一张表,当两张表为空时要返回全部的数据,重要的是还要做分页,因此就限定了条件判断只能在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:设置迭代元素之间的间隔符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值