在上一讲中,我们介绍了 MyBatis 中结果集映射的核心逻辑位于 DefaultResultSetHandler 之中,然后深入分析了 DefaultResultSetHandler 与简单结果集映射相关的核心实现,这是 MyBatis 整个结果集映射功能的基本。

今天我们就紧接着上一讲,继续介绍 DefaultResultSetHandler 中关于嵌套映射、延迟加载以及多结果集处理的内容。

嵌套映射

处理简单映射只是所有映射处理逻辑中的一个分支,handleRowValues() 方法还有另一条分支是用来处理嵌套映射的,也就是 handleRowValuesForNestedResultMap() 方法。

handleRowValuesForNestedResultMap() 方法处理嵌套映射的核心流程如下所示。

通过 skipRows() 方法将 ResultSet 的指针指向目标行。

执行 shouldProcessMoreRows() 方法检测 ResultSet 中是否包含能继续映射的数据行,如果包含,就开始映射一个具体的数据行。

通过 resolveDiscriminatedResultMap() 方法处理 ResultMap 中的 Discriminator 对象,确定最终使用的 ResultMap 映射规则。

为当前处理的数据行生成 CacheKey。除了作为缓存中的 key 值外,CacheKey 在嵌套映射中也作为唯一标识来标识结果对象。

根据步骤 4 生成的 CacheKey 从 DefaultResultSetHandler.nestedResultObjects 集合中查询中间结果。nestedResultObjects 是一个 HashMap 集合,在处理嵌套映射过程中产生的全部中间对象,都会记录到这个 Map 中,其中的 Key 就是 CacheKey。

检测