0%

Mybatis中参数是0时,if不能正确判断的问题

Mybatis中参数是0时,if不能正确判断的问题

问题:

使用mybatis框架时,通过if标签判断一个为0的参数时,会发现无法正确判断;

例如:这里我想判断userstatus为0,就查询出age = 20 的用户

1
2
3
4
5
6
7
8
9
<select>
select *
from user
<where>
<if test="status != null and status !='' ">
and age = 20
</if>
</where>
</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

Untitled

这时把0换成1可以发现转换出来的结果是 1.0 和 0.0

Untitled

空字符串被 doubleValue 方法处理后会返回0.0 ,这个方法在OgnlOps.class 类中

Untitled

调试小提示

maven依赖

1
2
3
4
5
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>2.6.9</version>
</dependency>

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Main {
public static void main(String[] args) throws Exception {
String expression = "age != ''";
Node node = new OgnlParser(new StringReader(expression)).topLevelExpression();
Person person = new Person();
person.setAge(0);
Object value = Ognl.getValue(node, person);
System.out.println(value);
}
}
class Person {
private int age;

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
}

自己调试打断点的话可以从ASTNotEq.class 类中的getValueBody 方法往下看

Untitled

进入OgnlOps.equal 方法,再断点isEqual方法

Untitled

在isEqual方法中断点compareWithConversion 方法

Untitled

进入这个方法后就可以看到这张图片的内容了

Untitled

Mybatis if判断Integer类型的值不等于’’引发的问题(!=’’等价于!=0)_mybatis if标签不等于-CSDN博客

如果觉得我的文章对您有用,赏我一包辣条吧!您的支持将鼓励我继续创作!也可以加我微信一起交流学习,折腾点有意思事情。