Mybatis在进行<if test="status != null and status != ''">
判空操做时,若是status为0的时候,该判断条件的值为false,也就是说Mybatis此时把0做为null来进行判断的,因此遇到这种状况时,只能按照下面这个方法来办!java
遇到这个问题时,我翻看了Mybatis的源码,发现其在ExpressionEvaluator.java类的evaluateBoolean方法处返回了false,这个源码包的分析方式和源码分析 There is no getter for property named ‘*’ in ‘class java.lang.String有极大的相同之处。sql
但发现了问题,也然并卵,修改Mybatis的源码我是不行,因此只能曲线救国!数据库
数据库字段mybatis
`status` tinyint(2) NOT NULL COMMENT '0未支付,1已支付',
此时0表示未支付,1表示支付,那么按照通常的逻辑来看,查询语句须要写成这样的形式:源码分析
select * from ym_deals y WHERE d.deal_id = 1 <if test="status != null and status != ''"> and y.status = #{status} </if>
其意义在于,当查询参数不传递未支付或者支付条件时,就须要查询status为0和1的所有结果,也就是说没有条件and y.status = #{status}
,但事实就纠结了,当status传递的参数为1时,if条件的结果为true,也就是说sql语句变成了select * from ym_deals y WHERE d.deal_id = 1 and y.status=1
,查询结果正常,但若是status为0此时,sql语句变成了select * from ym_deals y WHERE d.deal_id = 1
,与预期结果select * from ym_deals y WHERE d.deal_id = 1 and y.status=0
显然是不符的!lua
也就是说,Mybatis自做主张的把status为0的条件当作了if的false结果!spa
public static int parseStringToInt(Object parameter, int defualtValue) { try { if ((parameter == null) || (parameter.equals(""))) { return defualtValue; } return Integer.parseInt(parameter.toString()); } catch (Exception ex) { } return 0; }
vo.addParams("status", StrUtil.parseStringToInt(vo.getParams("status"), -1));
也就是说在查询全部支付状态的订单时,把status的值转换为-1..net
select * from ym_deals y WHERE d.deal_id = 1 <if test="status != -1"> and y.status = #{status} </if>
此时再也不判空,而判-1。code
按照以上的办法就解决了问题,不知道你那是否有更好的解决办法?blog
这篇文章发表以后,有热心的朋友给出下面的解决办法:
lengjian68 status是Integer 类型的 把status!=‘’ 给去掉
去掉就行了1楼 qq_30159115 肯定是 int类型的就不用 判断 status != ‘’ 就搞定了
Re: Optimistic_ 发表 回复qq_30159115:给力啊!感谢!
判断不是为空,对于int类型就是在判断不为0么?
按照朋友给出的观点,我尝试了一下,结果如朋友所说,status肯定为integer类型的,把status!=”给去掉就行了。
那么如今从新来看,我原本的作法就有问题,integer类型的,我干吗要用status!=”来进行判断,这显然是一种不负责任的作法,至于<if test="status != null and status != ''">
的判断条件,显然是错误的,从原则上来说,该判断条件只能来判断status为string类型的,用来判断integer类型,岂不贻笑大方,至于后面我提出的解决方案,显然也就无力苍白,我只想把这篇文章立马删掉,好再也不误导他人。
但看到
Re: Optimistic_ 发表 回复qq_30159115:给力啊!感谢!
判断不是为空,对于int类型就是在判断不为0么?
下面这位朋友的疑问,我以为,这篇文章存在还有一些价值,由于还有和我同样的朋友在犯错,“判断不是为空,对于int类型就是在判断不为0么?”这种认识显然是另一种错误,integer类型很明显存在为null的状况,那么对于int类型固然不是在判断为0的。(固然了,这位仁兄说int类型,在严格意义上讲,就不存在null的可能了,那么我只能武断的推测任务,这位朋友是在说integer,请原谅个人鲁莽)
那么得出如下结论:
<if test="status != null">
中status为integer类型的,status=0的判断结果为true。<if test="status != null and status != ''">
中status为integer类型的,status=0的判断结果为false,mybatis把status做为了string来进行判断。<if test="status != -1">
在有的时候也是一种曲线救国。