mybatis写查询时,正常是先判断是否为空,我们一般是这样写。
<if test="type != null and type != ''"> and type = #{type} </if>
如果不空null并且不是空字符串才去修改这个值,但这样写只能针对字符串(String)类型,如果是Integer类型的话就会有问题了。因为Integer对象,为零则为空,对象判断用equals,传入参数放在括号里,"".equals(参数),不然值为空就会报空指针!你如果作为查询条件,一般查询中用int,可以避免null
Integer i = 0;
i!=''。
mybatis中会返回true。也就是说,mybatis将i==0的值也认定为空字符串。
正常来说,0不为空也不是空字符串。所以,针对这个问题,我的解决办法是:如果类型为Integer类型,我就去掉 != ”的判断,只判断!=null即可。
该问题的根源还是来自编码的不规范,只有String类型才需要判断是否!=''
,其他类型完全没有这个必要。
这里有必要再提一个“坑”,如果你有类似于String str ="A";
<if test="str!= null and str == 'A'">
这样的写法时,你要小心了。因为单引号内如果为单个字符时,如果你看过Mybatis的源码,就会MyBatis的表达式是用OGNL处理的了,而OGNL将会识别为Java 中的 char类型,显然String 类型与char类型做==
运算会返回false
,从而导致表达式不成立。解决方法很简单,修改为<if test='str!= null and str == "A"'>
即可。