关于Mybatis动态sql中test的坑点总结

网友投稿 1136 2022-11-08

关于Mybatis动态sql中test的坑点总结

关于Mybatis动态sql中test的坑点总结

目录总结Mybatis动态sql中test的坑判断相等的注意点判断字符是否相等动态sql标签的小陷阱下面先举个正常的例子

总结Mybatis动态sql中test的坑

在mybatis中要实现动态sql,重要方式就是使用test,通过其中表达式返回的true、false来达到动态sql的拼接。随着业务的复杂,test中的判断将会越来越复杂,所以熟悉test中细节处理对动态sql来说尤为重要。

判断相等的注意点

== 少打一个=

现在我们有一个Integer类型的参数typeId,需要当typeId等于1的时候拼接一串sql,mybatis的xml如下:

AND ISNULL(t.count)

这段代码没问题,但有一个隐藏的风险,假如你少打一个 = 这段tedWWipWbIvHst将会始终返回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功能,我们可以使用等等,这样我们就可以写出根据条件生成的动态SQL了,但是,在这中间,我们经常用到的标签有一个小误区,一不小心就会掉下去

下面先举个正常的例子

parameterType="Blog" resultType="Blog">

SELECT * FROM BLOG

WHERE state = ‘ACTIVE'

AND title like #{title}

在上面的例子中,当title不等于null时,标签中间的条件才会被拼接上,这样,SQL语句就是动态的了。

但是,当我们对所有条件进行判断时,你是否会这样写:

parameterType="Blog" resultType="Blog">

SELECT * FROM BLOG

WHERE

state = ‘ACTIVE'

AND title like #{title}

没问题吧?至少语法上不错的,至少它可以正常生成一个SQL。

但是,不知道你注意到了没,当所有条件都为null的时候,会出现什么情况?

SELECT * FROM BLOG

WHERE

看到了吧?这样的SQL能成功执行么?

答案当然是NO。

那么该怎么办?那就要记住了,当你写动态SQL时候,先考虑一下会不会产生所有条件都不成立的情况,会不会出现只有一个WHERE而没有条件的情况,那么你要做的就是加一个标签将所有条件包起来。

parameterType="Blog" resultType="Blog">

SELECT * FROM BLOG

state = ‘ACTIVE'

AND title like #{title}

这样,当所有条件都不成立时,WHERE也不会被拼上。

这时,有机灵的小伙伴发现了,如果第一个条件不成立,第二个成立,那SQL会不会变成这样?

SELECT * FROM BLOG

WHERE

AND title like #{title}

这个就放心好了,当你用标签包围条件后,它会自动去掉AND的。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Connect by--PLSQL中的接力棒传递游戏
下一篇:对象表
相关文章

 发表评论

暂时没有评论,来抢沙发吧~