Mybatis+0+null
2016-01-14 16:47
211 查看
Mybatis在进行
但发现了问题,也然并卵,修改Mybatis的源码我是不行,所以只能曲线救国!
此时0表示未支付,1表示支付,那么按照一般的逻辑来看,查询语句需要写成这样的形式:
其意义在于,当查询参数不传递未支付或者支付条件时,就需要查询status为0和1的全部结果,也就是说没有条件
也就是说,Mybatis自作主张的把status为0的条件当做了if的false结果!
也就是说在查询所有支付状态的订单时,把status的值转换为-1.
此时不再判空,而判-1。
按照以上的办法就解决了问题,不知道你那是否有更好的解决办法?
感谢您阅读【沉默王二的博客】,如果王二的博客给您带来一丝帮助或感动,我(也就是王二)将不甚荣幸。
如果您碰巧喜欢,可以留言或者私信我,这将是我鼓捣更多优秀文章的最强动力。
<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感谢您阅读【沉默王二的博客】,如果王二的博客给您带来一丝帮助或感动,我(也就是王二)将不甚荣幸。
如果您碰巧喜欢,可以留言或者私信我,这将是我鼓捣更多优秀文章的最强动力。
相关文章推荐
- POJ2828(插队问题)
- Eclipse报错
- System.Timers.Timer传参问题
- Swift 变量与常量
- 讲解C++编程中Address-of运算符&的作用及用法
- 如何生成HTMLTestRunner报告
- Android中WebView和JavaScript(JS)的互相调用
- 数据共享ContentProvider
- Linux中Tomcat的安装和配置方法
- Dom节点对象转化为字符串
- 转:关于A类,B类,C类IP地址的网段和主机数的计算方法
- android studio应用(三):as gradle 解决方法数超过65535问题
- nginx 源码安装配置
- Golang初级系列教程-继承和子类
- iOS开发-图片高斯模糊效果
- Ios中时间无法响应
- 跨域问题:No 'Access-Control-Allow-Origin' header is present on the requested resource.
- HTTP服务端接口模拟工具-HttpServerMockTool
- dataTable一些使用方法
- 11gR2 DataGuard standby开启实时查询(Real-time query)备份standby恢复报错:ORA-01194 ORA-01110