mybatis中一對(duì)一、一對(duì)多的<association> 配置使用
<association>
是 MyBatis 中處理一對(duì)一或一對(duì)多關(guān)系的映射元素,用于將查詢(xún)結(jié)果中的嵌套數(shù)據(jù)映射到 Java 對(duì)象的屬性中。它常用于表示對(duì)象之間的關(guān)聯(lián)關(guān)系,尤其是在復(fù)雜的數(shù)據(jù)庫(kù)查詢(xún)結(jié)果需要映射為嵌套對(duì)象時(shí)。
1. 作用與用途
- 一對(duì)一關(guān)系:當(dāng)一個(gè)對(duì)象包含一個(gè)關(guān)聯(lián)對(duì)象時(shí)(例如,一個(gè)
User
只對(duì)應(yīng)一個(gè)Address
),可以使用<association>
映射一對(duì)一關(guān)系。 - 一對(duì)多關(guān)系:當(dāng)一個(gè)對(duì)象包含多個(gè)關(guān)聯(lián)對(duì)象時(shí)(例如,一個(gè)
Org
對(duì)應(yīng)多個(gè)User
),可以使用<association>
映射一對(duì)多關(guān)系。 - 多級(jí)嵌套映射:當(dāng)查詢(xún)涉及多個(gè)關(guān)聯(lián)對(duì)象時(shí),
<association>
可以幫助將查詢(xún)結(jié)果自動(dòng)填充到 Java 對(duì)象中,避免手動(dòng)編寫(xiě)復(fù)雜的映射代碼。
2. <association> 基本用法
property
:Java 對(duì)象中用于存儲(chǔ)關(guān)聯(lián)對(duì)象的屬性名。resultMap
:指定一個(gè)resultMap
,指明如何將查詢(xún)結(jié)果中的字段映射到該關(guān)聯(lián)對(duì)象。columnPrefix
:為數(shù)據(jù)庫(kù)列加上前綴,避免列名沖突。
3. 示例說(shuō)明:一對(duì)一與一對(duì)多映射
假設(shè)有兩個(gè)實(shí)體:User
和 Address
,以及 Org
和多個(gè) User
,我們分別演示如何使用 <association>
進(jìn)行一對(duì)一和一對(duì)多的映射。
4. 示例 1:一對(duì)一關(guān)聯(lián)映射
數(shù)據(jù)表結(jié)構(gòu)
假設(shè)數(shù)據(jù)庫(kù)中有兩張表:users
和 address
。
users 表:存儲(chǔ)用戶(hù)信息
user_id | user_name |
---|---|
1 | Alice |
2 | Bob |
address 表:存儲(chǔ)地址信息
address_id | user_id | street | city |
---|---|---|---|
1 | 1 | 123 Main | NYC |
2 | 2 | 456 Elm | LA |
1.1 定義 Java 類(lèi)
// User.java public class User { private int id; private String name; private Address address; // 一對(duì)一關(guān)聯(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 查詢(xún)
<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 結(jié)果映射
如果查詢(xún) user_id=1
,返回如下數(shù)據(jù):
user_id | user_name | address_id | street | city |
---|---|---|---|---|
1 | Alice | 1 | 123 Main | NYC |
結(jié)果會(huì)映射為:
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:一對(duì)多關(guān)聯(lián)映射
數(shù)據(jù)表結(jié)構(gòu)
假設(shè)有兩張表:org
和 users
。
org 表:存儲(chǔ)組織信息
org_id org_name 101 Finance 102 HR users 表:存儲(chǔ)用戶(hù)信息
user_id user_name org_id 1 Alice 101 2 Bob 101 3 Carol 102
2.1 定義 Java 類(lèi)
// 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; // 一對(duì)多關(guān)聯(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 查詢(xún)
<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 結(jié)果映射
查詢(xún)返回結(jié)果:
org_id | org_name | user_id | user_name |
---|---|---|---|
101 | Finance | 1 | Alice |
101 | Finance | 2 | Bob |
102 | HR | 3 | Carol |
會(huì)映射為:
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. 總結(jié)
<association>
用途:- 一對(duì)一關(guān)系:通過(guò)
<association>
映射一個(gè)對(duì)象到另一個(gè)對(duì)象的屬性。 - 一對(duì)多關(guān)系:通過(guò)
<association>
映射多個(gè)對(duì)象到一個(gè)集合屬性。 - 嵌套結(jié)果映射:支持多級(jí)嵌套查詢(xún),將復(fù)雜的查詢(xún)結(jié)果映射為多層嵌套的 Java 對(duì)象。
- 一對(duì)一關(guān)系:通過(guò)
常用屬性:
property
:指定要填充的 Java 類(lèi)屬性。resultMap
:指向用于處理該關(guān)聯(lián)對(duì)象映射的resultMap
。columnPrefix
:給數(shù)據(jù)庫(kù)列名加前綴,避免列名沖突。
查詢(xún)結(jié)果映射:
<association>
會(huì)根據(jù)查詢(xún)返回的結(jié)果自動(dòng)將嵌套對(duì)象填充到 Java 對(duì)象中,簡(jiǎn)化了復(fù)雜的查詢(xún)結(jié)果的處理。
通過(guò)合理使用 <association>
,你可以輕松地處理一對(duì)一和一對(duì)多的對(duì)象關(guān)系,避免手動(dòng)編寫(xiě)復(fù)雜的結(jié)果映射代碼,提升代碼的可維護(hù)性和可讀性。
到此這篇關(guān)于mybatis中一對(duì)一、一對(duì)多的<association> 配置使用的文章就介紹到這了,更多相關(guān)mybatis 一對(duì)一、一對(duì)多配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Mybatis中一對(duì)多(collection)和一對(duì)一(association)的組合查詢(xún)使用
- Mybatis實(shí)現(xiàn)一對(duì)一、一對(duì)多關(guān)聯(lián)查詢(xún)的方法(示例詳解)
- 關(guān)于mybatis一對(duì)一查詢(xún)一對(duì)多查詢(xún)遇到的問(wèn)題
- Mybatis使用@one和@Many實(shí)現(xiàn)一對(duì)一及一對(duì)多關(guān)聯(lián)查詢(xún)
- springboot整合mybatis-plus基于注解實(shí)現(xiàn)一對(duì)一(一對(duì)多)查詢(xún)功能
- mybatis 一對(duì)一、一對(duì)多和多對(duì)多查詢(xún)實(shí)例代碼
- Mybatis 中的一對(duì)一,一對(duì)多,多對(duì)多的配置原則示例代碼
- Mybatis中的高級(jí)映射一對(duì)一、一對(duì)多、多對(duì)多
相關(guān)文章
詳解使用Spring Security進(jìn)行自動(dòng)登錄驗(yàn)證
本篇文章主要介紹了詳解使用Spring Security進(jìn)行自動(dòng)登錄驗(yàn)證,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-09-09MyBatis動(dòng)態(tài)SQL標(biāo)簽用法實(shí)例詳解
本文通過(guò)實(shí)例代碼給大家介紹了MyBatis動(dòng)態(tài)SQL標(biāo)簽用法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-07-07Java匿名內(nèi)部類(lèi)導(dǎo)致內(nèi)存泄露的原因與解決方案詳解
這篇文章主要為大家詳細(xì)介紹了Java因?yàn)槟涿麅?nèi)部類(lèi)導(dǎo)致內(nèi)存泄露的原因以及其解決方案,文中的示例代碼講解詳細(xì),希望對(duì)大家有所幫助2022-11-11SpringBoot整合定時(shí)任務(wù)之實(shí)現(xiàn)Scheduled注解的過(guò)程(一個(gè)注解全解決)
這篇文章主要介紹了SpringBoot整合定時(shí)任務(wù)之實(shí)現(xiàn)Scheduled注解的過(guò)程(一個(gè)注解全解決),本文通過(guò)使用場(chǎng)景分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09JAVA?兩個(gè)類(lèi)同時(shí)實(shí)現(xiàn)同一個(gè)接口的方法(三種方法)
在Java中,兩個(gè)類(lèi)同時(shí)實(shí)現(xiàn)同一個(gè)接口是非常常見(jiàn)的,接口定義了一組方法,實(shí)現(xiàn)接口的類(lèi)必須提供這些方法的具體實(shí)現(xiàn),以下將展示如何實(shí)現(xiàn)這一要求,并提供具體的代碼示例,需要的朋友可以參考下2024-08-08java字節(jié)碼框架ASM操作字節(jié)碼的方法淺析
這篇文章主要給大家介紹了關(guān)于java字節(jié)碼框架ASM如何操作字節(jié)碼的相關(guān)資料,文中通過(guò)示例代碼介紹的很詳細(xì),有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-01-01Java實(shí)現(xiàn)短信驗(yàn)證碼和國(guó)際短信群發(fā)功能的示例
本篇文章主要介紹了Java實(shí)現(xiàn)短信驗(yàn)證碼和國(guó)際短信群發(fā)功能的示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02springboot實(shí)現(xiàn)后臺(tái)上傳圖片(工具類(lèi))
這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)后臺(tái)上傳圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04Java中用戶(hù)線(xiàn)程與守護(hù)線(xiàn)程的使用區(qū)別
這篇文章主要介紹了Java中用戶(hù)線(xiàn)程與守護(hù)線(xiàn)程的使用區(qū)別,Java語(yǔ)言中無(wú)論是線(xiàn)程還是線(xiàn)程池,默認(rèn)都是用戶(hù)線(xiàn)程,因此用戶(hù)線(xiàn)程也被成為普通線(xiàn)程,下文關(guān)于其與守護(hù)線(xiàn)程的區(qū)別詳情,需要的小伙伴可以參考一下2022-05-05