由 Mybatis 源码畅谈软件设计(五):ResultMap 的循环引用
💡
原文中文,约9600字,阅读约需23分钟。
📝
内容提要
本文介绍了 Mybatis 如何通过递归和缓存机制处理 ResultMap 的循环引用,以权限表为例,展示了如何定义循环引用并映射到 Java 对象。重点在于缓存机制的应用,以避免重复创建对象,有效处理一对多和多对一关系。
🎯
关键要点
- Mybatis 通过递归和缓存机制处理 ResultMap 的循环引用。
- 以权限表为例,展示了如何定义循环引用并映射到 Java 对象。
- 重点在于缓存机制的应用,以避免重复创建对象。
- 在 Mapper 中定义的循环引用的 ResultMap 包含 resourceResults、principalResults 和 permissionResults。
- Mybatis 在处理循环引用时,会根据引用关系创建对象并存储在缓存中。
- DefaultResultSetHandler#handleRowValuesForNestedResultMap 方法是处理循环引用的入口。
- CacheKey 的创建规则和 nestedResultObjects 的作用是避免重复创建对象。
- DefaultResultSetHandler#getRowValue 方法是将数据库数据处理成 Java 对象的核心方法。
- ancestorObjects 缓存用于处理循环引用关系,避免重复创建对象。
- applyNestedResultMappings 方法用于处理循环引用关系,形成递归调用。
- ResultMap 的循环引用解决方案是递归 + 缓存。
➡️