Mybatis中参数是0时,if不能正确判断的问题
问题:
使用mybatis框架时,通过if标签判断一个为0的参数时,会发现无法正确判断;
例如:这里我想判断user
的status
为0,就查询出age = 20
的用户
1 | <select> |
在实际运行后会发现根本不执行 and age = 20
这个条件,通过断点调试发现其实status的值传过来了是0,test="status != null and status !=''
这个条件应该生效,当我把status改成1 或者其他值,又可以正常判断了。
经过多次测试,发现参数为Integer类型的0,mybatis会认为是 ‘’,这就导致了status !=''
这个条件 判断结果为false,在他眼里 status=0 ⇒ status =’’
把status !=''
这个条件删了就可以了,毕竟之前的Integer数据类型不允许status=’’
Ongl源码分析
mybatis使用ongl包处理xml中的表达式,在对数字类型和空字符串进行比较的时候(status !=''
),空字符串会被转换成0.0,这样原本不一样的 0 和 “”
现在却变成了一样的0.0 和 0.0
这时把0换成1可以发现转换出来的结果是 1.0 和 0.0
空字符串被 doubleValue
方法处理后会返回0.0
,这个方法在OgnlOps.class
类中
调试小提示
maven依赖
1 | <dependency> |
测试代码
1 | public class Main { |
自己调试打断点的话可以从ASTNotEq.class
类中的getValueBody
方法往下看
进入OgnlOps.equal 方法,再断点isEqual方法
在isEqual方法中断点compareWithConversion
方法
进入这个方法后就可以看到这张图片的内容了
Mybatis if判断Integer类型的值不等于’’引发的问题(!=’’等价于!=0)_mybatis if标签不等于-CSDN博客