Mybatis 作为国内开发中常用到的半自动 orm 框架,信任咱们都很了解,它供给了简单灵敏的xml映射装备,便利开发人员编写简单、复杂SQL,在国内互联网公司使用众多。
本文针对笔者日常开发中对 Mybatis
回来调集类型是否需求判别为 null
结合源码,考虑总结而来
-
Mybatis
版别 3.5.11 -
Spring boot
版别 3.0.1 - github地址:github.com/wayn111, 欢迎咱们重视,点个star
一. 流程图分析
直接给出博主梳理的调用流程图,从用户dao办法履行开始,经过 MapperProxy
动态代理,对回来成果进行处理再到结束
其中有几个比较重要的类,我阐明一下
-
MapperMethod
对SQL履行类型进行判别,判别是insert、update、delete还是select类型,每个类型的处理流程都不一样 -
PrepareStatementHandler
对完结参数替换后的SQL语句履行数据库查询,回来ResultSet -
DefaultResultHandler
对履行成果进行处理转化
二. DefaultResultSetHandler对回来成果进行处理
在 Mybatis
中 ResultSetHandler
接口用于在 StatementHandler
目标履行完查询操作或存储过程后,对成果集或存储过程的履行成果进行处理。同理,当回来调集类型时,Mybatis
终究也会交给 ResultSetHandler
的完结类 DefaultResultSetHandler
来处理,终究在 handleResultSet()
办法中完结对回来调集类型的处理,如下图
可以看出 Mybatis
先创建 DefaultResultHandler
目标,接着放入 handleRowValues()
办法中,该办法会把数据库查询回来的多条记载转化为 resultMap
对应的目标放入 defaultResultHandler
,终究调用 defaultResultHandler.getResultList()
办法将成果放到终究回来需求的 multipleResults
中。multipleResults
目标中就包括了咱们终究回来的调集目标,Mybatis
会从 multipleResults
中获取第一个元素作为 MapperProxy
的回来成果
三. DefaultResultHandler一个包括实践要回来调集目标的处理类
在上面代码中有一个非常重要的类,那便是 DefaultResultHandler
类,实践上咱们回来的调集目标便是 DefaultResultHandler
内部的成员特点 list
,查看源码
- 里面有一个
list
成员特点,该特点在结构器中由objectFactory
目标调用create(List.class)
办法创建,进入其中
在 resolveInterface(type)
办法中,对传入的类目标做具体转化
可以看到 List.class
被转化为 ArrayList.class
,接着调用 instantiateClass()
办法,完结空调集的创建,(划要点)由此可见,Mybatis
回来调集类型默认是空调集
-
handlerResult(ResultContext<?> context)
办法,该办法会往list
中添加元素 -
getResultList()
办法,直接回来list成员特点
结合上面说到的终究调用defaultResultHandler.getResultList()
办法将成果放到终究回来需求的multipleResults
中,咱们很简单就能知道,咱们回来的调集目标实践上便是 DefaultResultHandler
类中的 list
特点,然后咱们从头梳理下上文中第二部分:
DefaultResultSetHandler对回来成果进行处理
- 先创建
DefaultResultHandler
目标,初始化list
成员特点为空调集 - 在
handleRowValues()
办法中,处理回来记载,转化为resultMap
对应的目标类型,这个过程中,假如数据库回来不为空,就会调用DefaultResultHandler
类中的handlerResult(ResultContext<?> context)
办法,将回来目标放入成员特点list
调集中 -
调用
defaultResultHandler.getResultList()
办法,将成员特点list
调集放入multipleResults
中,这也就对应了上文说到的multipleResults
目标中就包括了咱们终究回来的调集目标
四. 总结
由上经过源码分析,咱们知道 Mybatis
回来调集类型默认是空调集,咱们在日常开发中,对于 Mybatis
回来调集类型不需求判别是否为 null
,直接调用 list.size() > 0
或许其他第三方工具包供给的调集判空办法即可