Mybatics中使用andIn语句查询数据为空处理方式

一、问题事件描述

项目开发过程中代码上增加一个id的查询条件,发现报错信息直接:“数据库异常”。初看时是比较疑惑的,因为本地测试明明都是返回查询正常,为何测试环境一再报错。回溯了一下代码,发现SQL确实有异常,主要还是对于mybatics中的andIn语句的使用不当。

首先去数据库中把日志打印的SQL复制出来,发现出现了这样一个问题:

在这里插入图片描述

原代码:
在这里插入图片描述

很明显的问题,本来需要实现的是m_id in(‘1’,‘2’) ,当数组id的数据不为空时,该语句是完全不会出问题,而一旦id数据为空,则会出现上述的SQL查询,致使因为SQL异常而报错。因此需要考虑当id为空的情况。

修改后:
在这里插入图片描述

修改后则考虑到当id为空的情况,用到了CollectionUtils.isNotEmpty作为id是否为空的判断(该语句常用于集合是否为空),若mId不为空,则按照原计划使用mybatics中的andIn来从数据库中查询;若mId为空的情况,则返回空。上述代码即可实现。

二、解决过程尝试不同方法

在处理问题的过程中发现一个比较严重及常见的问题,以下整理出来。

1、else的逻辑处理必不可少。

一般情况下,else的逻辑处理是不能缺少的,从开发者的目标上来说,开发者希望达到的目标是筛选出mId={#id}的数据,这个可以在if语句中轻松实现。而如果缺少了else的逻辑处理,则会出现,如果id为空的情况下,不使用该查询条件,相当于在本地数据库中会出现这样的一条SQL逻辑。如下图:
在这里插入图片描述
在这里插入图片描述
则会出现,把更多的全部数据查询出来。开发者的目的本是当id为空,则查询出id为空的数据,而如果上述这样写的话,则相当于把查询条件剔除,会出现查询全部数据,明显与开发者的目标相反。

2、SQL的可选择性。

在明确else的逻辑不可或缺的情况下,则明确思路必须要通过查询为空的值作为查询条件,思路有两种,具体的SQL实现可以如下:
继续使用in语句:
在这里插入图片描述
在这里插入图片描述
强制赋值为空:
在这里插入图片描述
在这里插入图片描述
即使看上去非常合理,但是写完之后发现还是有点小问题,因为不能确定数据库中m_id这个字段会不会存在空的情况。因为m_id不是主键,这样会把m_id=''的数据筛选出来,那么count(*)也不为空,则与需求相违背。

3、关于NULL和空的区别(题外话)。

此外,关于NULL和空的情况都需要考虑进去,如果要想实现以下语句,则可以通过拼接SQL的方式实现。
在这里插入图片描述

4、返回空的不同使用。

鉴于以上的描述,想来最简单的办法是直接返回空即可。当id为空的时候,不该查询出任何的数据,则直接在方法中return 一个空即可。
如果该语句是处于一个方法中Page<>方法中的,则可直接 return nullPage(); 返回页面数据为空。

在这里插入图片描述
如果该语句是处于一个lambda表达式中的重载方法void中,则直接在mybatics执行语句之前retrun 直接结束该方法,不做后续查询,返回数据为空。
在这里插入图片描述

三、结论

最后,用一个非常简单的办法直接return结束不查询,即可实现开发者的目标。
在这里插入图片描述
在这里插入图片描述
当id不为空时,则通过andIn语句筛选出id的数据;当id为空时,直接返回空。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值