MyBatis中的association与collection应用
在使用 MyBatis进行数据库操作时,经常会遇到需要处理对象之间的关联关系和集合映射的情况。为了更好地实现对象关系映射,MyBatis提供了 association
和 collection
两个核心功能,让我们可以更便捷地处理复杂的数据结构。本文将详细介绍在 MyBatis中如何应用 association
和 collection
。
1. association
的应用
association
用于建立两个表之间的对象关联映射。假设我们有两个表:Order
和 User
,Order
表中有一个字段 user_id
关联到 User
表的主键 id
。通过 association
,我们可以在查询 Order
的同时将对应的 User
对象关联起来。
首先,我们定义实体类 Order
和 User
:
1 @TableName("order") 2 @Data 3 public class Order { 4 @TableId(value = "id", type = IdType.ASSIGN_ID) 5 private Long id; 6 7 @TableField("order_no") 8 private String orderNo; 9 10 @TableField("user_id") 11 private Long userId; 12 13 @TableField(exist = false) 14 private User user; 15 }
接下来,配置 XML 映射文件 OrderMapper.xml
:
<resultMap id="OrderMap" type="com.test.entity.Order"> <id property="id" column="id"/> <result property="orderNo" column="order_no"/> <association property="user" javaType="com.test.entity.User"> <id property="id" column="user_id"/> <result property="username" column="username"/> <result property="email" column="email"/> </association> </resultMap> <select id="getOrderWithUser" resultMap="OrderMap"> SELECT o.*, u.username, u.email FROM fs_test_order o LEFT JOIN fs_test_uesr u ON o.user_id = u.id WHERE o.id = #{id} </select>
在 OrderMapper
接口中定义查询方法:
Order getOrderWithUser(Long id);
在查询 Order
时,通过 association
的配置,MyBatis 会自动将关联的 User
对象映射到 Order
的 user
属性中。
2. collection
的应用
collection
用于实现一对多的集合映射关系。比如在一个 Department
表中有多个员工,通过 collection
可以将一个 Department
对象关联到多个 Employee
对象上。
首先,我们定义实体类 Department
和 Employee
:
@TableName("employee") @Data public class Employee { @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; @TableField("name") private String name; @TableField("department_id") private Long departmentId; }
@TableName("uesr") @Data public class User { @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; @TableField("username") private String username; @TableField("email") private String email; }
接下来,配置 XML 映射文件 DepartmentMapper.xml
:
<resultMap id="DepartmentMap" type="jnpf.test.entity.Department"> <id property="id" column="id"/> <result property="name" column="name"/> <collection property="employees" ofType="jnpf.test.entity.Employee"> <id property="id" column="id"/> <result property="name" column="name"/> </collection> </resultMap> <select id="getDepartmentWithEmployees" resultMap="DepartmentMap"> SELECT d.*, e.id, e.name FROM fs_test_department d LEFT JOIN fs_test_employee e ON d.id = e.department_id WHERE d.id = #{id} </select>
在 DepartmentMapper
接口中定义查询方法:
Department getDepartmentWithEmployees(Long id);
在查询 Department
时,通过 collection
的配置,MyBatis 会自动将关联的多个 Employee
对象映射到 Department
的 employees
属性中。
结论
通过 association
和 collection
的应用,我们可以轻松处理对象关联和集合映射的情况,简化了数据映射的过程。在实际应用中,根据数据库表之间的关系进行更复杂的配置,可以实现更丰富的数据查询和操作功能。MyBatis-Plus 的这些特性为开发人员提供了更高效便捷的数据持久化解决方案。