mybatis中一对一、一对多的<association> 配置使用

 更新时间:2025年05月09日 10:33:34   作者:小玉起起  
<association> 是 MyBatis 中处理一对一或一对多关系的映射元素,用于处理一对一和一对多关系的映射,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

<association> 是 MyBatis 中处理一对一或一对多关系的映射元素,用于将查询结果中的嵌套数据映射到 Java 对象的属性中。它常用于表示对象之间的关联关系,尤其是在复杂的数据库查询结果需要映射为嵌套对象时。

1. 作用与用途

  • 一对一关系:当一个对象包含一个关联对象时(例如,一个 User 只对应一个 Address),可以使用 <association> 映射一对一关系。
  • 一对多关系:当一个对象包含多个关联对象时(例如,一个 Org 对应多个 User),可以使用 <association> 映射一对多关系。
  • 多级嵌套映射:当查询涉及多个关联对象时,<association> 可以帮助将查询结果自动填充到 Java 对象中,避免手动编写复杂的映射代码。

2. <association> 基本用法

  • property:Java 对象中用于存储关联对象的属性名。
  • resultMap:指定一个 resultMap,指明如何将查询结果中的字段映射到该关联对象。
  • columnPrefix:为数据库列加上前缀,避免列名冲突。

3. 示例说明:一对一与一对多映射

假设有两个实体:User 和 Address,以及 Org 和多个 User,我们分别演示如何使用 <association> 进行一对一和一对多的映射。

4. 示例 1:一对一关联映射

数据表结构

假设数据库中有两张表:users 和 address

users 表:存储用户信息

user_iduser_name
1Alice
2Bob

address 表:存储地址信息

address_iduser_idstreetcity
11123 MainNYC
22456 ElmLA

1.1 定义 Java 类

// User.java
public class User {
    private int id;
    private String name;
    private Address address;  // 一对一关联

    // getters and setters
}

// Address.java
public class Address {
    private int id;
    private String street;
    private String city;

    // getters and setters
}

1.2 创建 resultMap

<!-- Address resultMap -->
<resultMap id="addressResultMap" type="com.example.Address">
    <result property="id" column="address_id"/>
    <result property="street" column="street"/>
    <result property="city" column="city"/>
</resultMap>

<!-- User resultMap -->
<resultMap id="userResultMap" type="com.example.User">
    <id property="id" column="user_id"/>
    <result property="name" column="user_name"/>
    <association property="address" resultMap="addressResultMap"/>
</resultMap>

1.3 SQL 查询

<select id="findUserWithAddress" resultMap="userResultMap">
    SELECT u.user_id, u.user_name, a.address_id, a.street, a.city
    FROM users u
    LEFT JOIN address a ON u.user_id = a.user_id
    WHERE u.user_id = #{userId}
</select>

1.4 结果映射

如果查询 user_id=1,返回如下数据:

user_iduser_nameaddress_idstreetcity
1Alice1123 MainNYC

结果会映射为:

User user = new User();
user.setId(1);
user.setName("Alice");

Address address = new Address();
address.setId(1);
address.setStreet("123 Main");
address.setCity("NYC");

user.setAddress(address);

5. 示例 2:一对多关联映射

数据表结构

假设有两张表:org 和 users

  • org 表:存储组织信息

    org_idorg_name
    101Finance
    102HR
  • users 表:存储用户信息

    user_iduser_nameorg_id
    1Alice101
    2Bob101
    3Carol102

2.1 定义 Java 类

// User.java
public class User {
    private int userId;
    private String userName;

    // getters and setters
}

// Org.java
public class Org {
    private int orgId;
    private String orgName;
    private List<User> users;  // 一对多关联

    // getters and setters
}

2.2 创建 resultMap

<!-- User resultMap -->
<resultMap id="userResultMap" type="com.example.User">
    <result property="userId" column="user_id"/>
    <result property="userName" column="user_name"/>
</resultMap>

<!-- Org resultMap -->
<resultMap id="orgResultMap" type="com.example.Org">
    <result property="orgId" column="org_id"/>
    <result property="orgName" column="org_name"/>
    <association property="users" resultMap="userResultMap"/>
</resultMap>

2.3 SQL 查询

<select id="findOrgWithUsers" resultMap="orgResultMap">
    SELECT o.org_id, o.org_name, u.user_id, u.user_name
    FROM org o
    LEFT JOIN users u ON o.org_id = u.org_id
</select>

2.4 结果映射

查询返回结果:

