在 MyBatis 中,处理一对一和一对多关联查询时,通常采用哪些配置方式?请分别说明实现原理和关键配置步骤。
考察说明
考察对 MyBatis 关联映射(association 和 collection)的理解与应用能力。
回答思路
- 【回答框架 1】一对一关联查询:在 resultMap 中使用 association 标签,通过 property 指定关联对象的属性名,javaType 指定类型,并配置 select 属性进行分步查询,或使用嵌套的 resultMap 进行联表查询。分步查询会引发 N+1 问题,可通过延迟加载优化。
- 【回答框架 2】一对多关联查询:在 resultMap 中使用 collection 标签,property 指定集合属性名,ofType 指定集合中元素的类型,同样支持 select 分步查询或嵌套 resultMap 联表查询。
- 【回答框架 3】实现原理:MyBatis 通过 resultMap 将数据库列映射到对象属性,association 和 collection 分别处理对象和集合的映射。分步查询基于多次 SQL 执行,嵌套结果映射基于 JOIN 查询。
- 【回答框架 4】配置步骤:定义 resultMap 时,在 association 或 collection 中设置 column 传递外键,select 指向关联查询的 statement id;若使用嵌套 resultMap,则需在 association 或 collection 内嵌套 resultMap 定义。
- 【回答框架 5】性能考量:联表查询减少数据库交互,但可能产生冗余数据;分步查询灵活但需注意 N+1 问题,可通过懒加载或批量查询优化。
- 【关键点 1】association 用于一对一,collection 用于一对多。
- 【关键点 2】分步查询通过 select 属性指定关联查询 id,可启用延迟加载。
- 【关键点 3】嵌套 resultMap 基于 JOIN 查询,减少 SQL 执行次数。
- 【关键点 4】column 属性用于传递外键参数给关联查询。
- 【关键点 5】实际方案需根据数据量和查询频率选择联表或分步。
- 【易错点 1】分步查询易出现 N+1 问题,需合理使用懒加载或批量查询。
- 【易错点 2】联表查询结果集列名冲突需使用别名。
- 【易错点 3】配置错误导致映射失败,需检查 property 和 column 对应关系。