MyBatis 一对多关联映射在Spring Boot中的XML配置

[复制链接]
发表于 2025-9-9 16:53:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在Spring Boot中使用MyBatis实现一对多关系时,可以通过XML映射文件来配置。下面我将具体介绍几种实现方式。
基本概念

一对多关系指的是一个实体对象包罗多个子对象聚集的情况,例如:

  • 一个部门有多个员工
  • 一个订单有多个订单项
  • 一个博客有多个批评
实现方式

1. 使用嵌套结果映射(ResultMap)
  1. <!-- DepartmentMapper.xml -->
  2. <resultMap id="departmentWithEmployeesMap" type="com.example.Department">
  3.     <id property="id" column="dept_id"/>
  4.     <result property="name" column="dept_name"/>
  5.     <!-- 一对多关系配置 -->
  6.     <collection property="employees" ofType="com.example.Employee">
  7.         <id property="id" column="emp_id"/>
  8.         <result property="name" column="emp_name"/>
  9.         <result property="email" column="emp_email"/>
  10.     </collection>
  11. </resultMap>
  12. <select id="findDepartmentWithEmployees" resultMap="departmentWithEmployeesMap">
  13.     SELECT
  14.         d.id as dept_id,
  15.         d.name as dept_name,
  16.         e.id as emp_id,
  17.         e.name as emp_name,
  18.         e.email as emp_email
  19.     FROM department d
  20.     LEFT JOIN employee e ON d.id = e.dept_id
  21.     WHERE d.id = #{id}
  22. </select>
复制代码
2. 使用嵌套查询(Nested Query)
  1. <!-- DepartmentMapper.xml -->
  2. <resultMap id="departmentMap" type="com.example.Department">
  3.     <id property="id" column="id"/>
  4.     <result property="name" column="name"/>
  5.     <collection
  6.         property="employees"
  7.         column="id"
  8.         ofType="com.example.Employee"
  9.         select="com.example.mapper.EmployeeMapper.findByDepartmentId"/>
  10. </resultMap>
  11. <select id="findById" resultMap="departmentMap">
  12.     SELECT id, name FROM department WHERE id = #{id}
  13. </select>
  14. <!-- EmployeeMapper.xml -->
  15. <select id="findByDepartmentId" resultType="com.example.Employee">
  16.     SELECT id, name, email FROM employee WHERE dept_id = #{deptId}
  17. </select>
复制代码
实体类示例
  1. // Department.java
  2. public class Department {
  3.     private Long id;
  4.     private String name;
  5.     private List<Employee> employees;
  6.     // getters and setters
  7. }
  8. // Employee.java
  9. public class Employee {
  10.     private Long id;
  11.     private String name;
  12.     private String email;
  13.     // getters and setters
  14. }
复制代码
使用注解的替换方案

假如你更喜欢使用注解而不是XML,也可以这样配置
  1. @Mapper
  2. public interface DepartmentMapper {
  3.     @Select("SELECT id, name FROM department WHERE id = #{id}")
  4.     @Results({
  5.         @Result(property = "id", column = "id"),
  6.         @Result(property = "name", column = "name"),
  7.         @Result(property = "employees", column = "id",
  8.                 many = @Many(select = "com.example.mapper.EmployeeMapper.findByDepartmentId"))
  9.     })
  10.     Department findByIdWithEmployees(Long id);
  11. }
复制代码
性能考虑


  • 嵌套结果映射:单次SQL查询,得当关联数据量不大的情况
  • 嵌套查询:多次SQL查询,得当关联数据量大或必要延迟加载的情况
可以通过 fetchType 属性控制加载方式:
  1. <collection
  2.     property="employees"
  3.     column="id"
  4.     ofType="com.example.Employee"
  5.     select="com.example.mapper.EmployeeMapper.findByDepartmentId"
  6.     fetchType="lazy"/>  <!-- 或 eager -->
复制代码
以上就是在Spring Boot中MyBatis实现一对多关系的XML配置方式。根据你的具体需求选择符合的方法。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表