当使用 Mybatis 的时候,返回类型为 list 时,为什么不用判断非空

时间:2024-01-25 12:38:28

当使用 Mybatis 的时候,返回类型为 list 时,为什么不用判断非空

学习改变命运,技术铸就辉煌。

大家好,我是銘,全栈开发程序员。

当使用 Mybatis 的时候,返回类型为 list 时,为什么不用判断非空_空指针异常

img

使用 Mybatis 无数据时的返回值问题

最近在使用 Mybatis 与数据库交互的时候,需要将返回的结果进行遍历,写完之后, 想起来要是数据库里没有对应的值,那遍历的时候会不会出现空指针异常?

public AjaxResult list(SysDept dept)
    {
        List<SysDept> depts = deptService.selectDeptList(dept);
        return success(depts);
    }

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

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

下面我进行了一些测试:

Map<String ,String> findmap(String id);
List<Map<String,String>> findlist(String id);
String findstring(String id);
Set<Long> findset(String id);
Long findlong(String id);
int findint(String id);

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

System.out println("当前map类型是否null:"+(mapper. findMap (id) == null)+"n'+mapper,findMap(id));
System.out println("当List<map)类型是为null:"+(mapper. findList (id) == null)+n'+mapper,findList (id));
System.out println("前String类型是价null:"+(mapper, findString (id) == null)+"n'+mapper,findString(id)):
System.out println("当前Set<Long)类型是为null:"+(mapper,findSet (id) == null)+"n'+mapper,findSet (id));
System.out.println("当前Long类型是否为null:"+(mapper, findLong (id) == null)+"n'+mapper, findLong(id));
当前map类型是否为 null:true 
null
当前List<map>类型是否为 null:false
[]
当前String类型是否为 null:true
null
当前Set<Long>类型是否为 null:false
[]
当前Long类型是否为 null:true
null

结论

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

并且对设定为 List 与 Set 类型的返回值进行空指针校验是无意义的

List<SysDept> depts = deptService.selectDeptList(dept);
//无需判断是否为 null
if(depts == null){
    
}

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

Map<String,String> depts = deptService.selectDeptList(dept);
//需要判断是否为 null
if(depts == null){
    //然后在判断值是否大于 0 
    if(depts.size > 0){
        
    }
    
}
//不能用int,否则没有值时会报错
Integer depts = deptService.selectDeptList(dept);
//需要判断是否为 null
if(depts == null){
    //然后在判断值是否大于 0 
    if(depts.size > 0){
        
    }
    
}

对数据库返回值进行处理时要小心,不同的返回集合类型将导致不同的空值校验逻辑。