关于Mybatis动态sql中test的坑点总结
目录
- 总结Mybatis动态sql中test的坑
- 判断相等的注意点
- 判断字符是否相等
- 动态sql标签的小陷阱
- 下面先举个正常的例子
总结Mybatis动态sql中test的坑 在mybatis中要实现动态sql,重要方式就是使用test,通过其中表达式返回的true、false来达到动态sql的拼接。随着业务的复杂,test中的判断将会越来越复杂,所以熟悉test中细节处理对动态sql来说尤为重要。
【关于Mybatis动态sql中test的坑点总结】
判断相等的注意点
== 少打一个=
现在我们有一个Integer类型的参数typeId,需要当typeId等于1的时候拼接一串sql,mybatis的xml如下:
AND ISNULL(t.count)
这段代码没问题,但有一个隐藏的风险,假如你少打一个 = 这段test将会始终返回ture这种逻辑错误mybatis会吞掉,所以养成判断时常量写在前变量写在后是有必要的习惯,适用于很多语言,这种风格尤其适用像js这类语言,其实java不经常出现这种等价错误,不过还是建议养成习惯,因为你以后可能接触其他语言。
所以如果这样写
test="count == 1"//当少打了一个等号test="count = 1"//很不幸,这mybatis擅作主张的处理为返回了count,true、false将会由count决定test="1 == count"//当少打了一个等号test="1 = count" //执行时,mybatis会很友好的给你抛个异常
判断字符是否相等
现在我们有一个String类型的参数type,需要当type等于字符串AI的时候拼接一串sql,mybatis的xml如下
AND t.type = 1
动态sql标签的小陷阱 现在MyBatis越来越受大家的喜爱了,它的优势大家都知道,我就不多说了,直接说重点。
MyBatis中提供动态SQL功能,我们可以使用
下面先举个正常的例子
SELECT * FROM BLOG WHERE state = ‘ACTIVE'AND title like #{title}
在上面的例子中,当title不等于null时,
但是,当我们对所有条件进行判断时,你是否会这样写:
SELECT * FROM BLOG WHEREstate = ‘ACTIVE' AND title like #{title}
没问题吧?至少语法上不错的,至少它可以正常生成一个SQL。
但是,不知道你注意到了没,当所有条件都为null的时候,会出现什么情况?
SELECT * FROM BLOG WHERE
看到了吧?这样的SQL能成功执行么?
答案当然是NO。
那么该怎么办?那就要记住了,当你写动态SQL时候,先考虑一下会不会产生所有条件都不成立的情况,会不会出现只有一个WHERE而没有条件的情况,那么你要做的就是加一个
SELECT * FROM BLOGstate = ‘ACTIVE' AND title like #{title}
这样,当所有条件都不成立时,WHERE也不会被拼上。
这时,有机灵的小伙伴发现了,如果第一个条件不成立,第二个成立,那SQL会不会变成这样?
SELECT * FROM BLOG WHEREAND title like #{title}
这个就放心好了,当你用
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- Mybatis判断空字符串的问题
- 网关|如何选取动态IP和静态IP使用()
- python爬虫|关于使用python 动态爬虫Selenium 下载文件,文件类型的设置
- mybatis介绍--基于个人学习JavaWeb的使用
- Mybatis关联查询结果集对象嵌套的具体使用
- 《吃透Mybatis源码》|吃透Mybatis源码-缓存的理解(三)
- 使用Mybatis如何实现删除多个数据
- 进阶C语言|动态内存管理
- 【C语言】指针详解
- TGIP-CN|TGIP-CN 036 报名|预见 2022 · Apache Pulsar 技术进展与社区动态