MyBatis中@One的實(shí)現(xiàn)示例
@One注解的作用:
在 MyBatis 中,@One 是 @Result 注解的一部分,用于定義一對(duì)一(One-to-One)關(guān)系映射。它通常在 @Result 注解中使用,表示查詢某個(gè)字段時(shí),通過(guò)關(guān)聯(lián)查詢來(lái)獲取其他表的數(shù)據(jù),并將結(jié)果映射到另一個(gè)實(shí)體類上。
典型應(yīng)用場(chǎng)景:
- 一對(duì)一關(guān)聯(lián):比如,用戶 (User) 和用戶檔案 (Profile) 之間的一對(duì)一關(guān)系。在 User 中有一個(gè) Profile 類型的屬性,@One 可以用來(lái)指定如何查詢和填充這個(gè)屬性。
基本語(yǔ)法:
@Result(property = "profile", column = "profile_id",
one = @One(select = "com.example.mapper.ProfileMapper.selectProfileById"))
- property:對(duì)應(yīng) Java 類中的屬性。
- column:對(duì)應(yīng)數(shù)據(jù)庫(kù)中的字段,通常是關(guān)聯(lián)的外鍵。
- one:指明了關(guān)聯(lián)查詢的一對(duì)一關(guān)系,
select屬性是關(guān)聯(lián)查詢的 SQL 方法。
詳細(xì)說(shuō)明:
- @Result:用來(lái)映射數(shù)據(jù)庫(kù)結(jié)果到 Java 對(duì)象字段的注解。
- @One:定義一對(duì)一映射關(guān)系,通過(guò) select 指定需要執(zhí)行的關(guān)聯(lián)查詢的方法,通常是一個(gè)查詢關(guān)聯(lián)實(shí)體的方法。
例子:
假設(shè)我們有兩個(gè)實(shí)體類,User 和 Profile,并且這兩個(gè)實(shí)體類之間有一對(duì)一關(guān)系。我們需要通過(guò) User 查詢出與之相關(guān)的 Profile,即通過(guò) User 的 profile_id 字段關(guān)聯(lián)到 Profile 表。
1. 實(shí)體類
public class User {
private Integer id;
private String username;
private Profile profile; // 這里有一個(gè)一對(duì)一關(guān)系,User 擁有一個(gè) Profile
// getter 和 setter 略
}
public class Profile {
private Integer id;
private String address;
// getter 和 setter 略
}
2. 數(shù)據(jù)庫(kù)表結(jié)構(gòu):
users 表:
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(255),
profile_id INT
);
profiles 表:
CREATE TABLE profiles (
id INT PRIMARY KEY,
address VARCHAR(255)
);
3. Mapper 接口
public interface UserMapper {
@Select("SELECT id, username, profile_id FROM users WHERE id = #{id}")
@Results({
@Result(property = "profile", column = "profile_id",
one = @One(select = "com.example.mapper.ProfileMapper.selectProfileById"))
})
User selectUserById(Integer id);
}
4. ProfileMapper 接口
public interface ProfileMapper {
@Select("SELECT * FROM profiles WHERE id = #{profileId}")
Profile selectProfileById(Integer profileId);
}
工作原理:
- @Select 查詢:selectUserById 方法從 users 表中查詢 User 的基本信息。其中profile_id 字段存儲(chǔ)的是 Profile 表的主鍵。
- @Results 注解:通過(guò) @Result 注解,profile_id 字段被映射到 User 類的 profile 屬性,但是一個(gè)是int,一個(gè)是Profile類,所以這里就要用到@One。
- @One 注解:@One 注解指定了如何加載 Profile 信息。具體來(lái)說(shuō),它使用 selectProfileById 方法根據(jù) profile_id 字段來(lái)查詢 Profile 表,從中找出對(duì)應(yīng)的 Profile 實(shí)體,然后賦值給User 類的 profile 屬性。
@One相關(guān)參數(shù)
- select:指定用來(lái)執(zhí)行關(guān)聯(lián)查詢的方法,通常是一個(gè)查詢關(guān)聯(lián)實(shí)體的 Mapper 方法。例如,在這個(gè)例子中,com.example.mapper.ProfileMapper.selectProfileById 用來(lái)查詢 Profile 信息。
- fetchType:控制是否立即加載或延遲加載關(guān)聯(lián)數(shù)據(jù)。這是可選的。有效值為 lazy (懶加載)和 eager(急加載)。 指定屬性后,將在映射中忽略全局配置參數(shù) lazyLoadingEnabled,使用屬性的值。
總結(jié)
- @One 注解 用于指定 MyBatis 一對(duì)一關(guān)聯(lián)查詢的行為,在 @Result 中使用。
- @Result 用來(lái)將查詢的結(jié)果映射到 Java 對(duì)象的字段。
- @One(select = "someMethod") 用來(lái)指定關(guān)聯(lián)查詢的方法,通常在有外鍵關(guān)聯(lián)的字段上使用。
- @One 可以用于懶加載關(guān)聯(lián)對(duì)象,從而提高性能。
學(xué)完@One,@Many也差不多可以掌握了,二者語(yǔ)法是類似的。
到此這篇關(guān)于MyBatis中@One的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)MyBatis @One內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot中的pom文件?project報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了springboot中的pom文件?project報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Spring?Boot模板引擎在后端開(kāi)發(fā)中的實(shí)戰(zhàn)應(yīng)用(附實(shí)例代碼)
Spring Boot作為一款流行的開(kāi)源框架,極大地簡(jiǎn)化了開(kāi)發(fā)過(guò)程,提供了快速構(gòu)建應(yīng)用程序的能力,它不僅能夠幫助開(kāi)發(fā)人員輕松實(shí)現(xiàn)各種功能,還能提高開(kāi)發(fā)效率和代碼質(zhì)量,這篇文章主要介紹了Spring?Boot模板引擎在后端開(kāi)發(fā)中實(shí)戰(zhàn)應(yīng)用的相關(guān)資料,需要的朋友可以參考下2026-03-03
幾種常見(jiàn)的Java運(yùn)行時(shí)異常小結(jié)
在Java編程語(yǔ)言中異常處理是一項(xiàng)關(guān)鍵的機(jī)制,它幫助開(kāi)發(fā)者識(shí)別和修復(fù)程序運(yùn)行時(shí)可能出現(xiàn)的問(wèn)題,下面這篇文章主要給大家介紹了幾種常見(jiàn)的Java運(yùn)行時(shí)異常的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08
Java實(shí)現(xiàn)跨服務(wù)器上傳文件功能
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)跨服務(wù)器上傳文件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
基于Java實(shí)現(xiàn)的簡(jiǎn)易規(guī)則引擎
這篇文章主要介紹了基于Java實(shí)現(xiàn)的簡(jiǎn)易規(guī)則引擎,支持動(dòng)態(tài)選擇表和字段形成各種判定規(guī)則,并進(jìn)行不同組合,通過(guò)數(shù)據(jù)模型設(shè)計(jì)、樹形結(jié)構(gòu)設(shè)計(jì)和遞歸處理機(jī)制,實(shí)現(xiàn)了規(guī)則的判斷和組合,感興趣的可以了解一下2026-02-02
SpringCloudGateway網(wǎng)關(guān)處攔截并修改請(qǐng)求的操作方法
這篇文章主要介紹了SpringCloudGateway網(wǎng)關(guān)處攔截并修改請(qǐng)求的操作方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12
SpringBoot輕松整合MongoDB的全過(guò)程記錄
這篇文章主要給大家介紹了關(guān)于SpringBoot輕松整合MongoDB的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
springboot集成shiro自定義登陸過(guò)濾器方法
這篇文章主要介紹了springboot集成shiro自定義登陸過(guò)濾器方法,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
java?ThreadPoolExecutor線程池內(nèi)部處理流程解析
這篇文章主要為大家介紹了java?ThreadPoolExecutor線程池內(nèi)部處理流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

