接上篇 mybatis核心运行流程之第三阶段--mybatis数据库数据读写设计,上次还留有一个重要的模块,也就是sqlSession进行数据库操作后,对结果集进行解析、映射和转换成POJO的过程代码解析。今天我们就来为此做个圆满收尾,同时也是完成前几篇文章提出那个问题的最后环节解答。

核心运行流程

image.png

对数据库读写阶段的设计还有这最后一个模块了,凤凰涅槃就在此举~~ 最后阶段没有太多的弯弯绕绕、设计套路、目标很明确! 有了前面的基础组件设计和流程的解析和铺垫,最后一搏应该豁然开朗才对。~ 我们直指源码吧!

源码解析

先找准解析的入口: PreparestatementHandler-->query()方法

image.png

核心处理接口ResultSetHandller

进入DefaultResultSetHandler-->handleResultSets()方法,此方法是ResultSet映射和转换的核心骨架方法

image.png

读上面的代码我们大概可以得知:

1. mybatis要转换后的结果集,可能是一个多结果集List容器;

2.首先从结果中获取第1个结果集ResultMap进行解析,最终结果放入multipleResults容器;

3.结果集核心处理方法handleResultSet()方法;

进入内核处理方法: DefaultResultSetHandler-->handleResultSet()

image.png

进入内核处理方法: DefaultResultSetHandler-->handleRowValues()

image.png

在日常开发中,普通结果集使用场景更多一些,这里进入handleRowValuesForSimpleResultMap()方法

image.png

读以上代码,我们可以得知结果集映射的流程为:

1.首先根据分页信息(mybatis内置的内存分页),提取也数据进行映射;

2.分页遍历每一行记录,通过getRowValue()映射单行记录成对象;

3. 通过storeObject()方法保存,行映射转换结果;

接下来,我们重点来看看getRowValue()方法的映射实现

image.png

从以上的代码,我们可以理出一个比较直观处理脉络

image.png

对未指明映射规则的列,进行自动映射

image.png

对已指明映射规则的列,进行映射

image.png

OK, 看到以上的核心代码,是不是对ResultSet进行结果集映射的算法思路和流程都了如指掌了?打完收工,以下我们根据以上的脉络,绘制出ResultSet结果集映射核心调用链路图,大家再过一遍!

总体调用链路

image.png

总结

到这里mybatis三个阶段的核心运行流程的源码解析就全部完毕了。希望能为读源码的同学提供这样一种源码思路:(1)首先看清楚源码的骨架和基础设施,学习它们的思想和设计技巧;(2)但凡框架级源码都比较多,分析全量的源码不太现实(时间成本也太高),应该找常用或核心业务模块,理顺其整体运行流程;(3)在前两步的基础上,重点分析感兴趣设计的优缺点,从而提升自己的架构和设计能力! 今天的源码分享就先到这里,更多源码和干货,请继续关注!