开发者

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

开发者 https://www.devze.com 2025-05-10 10:31 出处:网络 作者: 小玉起起
目录1. 作用与用途2. <association> 基本用法3. 示例说明:一对一与一对多映射4. 示例 1:一对一关联映射数据表结构1.1 定义 Java 类1.2 创建 resultMap1.3 SQL 查询1.4 结果映射5. 示例 2:一
目录
  • 1. 作用与用途
  • 2. <association> 基本用法
  • 3. 示例说明:一对一与一对多映射
  • 4. 示例 1:一对一关联映射
    • 数据表结构
    • 1.1 定义 Java 类
    • 1.2 创建 resultMap
    • 1.3 SQL 查询
    • 1.4 结果映射
  • 5. 示例 2:一对多关联映射
    • 2.1 定义 Java 类
    • 2.2 创建 resultMap
    • 2.3 SQL 查询
    • 2.4 结果映射
  • 6. 总结

    <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:一对一关联映射

    数据表结php

    假设数据库中有两张表: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"/&g编程客栈t;
        <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" rwww.devze.comesultMap="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(user1android, 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> 映射多个对象到一个集合属性。
      • 嵌套结果映射:支持多级嵌套查询,将复杂的查http://www.devze.com询结果映射为多层嵌套的 Java 对象。
    • 常用属性:

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

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

    到此这篇关于mybatis中一对一、一对多的<association> 配置使用的文章就介绍到这了,更多相关mybatis 一对一、一对多配置内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号