MyBatis中的association与collection应用

发布时间 2023-07-29 10:47:53作者: fogey

MyBatis中的association与collection应用

在使用 MyBatis进行数据库操作时,经常会遇到需要处理对象之间的关联关系和集合映射的情况。为了更好地实现对象关系映射,MyBatis提供了 associationcollection 两个核心功能,让我们可以更便捷地处理复杂的数据结构。本文将详细介绍在 MyBatis中如何应用 associationcollection

1. association 的应用

association 用于建立两个表之间的对象关联映射。假设我们有两个表:OrderUserOrder 表中有一个字段 user_id 关联到 User 表的主键 id。通过 association,我们可以在查询 Order 的同时将对应的 User 对象关联起来。

首先,我们定义实体类 OrderUser

 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 对象映射到 Orderuser 属性中。

2. collection 的应用

collection 用于实现一对多的集合映射关系。比如在一个 Department 表中有多个员工,通过 collection 可以将一个 Department 对象关联到多个 Employee 对象上。

首先,我们定义实体类 DepartmentEmployee

@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 对象映射到 Departmentemployees 属性中。

结论

通过 associationcollection 的应用,我们可以轻松处理对象关联和集合映射的情况,简化了数据映射的过程。在实际应用中,根据数据库表之间的关系进行更复杂的配置,可以实现更丰富的数据查询和操作功能。MyBatis-Plus 的这些特性为开发人员提供了更高效便捷的数据持久化解决方案。