您的位置:首页 > 其它

Mybatis+0+null

2016-01-14 16:47 211 查看
Mybatis在进行
<if test="status != null and status != ''">
判空操作时,如果status为0的时候,该判断条件的值为false,也就是说Mybatis此时把0作为null来进行判断的,所以遇到这种情况时,只能按照下面这个方法来办!


一、源码调查结果

遇到这个问题时,我翻看了Mybatis的源码,发现其在ExpressionEvaluator.java类的evaluateBoolean方法处返回了false,这个源码包的分析方式和源码分析 There is no getter for property named ‘*’ in ‘class java.lang.String有极大的相同之处。

但发现了问题,也然并卵,修改Mybatis的源码我是不行,所以只能曲线救国!

二、场景分析

数据库字段

[code]  `status` tinyint(2) NOT NULL COMMENT '0未支付,1已支付',


此时0表示未支付,1表示支付,那么按照一般的逻辑来看,查询语句需要写成这样的形式:

[code]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
显然是不符的!

也就是说,Mybatis自作主张的把status为0的条件当做了if的false结果!

三、解决办法

①、对传递参数拦截

[code]    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;
    }


[code]vo.addParams("status", StrUtil.parseStringToInt(vo.getParams("status"), -1));


也就是说在查询所有支付状态的订单时,把status的值转换为-1.

②、重构Mybatis的查询语句

[code]select * from ym_deals y WHERE d.deal_id = 1

        <if test="status != -1">
    and y.status = #{status}
</if>


此时不再判空,而判-1。

按照以上的办法就解决了问题,不知道你那是否有更好的解决办法?

相关文章

源码分析 There is no getter for property named ‘*’ in ‘class java.lang.String

感谢您阅读【沉默王二的博客】,如果王二的博客给您带来一丝帮助或感动,我(也就是王二)将不甚荣幸。

如果您碰巧喜欢,可以留言或者私信我,这将是我鼓捣更多优秀文章的最强动力。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: