MyBatis 一对多关联映射在Spring Boot中的XML配置
在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_emailFROM department dLEFT JOIN employee e ON d.id = e.dept_idWHERE 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);
}
性能考虑
- 嵌套结果映射:单次SQL查询,适合关联数据量不大的情况
- 嵌套查询:多次SQL查询,适合关联数据量大或需要延迟加载的情况
可以通过 fetchType
属性控制加载方式:
<collection property="employees" column="id" ofType="com.example.Employee"select="com.example.mapper.EmployeeMapper.findByDepartmentId"fetchType="lazy"/> <!-- 或 eager -->
以上就是在Spring Boot中MyBatis实现一对多关系的XML配置方式。根据你的具体需求选择合适的方法。