Mybatis+Mysql无查询数据时List、Set、Map的返回值为null还是空集

Mybatis+Mysql无查询数据时的返回值问题

前言

最近在写通过mybatis与数据库交互的接口时,需要将数据库返回的结果集执行迭代遍历的操作。代码完成后突然想到,若前端传回数据异常,导致Sql的查询语句在限定条件下无法查到指定的数据,岂不是会在遍历的时候出现空指针异常的隐藏bug?
但是这样的情况在测试接口时故意传入无对应数据的限定条件情况下却并未发生,由此引发我的一番猜想:难道mybatis在查不到数据的时候返回的结果并非Null值?

原本猜测可能出现空指针异常的代码:

空指针异常代码 图示中我将数据库查询的List结果集不加任何校验直接进行遍历操作:按猜想若sql语句返回结果为空将发生空指针异常bug;
但实际情况却是,无论sql语句是否查询到数据,该代码段都不会发生空指针异常错误

  • 这是为什么?难道是返回参数设定为List集合时,mybatis会自动将返回值变成非null类型吗?其他类型集合如set、map、类类型如String、Long返回在查询不到数据的情况下返回值是null吗?

    带着疑问我进行了一些测试:

测试结果如下

  • mapper层代码:设定返回值类型 与mybatis的xml文件对应

hguyguigiugygiyu

  • 测试代码:将返回值结果与null指针作判断 同时输出返回结果

在这里插入图片描述

  • 测试结果:

在这里插入图片描述

由此知:

1.当返回值类型设定为List<泛型类型无所谓>、set<泛型类型无所谓>时,sql语句查询无结果时的返回值将是一个空的集合:类似:[ ] 这种类型。此时无需对返回结果进行任何校验,因为返回的结果是一个空集合,遍历空集合时,遍历内逻辑将不会执行。同时不会出现空指针异常错误。

并且对设定为List与Set类型的返回值进行空指针校验是无意义的
也就是说List<String> test = iMapper.getTestDemo(param); if(test == null){ //逻辑代码 }
这种校验没有意义,test值永远不为null 逻辑代码永远不会被执行;
要对List、set类型返回结果进行是否为空值校验,必须校验他们的size大小,当size为0意味着查询结果为空

2.当返回值为map、对象类型(String)返回值时。,sql语句查询无结果时将返回null值
此时若直接对该map进行遍历操作便会出现空指针异常bug,因此必须对该返回结果进行是否为null的校验。

Map<String,String> test = iMapper.getTestDemo(id);
if(test == null) return;
//此时 if内逻辑将可能执行

同样的,map类型数据库查询结果不能用map.size进行是否有查询结果的校验,因为这样也会导致空指针异常。

总结

对数据库返回值进行处理时要小心,不同的返回集合类型将导致不同的空值校验逻辑:
对List、set集合要进行 (值.size) 的校验。
对Map与普通对象类型返回值要先进行ISNull校验,再进行 (值.size) 的校验(因为即使Map等类型不为null 也很有可能为 :“ 空集合”) 并且Map等类型不能直接进行(值.size)校验。

由此才能保证此处校验不至于出现空指针异常bug

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值