mybatis中一對一、一對多的<association> 配置使用
<association> 是 MyBatis 中處理一對一或一對多關系的映射元素,用于將查詢結果中的嵌套數(shù)據(jù)映射到 Java 對象的屬性中。它常用于表示對象之間的關聯(lián)關系,尤其是在復雜的數(shù)據(jù)庫查詢結果需要映射為嵌套對象時。
1. 作用與用途
- 一對一關系:當一個對象包含一個關聯(lián)對象時(例如,一個
User只對應一個Address),可以使用<association>映射一對一關系。 - 一對多關系:當一個對象包含多個關聯(lián)對象時(例如,一個
Org對應多個User),可以使用<association>映射一對多關系。 - 多級嵌套映射:當查詢涉及多個關聯(lián)對象時,
<association>可以幫助將查詢結果自動填充到 Java 對象中,避免手動編寫復雜的映射代碼。
2. <association> 基本用法
property:Java 對象中用于存儲關聯(lián)對象的屬性名。resultMap:指定一個resultMap,指明如何將查詢結果中的字段映射到該關聯(lián)對象。columnPrefix:為數(shù)據(jù)庫列加上前綴,避免列名沖突。
3. 示例說明:一對一與一對多映射
假設有兩個實體:User 和 Address,以及 Org 和多個 User,我們分別演示如何使用 <association> 進行一對一和一對多的映射。
4. 示例 1:一對一關聯(lián)映射
數(shù)據(jù)表結構
假設數(shù)據(jù)庫中有兩張表:users 和 address。
users 表:存儲用戶信息
| user_id | user_name |
|---|---|
| 1 | Alice |
| 2 | Bob |
address 表:存儲地址信息
| address_id | user_id | street | city |
|---|---|---|---|
| 1 | 1 | 123 Main | NYC |
| 2 | 2 | 456 Elm | LA |
1.1 定義 Java 類
// User.java
public class User {
private int id;
private String name;
private Address address; // 一對一關聯(lián)
// getters and setters
}
// Address.java
public class Address {
private int id;
private String street;
private String city;
// getters and setters
}
1.2 創(chuàng)建 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,返回如下數(shù)據(jù):
| user_id | user_name | address_id | street | city |
|---|---|---|---|---|
| 1 | Alice | 1 | 123 Main | NYC |
結果會映射為:
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:一對多關聯(lián)映射
數(shù)據(jù)表結構
假設有兩張表:org 和 users。
org 表:存儲組織信息
org_id org_name 101 Finance 102 HR users 表:存儲用戶信息
user_id user_name org_id 1 Alice 101 2 Bob 101 3 Carol 102
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; // 一對多關聯(lián)
// getters and setters
}
2.2 創(chuàng)建 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_id | org_name | user_id | user_name |
|---|---|---|---|
| 101 | Finance | 1 | Alice |
| 101 | Finance | 2 | Bob |
| 102 | HR | 3 | Carol |
會映射為:
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:指向用于處理該關聯(lián)對象映射的resultMap。columnPrefix:給數(shù)據(jù)庫列名加前綴,避免列名沖突。
查詢結果映射:
<association>會根據(jù)查詢返回的結果自動將嵌套對象填充到 Java 對象中,簡化了復雜的查詢結果的處理。
通過合理使用 <association>,你可以輕松地處理一對一和一對多的對象關系,避免手動編寫復雜的結果映射代碼,提升代碼的可維護性和可讀性。
到此這篇關于mybatis中一對一、一對多的<association> 配置使用的文章就介紹到這了,更多相關mybatis 一對一、一對多配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java匿名內(nèi)部類導致內(nèi)存泄露的原因與解決方案詳解
這篇文章主要為大家詳細介紹了Java因為匿名內(nèi)部類導致內(nèi)存泄露的原因以及其解決方案,文中的示例代碼講解詳細,希望對大家有所幫助2022-11-11
SpringBoot整合定時任務之實現(xiàn)Scheduled注解的過程(一個注解全解決)
這篇文章主要介紹了SpringBoot整合定時任務之實現(xiàn)Scheduled注解的過程(一個注解全解決),本文通過使用場景分析給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09
JAVA?兩個類同時實現(xiàn)同一個接口的方法(三種方法)
在Java中,兩個類同時實現(xiàn)同一個接口是非常常見的,接口定義了一組方法,實現(xiàn)接口的類必須提供這些方法的具體實現(xiàn),以下將展示如何實現(xiàn)這一要求,并提供具體的代碼示例,需要的朋友可以參考下2024-08-08
java字節(jié)碼框架ASM操作字節(jié)碼的方法淺析
這篇文章主要給大家介紹了關于java字節(jié)碼框架ASM如何操作字節(jié)碼的相關資料,文中通過示例代碼介紹的很詳細,有需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01
Java實現(xiàn)短信驗證碼和國際短信群發(fā)功能的示例
本篇文章主要介紹了Java實現(xiàn)短信驗證碼和國際短信群發(fā)功能的示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-02-02

