接上篇 mybatis核心运行流程之第三阶段--mybatis数据库数据读写设计,上次还留有一个重要的模块,也就是sqlSession进行数据库操做后,对结果集进行解析、映射和转换成POJO的过程代码解析。今天咱们就来为此作个圆满收尾,同时也是完成前几篇文章提出那个问题的最后环节解答。算法
核心运行流程sql
对数据库读写阶段的设计还有这最后一个模块了,凤凰涅槃就在此举~~ 最后阶段没有太多的弯弯绕绕、设计套路、目标很明确! 有了前面的基础组件设计和流程的解析和铺垫,最后一搏应该豁然开朗才对。~ 咱们直指源码吧!数据库
源码解析mybatis
先找准解析的入口: PreparestatementHandler-->query()方法架构
核心处理接口ResultSetHandller框架
进入DefaultResultSetHandler-->handleResultSets()方法,此方法是ResultSet映射和转换的核心骨架方法ide
读上面的代码咱们大概能够得知:学习
1. mybatis要转换后的结果集,多是一个多结果集List容器;
spa
2.首先从结果中获取第1个结果集ResultMap进行解析,最终结果放入multipleResults容器;设计
3.结果集核心处理方法handleResultSet()方法;
进入内核处理方法: DefaultResultSetHandler-->handleResultSet()
进入内核处理方法: DefaultResultSetHandler-->handleRowValues()
在平常开发中,普通结果集使用场景更多一些,这里进入handleRowValuesForSimpleResultMap()方法
读以上代码,咱们能够得知结果集映射的流程为:
1.首先根据分页信息(mybatis内置的内存分页),提取也数据进行映射;
2.分页遍历每一行记录,经过getRowValue()映射单行记录成对象;
3. 经过storeObject()方法保存,行映射转换结果;
接下来,咱们重点来看看getRowValue()方法的映射实现
从以上的代码,咱们能够理出一个比较直观处理脉络
对未指明映射规则的列,进行自动映射
对已指明映射规则的列,进行映射
OK, 看到以上的核心代码,是否是对ResultSet进行结果集映射的算法思路和流程都了如指掌了?打完收工,如下咱们根据以上的脉络,绘制出ResultSet结果集映射核心调用链路图,你们再过一遍!
整体调用链路
总结
到这里mybatis三个阶段的核心运行流程的源码解析就所有完毕了。但愿能为读源码的同窗提供这样一种源码思路:(1)首先看清楚源码的骨架和基础设施,学习它们的思想和设计技巧;(2)但凡框架级源码都比较多,分析全量的源码不太现实(时间成本也过高),应该找经常使用或核心业务模块,理顺其总体运行流程;(3)在前两步的基础上,重点分析感兴趣设计的优缺点,从而提高本身的架构和设计能力! 今天的源码分享就先到这里,更多源码和干货,请继续关注!