简介
在mybatis中要实现动态sql,重要方式就是使用
test
,通过其中表达式返回的true、false来达到动态sql的拼接。随着业务的复杂,test中的判断将会越来越复杂,所以熟悉test
中细节处理对动态sql来说尤为重要。
判断相等的注意点
== 少打一个=
现在我们有一个Integer类型的参数typeId,需要当typeId等于1的时候拼接一串sql,mybatis的xml如下:
<if test="count == 1">
AND ISNULL(t.count)
</if>
这段代码没问题,但有一个隐藏的风险,假如你少打一个 = 这段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如下
<if test="type== 'AI' ">
AND t.type = 1
</if>