mybatis源码解析 - 核心流程之ResultSet解析

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

核心运行流程sql

image.png

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

源码解析mybatis

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

image.png

核心处理接口ResultSetHandller框架

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

image.png

读上面的代码咱们大概能够得知:学习

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

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)在前两步的基础上,重点分析感兴趣设计的优缺点,从而提高本身的架构和设计能力! 今天的源码分享就先到这里,更多源码和干货,请继续关注!

相关文章
相关标签/搜索