我们在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>
本文揭示了Mybatis中0和空字符串被视为相等的底层原因,以及如何避免在if条件判断中误处理0的技巧。通过解析OgnlOps#equal方法的工作流程,提出了解决数值型条件判断的正确写法。
1375

被折叠的 条评论
为什么被折叠?



