Mybatis的高级映射及延迟加载

发布时间:2026/8/6 18:58:27
Mybatis的高级映射及延迟加载 MyBatis 的高级映射和延迟加载是优化数据库操作的重要特性下面为你详细介绍一、高级映射高级映射用于处理复杂的对象关系如一对一、一对多、多对多主要通过resultMap实现。1. 一对一映射通过association标签实现适用于实体间的has-one关系。示例用户User和账户Account的一对一关系resultMap iduserResultMaptypeUserid propertyidcolumnid/result propertyusernamecolumnusername/association propertyaccountjavaTypeAccountid propertyidcolumnaccount_id/result propertybalancecolumnbalance//association/resultMap2. 一对多映射通过collection标签实现适用于实体间的has-many关系。示例订单Order和订单项OrderItem的一对多关系resultMap idorderResultMaptypeOrderid propertyidcolumnid/result propertyorderNocolumnorder_no/collection propertyitemsofTypeOrderItemid propertyidcolumnitem_id/result propertyproductNamecolumnproduct_name//collection/resultMap3. 多对多映射通过中间表关联通常使用collection配合子查询或连接查询实现。示例用户User和角色Role的多对多关系resultMap iduserRoleResultMaptypeUserid propertyidcolumnid/result propertyusernamecolumnusername/collection propertyrolesofTypeRoleid propertyidcolumnrole_id/result propertyroleNamecolumnrole_name//collection/resultMap二、延迟加载Lazy Loading延迟加载允许在需要时才加载关联对象避免一次性加载所有数据提高性能。1. 开启延迟加载在mybatis-config.xml中配置settingssettingnamelazyLoadingEnabledvaluetrue/settingnameaggressiveLazyLoadingvaluefalse/!-- 按需加载 --/settings2. 实现方式嵌套查询子查询通过select属性指定子查询。resultMap iduserResultMaptypeUserid propertyidcolumnid/result propertyusernamecolumnusername/association propertyaccountcolumnidselectselectAccountByUserIdfetchTypelazy/!--显式指定延迟加载--/resultMapselect idselectAccountByUserIdparameterTypeintresultTypeAccountSELECT*FROMaccountWHEREuser_id#{id}/select嵌套结果连接查询通过fetchTypelazy指定延迟加载。resultMap iduserResultMaptypeUserid propertyidcolumnid/result propertyusernamecolumnusername/association propertyaccountjavaTypeAccountfetchTypelazyid propertyidcolumnaccount_id/result propertybalancecolumnbalance//association/resultMap三、高级映射与延迟加载的配合通过resultMap和fetchType结合可灵活处理复杂关系的加载时机。示例按需加载用户的订单和订单详情resultMap iduserWithOrderstypeUserid propertyidcolumnid/collection propertyorderscolumnidselectselectOrdersByUserIdfetchTypelazy//resultMap四、注意事项N1 查询问题延迟加载可能导致多次查询主查询 N 个子查询可通过batch模式或二级缓存优化。会话生命周期延迟加载需确保调用时 SqlSession 未关闭可使用OpenSessionInView模式。性能权衡避免过度延迟加载对频繁访问的关联数据建议立即加载。五、总结高级映射通过resultMap处理复杂关系支持嵌套查询和嵌套结果。延迟加载按需加载关联对象提升性能但需注意 N1 问题。合理使用这两个特性可显著优化 MyBatis 的查询效率和代码可维护性。