Mybatis持久层 if标签 对于 Integer类型的正确判断方式

7 篇文章 0 订阅

问题描述

今天在公司当写代码的时候发现了一个问题
就是我一个列表的查询接口,并没有根据传入的筛选条件进行筛选,字段 execState = 0 的时候,筛选条件没有用,会查询出所有数据。 但是如果 execState 传入的是其他的值,就没有影响

排查过程

查看日志,发现 mybatis拼接出来的sql where子句中并没有 这段
但是前端实际是传了 execState = 0 的
所以就打算去排查下

  1. 字段名是否写错了
  2. where子句中是否漏掉了该判断
  3. service层是否接收到了参数之后没有使用

检查了这些都没有问题
后面检查传入的参数类:
发现 execState这个字段是 Integer类型的。
再看原来的mapper文件中写的sql是这样的

<if test="execState != null and execState != ''"> and sef.exec_state = #{execState}</if>

大胆设想

大胆猜想: 难道是 mybatis 把这个 execState = 0 在 后面的判断条件 execState != ' '时 当作是 false了?
感觉也只可能是这样,才可能误伤吧

动手实践

然后修改一下 if标签的判断条件,把后面的 execState != ' ' 去掉
本地调试,传入参数 execState = 0
发现这时候 sql正常了, where子句会出现 判断条件
问题到这儿应该就解决了

资料查询

MyBatis解析if标签时其表达式使用OGNL处理的。

Interpreting Objects as Booleans
Any object can be used where a boolean is required. OGNL interprets objects as booleans like this:
If the object is a Boolean, its value is extracted and returned;
If the object is a Number, its double-precision floating-point value is compared with zero; non-zero is treated as true, zero as false;
If the object is a Character, its boolean value is true if and only if its char value is non-zero;
Otherwise, its boolean value is true if and only if it is non-null.

如果对象是Number类型,当传值为0时会被解析成false,否则为true,浮点型0.00也是如此。所以这里直接解析成false。只有String类型才需要判断是否 != ' ',其他类型完全没有这个必要。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值