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

发布于:2025-05-13 ⋅ 阅读:(15) ⋅ 点赞:(0)

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

基本概念

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

  • 一个部门有多个员工
  • 一个订单有多个订单项
  • 一个博客有多个评论

实现方式

1. 使用嵌套结果映射(ResultMap)

<!-- DepartmentMapper.xml -->
<resultMap id="departmentWithEmployeesMap" type="com.example.Department">
    <id property="id" column="dept_id"/>
    <result property="name" column="dept_name"/>
    <!-- 一对多关系配置 -->
    <collection property="employees" ofType="com.example.Employee">
        <id property="id" column="emp_id"/>
        <result property="name" column="emp_name"/>
        <result property="email" column="emp_email"/>
    </collection>
</resultMap>

<select id="findDepartmentWithEmployees" resultMap="departmentWithEmployeesMap">
    SELECT 
        d.id as dept_id,
        d.name as dept_name,
        e.id as emp_id,
        e.name as emp_name,
        e.email as emp_email
    FROM department d
    LEFT JOIN employee e ON d.id = e.dept_id
    WHERE d.id = #{id}
</select>

2. 使用嵌套查询(Nested Query)

<!-- DepartmentMapper.xml -->
<resultMap id="departmentMap" type="com.example.Department">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <collection 
        property="employees" 
        column="id" 
        ofType="com.example.Employee"
        select="com.example.mapper.EmployeeMapper.findByDepartmentId"/>
</resultMap>

<select id="findById" resultMap="departmentMap">
    SELECT id, name FROM department WHERE id = #{id}
</select>

<!-- EmployeeMapper.xml -->
<select id="findByDepartmentId" resultType="com.example.Employee">
    SELECT id, name, email FROM employee WHERE dept_id = #{deptId}
</select>

实体类示例

// Department.java
public class Department {
    private Long id;
    private String name;
    private List<Employee> employees;
    // getters and setters
}

// Employee.java
public class Employee {
    private Long id;
    private String name;
    private String email;
    // getters and setters
}

使用注解的替代方案

如果你更喜欢使用注解而不是XML,也可以这样配置:

@Mapper
public interface DepartmentMapper {
    @Select("SELECT id, name FROM department WHERE id = #{id}")
    @Results({
        @Result(property = "id", column = "id"),
        @Result(property = "name", column = "name"),
        @Result(property = "employees", column = "id",
                many = @Many(select = "com.example.mapper.EmployeeMapper.findByDepartmentId"))
    })
    Department findByIdWithEmployees(Long id);
}

性能考虑

  1. 嵌套结果映射:单次SQL查询,适合关联数据量不大的情况
  2. 嵌套查询:多次SQL查询,适合关联数据量大或需要延迟加载的情况

可以通过 fetchType 属性控制加载方式:

<collection 
    property="employees" 
    column="id" 
    ofType="com.example.Employee"
    select="com.example.mapper.EmployeeMapper.findByDepartmentId"
    fetchType="lazy"/>  <!-- 或 eager -->

以上就是在Spring Boot中MyBatis实现一对多关系的XML配置方式。根据你的具体需求选择合适的方法。


网站公告

今日签到

点亮在社区的每一天
去签到