<if>
标签判断相等条件时,有时判断会不起作用,一般来说都是细节错误。比如入参没有判空,或者等式左右的比较对象不是同类型(入参String比较int或是入参String比较char)。
eg. enable状态为Y时,查询某条件,比如开启日志则查询时也带出LOG记录
toString()
写法
入参调用toString()
,每次toString()
前都需要判空
<if test="enable != null and enable.toString() == 'Y'.toString()">and LOG IS NOT NULL
</if>
这里还有个隐藏bug,入参Y
直接和'Y'
比较是不相等的,下面的写法是无法匹配的
<if test="enable != null and enable.toString() == 'Y'">and LOG IS NOT NULL
</if>
因为MyBatis用OGNL表达式动态解析生成 SQL 语句,入参被解析成String
,'Y'
被解析成char
,Java是强类型的,char
和String
是不相等的
简单修复这个bug可以把'Y'
替换成"Y"
,变成String
后再和入参比较
<if test="enable != null and enable.toString() == "Y" ">and LOG IS NOT NULL
</if>
@java.lang.String@valueOf()
写法
入参用valueOf
转换一下,然后equals
比较
hint: @java.lang.String@valueOf('req.enable')
不用判空,null
会变成字符串"null"
<if test="@java.lang.String@valueOf(req.enable).equals("Y")">and LOG IS NOT NULL
</if>
第二种写法省去了判空这一步,可以避免一些bug,不过就是看起来很繁琐。
参考链接
OGNL - Apache Commons OGNL - Object Graph Navigation Library
MyBatis 源码解析:OGNL 表达式解析与使用-CSDN博客