Java高频面试题:MyBatis如何处理延迟加载?

张开发
2026/4/18 23:11:28 15 分钟阅读

分享文章

Java高频面试题:MyBatis如何处理延迟加载?
大家好我是锋哥。今天分享关于【Java高频面试题MyBatis如何处理延迟加载】面试题 。希望对大家有帮助Java高频面试题MyBatis如何处理延迟加载MyBatis 中**延迟加载Lazy Loading**主要用于处理关联对象如一对一、一对多关系目的是在真正需要数据时才去查询数据库从而提升性能。下面从原理、配置和使用三个层面讲清楚一、延迟加载的核心原理MyBatis 的延迟加载本质是基于代理模式Proxy实现的查询主对象时例如用户不会立即加载关联对象例如订单当你调用关联属性的 getter 方法时才触发 SQL 查询内部通过动态代理如 Javassist 或 CGLIB拦截方法调用二、全局配置开启延迟加载在mybatis-config.xml中配置settings !-- 开启延迟加载 -- setting namelazyLoadingEnabled valuetrue/ !-- 是否在任意方法调用时加载 -- setting nameaggressiveLazyLoading valuefalse/ /settings参数说明lazyLoadingEnabled 是否开启延迟加载默认 falseaggressiveLazyLoading 是否“激进加载”true调用任意方法都会加载所有延迟属性不推荐false只在访问具体属性时加载推荐三、局部配置ResultMap 中使用延迟加载通常用于association和collection1. 一对一associationresultMap iduserMap typeUser id propertyid columnid/ result propertyname columnname/ association propertyorder columnid selectselectOrderByUserId fetchTypelazy/ /resultMap2. 一对多collectionresultMap iduserMap typeUser id propertyid columnid/ collection propertyorders columnid selectselectOrdersByUserId fetchTypelazy/ /resultMapfetchType 说明lazy 延迟加载eager 立即加载默认四、触发延迟加载的时机只有在以下情况才会触发 SQLUser user userMapper.selectUserById(1); // 此时 orders 还没查 ListOrder orders user.getOrders(); // 这里才执行 SQL五、常见坑与注意点1. 序列化问题如果对象被序列化如传到前端可能会触发延迟加载或报错解决提前加载或关闭延迟加载2. N1 查询问题延迟加载容易导致查询 N 个用户 每个用户查询一次订单 N1 次 SQL解决方案使用 join 查询或手动优化批量查询3. Session 关闭问题延迟加载依赖 SqlSessionsqlSession.close(); user.getOrders(); // ❌ 会报错懒加载失败 必须保证 session 仍然打开六、最后小结下哈MyBatis 延迟加载的关键点本质动态代理 按需加载开启方式lazyLoadingEnabledtrue控制粒度fetchTypelazy触发时机调用 getter注意问题N1、session 生命周期

更多文章