org_idorg_nameuser_iduser_name
101Finance1Alice
101Finance2Bob
102HR3Carol

会映射为:

List<Org> orgs = new ArrayList<>();

// org 1
Org org1 = new Org();
org1.setOrgId(101);
org1.setOrgName("Finance");

User user1 = new User();
user1.setUserId(1);
user1.setUserName("Alice");

User user2 = new User();
user2.setUserId(2);
user2.setUserName("Bob");

org1.setUsers(Arrays.asList(user1, user2));

// org 2
Org org2 = new Org();
org2.setOrgId(102);
org2.setOrgName("HR");

User user3 = new User();
user3.setUserId(3);
user3.setUserName("Carol");

org2.setUsers(Arrays.asList(user3));

// 添加到列表
orgs.add(org1);
orgs.add(org2);

6. 总结

  • <association> 用途:

    • 一对一关系:通过 <association> 映射一个对象到另一个对象的属性。
    • 一对多关系:通过 <association> 映射多个对象到一个集合属性。
    • 嵌套结果映射:支持多级嵌套查询,将复杂的查询结果映射为多层嵌套的 Java 对象。
  • 常用属性:

    • property:指定要填充的 Java 类属性。
    • resultMap:指向用于处理该关联对象映射的 resultMap
    • columnPrefix:给数据库列名加前缀,避免列名冲突。
  • 查询结果映射:<association> 会根据查询返回的结果自动将嵌套对象填充到 Java 对象中,简化了复杂的查询结果的处理。

通过合理使用 <association>,你可以轻松地处理一对一和一对多的对象关系,避免手动编写复杂的结果映射代码,提升代码的可维护性和可读性。

到此这篇关于mybatis中一对一、一对多的<association> 配置使用的文章就介绍到这了,更多相关mybatis 一对一、一对多配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Hibernate懒加载之<class>标签上的lazy

    Hibernate懒加载之<class>标签上的lazy

    这篇文章主要介绍了Hibernate懒加载之<class>标签上的lazy,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Maven中Junit测试@Test等注解无法识别的问题及解决

    Maven中Junit测试@Test等注解无法识别的问题及解决

    这篇文章主要介绍了Maven中Junit测试@Test等注解无法识别的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • springboot + jpa实现删除数据的操作代码

    springboot + jpa实现删除数据的操作代码

    这篇文章主要介绍了springboot + jpa实现删除数据的操作代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-05-05
  • Spring MVC深度解析从原理到实战(最新推荐)

    Spring MVC深度解析从原理到实战(最新推荐)

    MVC是一种经典的软件架构模式,本文给大家介绍Spring MVC深度解析从原理到实战,感兴趣的朋友一起看看吧
    2025-05-05
  • SpringBoot环境Druid数据源使用及特点

    SpringBoot环境Druid数据源使用及特点

    Druid 是目前比较流行的高性能的,分布式列存储的OLAP框架(具体来说是MOLAP)。本文给大家分享SpringBoot环境Druid数据源使用及特点介绍,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • Java实现单链表的操作

    Java实现单链表的操作

    这篇文章主要为大家详细介绍了Java实现单链表的操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java动态代理之拦截器的应用

    Java动态代理之拦截器的应用

    今天小编就为大家分享一篇关于Java动态代理之拦截器的应用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • spring NamedContextFactory在Fegin配置及使用详解

    spring NamedContextFactory在Fegin配置及使用详解

    在我们日常项目中,使用FeignClient实现各系统接口调用变得更加简单, 在各个系统集成过程中,难免会遇到某些系统的Client需要特殊的配置、返回读取等需求。Feign使用NamedContextFactory来为每个Client模块构造单独的上下文(ApplicationContext)
    2023-11-11
  • Kafka是什么及如何使用SpringBoot对接Kafka(最新推荐)

    Kafka是什么及如何使用SpringBoot对接Kafka(最新推荐)

    这篇文章主要介绍了Kafka是什么,以及如何使用SpringBoot对接Kafka,今天我们通过一个Demo讲解了在SpringBoot中如何对接Kafka,也介绍了下关键类 KafkaTemplate,需要的朋友可以参考下
    2023-11-11
  • Java for-each循环(遍历循环)详解

    Java for-each循环(遍历循环)详解

    本文详解Java for-each循环,涵盖其简化遍历、类型安全、不可变性、空指针防护等特性,适用场景及限制,错误案例与修正,性能对比,高级技巧(如Java14 Records),并提供最佳实践指南
    2025-07-07

最新评论