Mybatis 作为国内开发中常用到的半自动 orm 框架,信任咱们都很了解,它供给了简单灵敏的xml映射装备,便利开发人员编写简单、复杂SQL,在国内互联网公司使用众多。

本文针对笔者日常开发中对 Mybatis 回来调集类型是否需求判别为 null 结合源码,考虑总结而来

  • Mybatis 版别 3.5.11
  • Spring boot 版别 3.0.1
  • github地址:github.com/wayn111, 欢迎咱们重视,点个star

一. 流程图分析

直接给出博主梳理的调用流程图,从用户dao办法履行开始,经过 MapperProxy 动态代理,对回来成果进行处理再到结束

Mybatis返回集合类型到底是空集合还是null?源码解读
其中有几个比较重要的类,我阐明一下

  • MapperMethod 对SQL履行类型进行判别,判别是insert、update、delete还是select类型,每个类型的处理流程都不一样
  • PrepareStatementHandler 对完结参数替换后的SQL语句履行数据库查询,回来ResultSet
  • DefaultResultHandler 对履行成果进行处理转化

二. DefaultResultSetHandler对回来成果进行处理

MybatisResultSetHandler 接口用于在 StatementHandler 目标履行完查询操作或存储过程后,对成果集或存储过程的履行成果进行处理。同理,当回来调集类型时,Mybatis 终究也会交给 ResultSetHandler 的完结类 DefaultResultSetHandler 来处理,终究在 handleResultSet() 办法中完结对回来调集类型的处理,如下图

Mybatis返回集合类型到底是空集合还是null?源码解读

可以看出 Mybatis 先创建 DefaultResultHandler 目标,接着放入 handleRowValues() 办法中,该办法会把数据库查询回来的多条记载转化为 resultMap 对应的目标放入 defaultResultHandler,终究调用 defaultResultHandler.getResultList() 办法将成果放到终究回来需求的 multipleResults 中。multipleResults 目标中就包括了咱们终究回来的调集目标,Mybatis 会从 multipleResults 中获取第一个元素作为 MapperProxy 的回来成果

三. DefaultResultHandler一个包括实践要回来调集目标的处理类

在上面代码中有一个非常重要的类,那便是 DefaultResultHandler 类,实践上咱们回来的调集目标便是 DefaultResultHandler 内部的成员特点 list ,查看源码

Mybatis返回集合类型到底是空集合还是null?源码解读

  • 里面有一个 list 成员特点,该特点在结构器中由objectFactory目标调用 create(List.class) 办法创建,进入其中

Mybatis返回集合类型到底是空集合还是null?源码解读
resolveInterface(type) 办法中,对传入的类目标做具体转化

Mybatis返回集合类型到底是空集合还是null?源码解读

可以看到 List.class 被转化为 ArrayList.class,接着调用 instantiateClass() 办法,完结空调集的创建,(划要点)由此可见,Mybatis 回来调集类型默认是空调集

  • handlerResult(ResultContext<?> context) 办法,该办法会往 list 中添加元素

  • getResultList() 办法,直接回来list成员特点

结合上面说到的终究调用defaultResultHandler.getResultList()办法将成果放到终究回来需求的multipleResults中,咱们很简单就能知道,咱们回来的调集目标实践上便是 DefaultResultHandler 类中的 list 特点,然后咱们从头梳理下上文中第二部分:

DefaultResultSetHandler对回来成果进行处理

  1. 先创建 DefaultResultHandler 目标,初始化 list 成员特点为空调集
  2. handleRowValues() 办法中,处理回来记载,转化为 resultMap 对应的目标类型,这个过程中,假如数据库回来不为空,就会调用 DefaultResultHandler 类中的 handlerResult(ResultContext<?> context) 办法,将回来目标放入成员特点 list 调集中
  3. 调用 defaultResultHandler.getResultList() 办法,将成员特点 list 调集放入multipleResults,这也就对应了上文说到的 multipleResults 目标中就包括了咱们终究回来的调集目标

四. 总结

由上经过源码分析,咱们知道 Mybatis 回来调集类型默认是空调集,咱们在日常开发中,对于 Mybatis 回来调集类型不需求判别是否为 null,直接调用 list.size() > 0 或许其他第三方工具包供给的调集判空办法即可