MyBatis 处理嵌套结果映射是一个将数据库查询结果转换为对象树的过程,尤其当你的业务对象包含其他对象或对象集合时。理解这个过程,能帮你更好地使用 MyBatis 处理复杂关系。下面我将结合核心源码,详细解析它的全流程。
为了让你快速建立整体印象,我们先通过一个表格来对比 MyBatis 实现嵌套映射的两种主要方式。
| 特性维度 | 嵌套结果映射(联合查询) | 嵌套查询(子查询) |
|---|---|---|
| 实现原理 | 通过 单条 SQL JOIN 语句一次性获取所有数据,在内存中进行结果集映射。 | 通过 多条 SQL 语句,首先查询主对象,再根据主对象的结果查询关联对象。 |
| 核心标签 | <collection> / <association> (不包含 select 属性) |
<collection> / <association> (包含 select 属性) |
| 性能特点 | 查询次数少,可能产生数据冗余,需要应用程序在内存中处理行数据的组合。 | 查询次数多(N+1 问题),但通过网络传输的数据量可能更小。 |
| 延迟加载 | 不支持,所有数据一次性加载。 | 支持,可通过 lazyLoadingEnabled 配置按需加载关联数据。 |
| 适用场景 | 关联数据量不大,或对性能要求高且可以接受一定数据冗余的场景。 | 关联数据量大、结构复杂,或希望实现延迟加载以提升初次加载速度的场景。 |
🔄 嵌套结果映射的核心流程剖析
嵌套结果映射的核心处理逻辑在 DefaultResultSetHandler 类中。整个流程可以概括为:解析一行结果 -> 创建外层对象 -> 填充普通属性 -> 处理嵌套属性 -> 去重存储。下面我们深入关键步骤的源码。
1. 入口:handleResultSets
当 SQL 语句执行完毕后,MyBatis 会调用 ResultSetHandler 的 handleResultSets 方法来处理 ResultSet。这是所有结果集处理的起点。
public List<Object> handleResultSets(Statement stmt) throws SQLException {
MyBatis嵌套结果映射源码解析

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



