Java面试题更新 2026-08-05

请说明 MyBatis 延迟加载的支持情况,并解释其底层实现原理。

后端开发技术原理JavaMyBatis

考察说明

考察对 MyBatis 延迟加载机制及其实现细节的理解。

回答思路

  1. 【回答框架 1】MyBatis 支持延迟加载,可通过配置全局参数或局部属性控制开启,常见于一对一、一对多关联查询中,用于按需加载关联对象,减少不必要的查询开销。
  2. 【回答框架 2】实现原理基于动态代理:当映射结果被返回时,关联对象并未真实初始化,而是以代理对象占位;对代理对象的属性访问或方法调用会触发拦截,从而在需要时执行额外的 SQL 查询。
  3. 【回答框架 3】具体机制依赖 SqlSession 的生命周期和一级缓存:延迟加载通常在会话内有效,代理对象持有会话引用,在触发加载时通过会话执行映射语句,并利用一级缓存避免重复查询同一条数据。
  4. 【回答框架 4】实现细节涉及 MyBatis 的 ResultSetHandler 和关联映射中的 `fetchType`,其底层通过 Javassist 或 CGLIB 之类的字节码增强技术生成代理类,并在调用时通过拦截器回调执行对应查询。
  5. 【回答框架 5】使用延迟加载需注意会话关闭问题,否则在会话关闭后访问代理属性会抛出异常;同时应明确其只优化查询时机,不减少底层 SQL 数量。
  6. 【关键点 1】MyBatis 通过配置 `lazyLoadingEnabled` 可全局开启延迟加载。
  7. 【关键点 2】核心实现为动态代理,按需执行额外 SQL。
  8. 【关键点 3】代理对象在访问属性时触发查询,依赖 SqlSession 存活。
  9. 【关键点 4】常配合一级缓存使用,避免同一会话内重复查询。
  10. 【关键点 5】延迟加载仅延迟查询时机,不改变 SQL 数量,且有作用域限制。
  11. 【易错点 1】会话关闭后访问代理属性可能导致异常,注意作用域。
  12. 【易错点 2】不能因开启延迟加载而断言总查询次数减少,实际可能增加 SQL 请求。
  13. 【易错点 3】代理对象在序列化或跨层传递时可能失效,需注意使用场景。