我们在java语言中,数字0和"" 肯定是不相等的,这个毫无疑问!但是在mybatis中,却认为他俩货是相等的。
比如我们在mapper文件中写了
<if test="testNum != null and testNum != ' ' ">
test_num = #{testNum ,jdbcType = DECIMAL}
</if>
若testNum=0,这个条件将不被拼接在sql中。
原因如下:
在解析这个if条件时,会调用到mybatis的IfSqlNode#apply方法,它会调用ExpressionEvaluator#evaluateBoolean方法,它紧跟着调用OgnlCache#getvalue方法,接着调用Ognl#getvalue方法,最后调用的是OgnlOps#equal方法,(调用OgnlOps#isEqual方法,调用compareWithConversion方法,接着调用doubleValue方法,在这个doubleValue方法转化为double类型的0来进行处理)。
解决办法,对于数值型的,只能这样写才能解决遇0不处理的情况:
<if test="testNum != null ">
test_num = #{testNum ,jdbcType = DECIMAL}
</if>