前言
最近遇到的一个关于mybatis的xml条件判断的问题,平时写的都是以判断空属性是否为空,例如:
1 |
|
所以在这一块并没有足够的重视。
正文
最近刚好要写一个与上边不一样的写法,但是还是以上面的为基础,是对属性的值进行判断: 判断type属性的值
1 |
|
结果就是无论我传什么值,SQL中都是执行的status=2。 在网上也找到了很多解决办法,但是都不是自己想要的结果;
网上的解决办法
- 内双外单
1 |
|
- 加.toString()
1 |
|
源码分析
从参考文章1中可以知道,mybatis使用ognl表达式来进行解析的;下面使用ognl来模拟解析;且不使用上面的两种方法;
pom引入
1 |
|
测试代码:
1 |
|
自己的解决办法
除了网上的那两种办法,还有其他的一些方法可以解决我遇到的问题;
- 由于我比较的是数字类型,将传入的值改为数字类型的值传入,再将mybatis的xml中的单引号去掉,如下:
1 |
|
ognl源码解析
下面对ognl的源码进行分析:
1. 根据Ognl.getValue方法定位到 OgnlOps类的isEqual方法
1 |
|
这个方法传入了两个值,第一个值是调用mybatis方法传入的值,这个值的类型就有很多种了,例如BigDecimal,String,Integer等等, 第二个是从mybatis的xml中读取出来的值,这个值要根据xml文件中的写法来判断了:
- 外双内单 1.1 单长度为1时读取为Character, 1.2 单长度大于1时,读取为String
再根据第三个判断定位到compareWithConversion方法
2. compareWithConversion方法
- 该方法以getNumericType方法来判断参数数字类型,其实可以根据方法名判断出,进入到这里后,都是做数字类型判断,再转换,再比较
- 在转换类型的过程中,如果传入的字符无法被转换,将抛出错误,例如:传入的值为字母就无法被转换;
- 当mybatis的xml文件中的判断值为”“或者’‘时,该方法会将值赋值为0;
- 当mybatis的xml文件中的判断值为’‘,且里面的值为单数值时,注意转换的值并不是原值;例如:’6’解析为double:54.0
1 |
|
总结
-
如果属性不为数字类型,使用上边的网上的解决办法就差不多可以了
-
如果属性为数字类型,例如Integer,BigDecimal等等会有一个问题 当传入的值为0时,且当mybatis的xml文件中的比较为’‘或者”“时,比较的结果就是false,如下:
1 |
|
解决办法:
- 将传入的值类型转换为String类型
- 在mybatis的xml中修改,如下:
1 |
|
这个根据自己传入值类型而定;
最后
项目地址:https://github.com/guodayede/java-study/tree/master/ognl