文章目錄
前言
如果從數(shù)據(jù)庫查詢出來的數(shù)據(jù)無法直接映射會實體類對象,那么就可以通過自定義映射來解決這個問題
一、自定義映射是什么?
是自定義的映射關(guān)系,可實現(xiàn)高級結(jié)果集映射。
注意: 不能與 同時使用。
二、使用場景 場景一:字段名和屬性名不一致
若字段名和實體類中的屬性名不一致,但是字段名符合數(shù)據(jù)庫的規(guī)則(使用_),實體類中的屬性
名符合Java的規(guī)則(使用駝峰)如字段名,屬性名
可通過以下兩種方式處理字段名和實體類中的屬性的映射關(guān)系:
1.為字段起別名的方式,保證和實體類中的屬性名保持一致
即查詢語句中設(shè)置: ,,age,sex from table
而不使用 * from table
2.在的核心配置文件中設(shè)置一個全局配置信息Case
可以在查詢表中數(shù)據(jù)時,自動將_類型的字段名轉(zhuǎn)換為駝峰
設(shè)置全局配置之后只需要常規(guī)使用 * from table
返回的數(shù)據(jù)字段名雖然還是,當時框架會自動將此類型的字段名轉(zhuǎn)化為(即駝峰命名)
3.通過自定義映射一一指定每一個字段所要映射的屬性 場景二:單表查詢返回的字段和成員屬性不匹配(即多對一,一對多映射) 多對一映射:
若需要查詢員工以及所對應(yīng)的部門信息時,此時查詢模型為多對一映射
由于員工對象屬性中存在類屬性即dept類屬性,因此通過兩表聯(lián)查返回來的數(shù)據(jù)并沒有辦法直接進行賦值給員工對象屬性,此時有三種方法來解決這個問題:
使用級聯(lián)的方式處理映射關(guān)系 使用處理映射關(guān)系 分步查詢 級聯(lián):
? ?
兩表聯(lián)查之后直接將did,dname部門屬性賦值給員工對象中的成員變量dept,通過dept.did,dept.dname這種方式就可以指定要為成員變量的哪一個屬性來進行賦值
方式:

? ?
員工表和部門表兩表聯(lián)查之后指定字段中不可重復(fù)的,通過標簽就不需要在指定成員變量屬性所對應(yīng)的類名了,即=did這樣寫既可以進行賦值,不需要指定該屬性所對應(yīng)的類名dept,相較于上一個級聯(lián)的方式較于簡便,尤其是當該成員變量中的屬性比較多時效果尤為明顯。
分步查詢:
第一步:
select="com.example.MyBatis.mapper.DeptMapper.getEmpDeptByStep" column="did">
? ?
要查詢員工和部門的信息,也可以通過分布查詢的方式來獲取,第一步先查詢員工信息,然后將員工信息中的部門ID()作為第二部查詢的條件來獲取部門數(shù)據(jù),通過標簽中的標簽來指定第二步要執(zhí)行的方法的位置,為方法參數(shù),返回的結(jié)果會直接賦值給="dept"
第二步:
根據(jù)第一步查詢的部門ID查詢部門指定字段中不可重復(fù)的,并將結(jié)果返回對應(yīng)屬性
一對多映射:
若要查詢一個部門信息以及部門內(nèi)所有的員工信息,此時的模型為一對多映射
即部門對象dept中有成員變量emps,該變量為list集合類型,里面包含所有屬于該部門的員工的信息
處理一對多映射的方法有兩種:
分步查詢 查詢:

? ?
部門表左外連接員工表之后通過集合可以將查詢出來的數(shù)據(jù)中關(guān)于員工信息的數(shù)據(jù)不斷地循環(huán)賦值到emps員工集合之中
分布查詢:
第一步:

? ?
先通過部門ID獲取部門信息,然后通過第二步查詢獲取員工信息賦值給部門對象中的emps集合屬性,其中標簽用來指定需要映射回去的數(shù)據(jù)的類型并循環(huán)賦值,標簽用來指定第二步查詢的方法位置,指定查詢的條件
第二步:
通過部門ID查詢員工信息并將返回的數(shù)據(jù)賦值給部門的emps員工集合屬性
當然:分步查詢有著良好的查詢優(yōu)勢:即延遲加載和按需加載
例如當映射方法寫的是分步查詢,當我們只需要部門的名字的時候,可以通過開啟延遲加載來讓第二部查詢員工信息的方法不執(zhí)行,這樣就可以減少不必要的運算消耗,提高系統(tǒng)的流暢性能,那么怎么實現(xiàn)分步加載的功能:
首先需要在核心配置文件-.xml中設(shè)置全局配置信息: :延遲加載的全局開關(guān)。當開啟時,所有關(guān)聯(lián)對象(即分步查詢)都會延遲加載 g:當開啟時,任何方法的調(diào)用都會加載該對象的所有屬性。否則,每個屬 性會按需加載 此時就可以實現(xiàn)按需加載,獲取的數(shù)據(jù)是什么,就只會執(zhí)行相應(yīng)的sql。當然也可通過和中的屬性設(shè)置當前的分步查詢是否使用延遲加載, ="lazy(延遲加 載)|eager(立即加載)"
總結(jié)
以上就是自定義映射的相關(guān)知識點啦,如果你覺得文章對你有幫助的話,可以分享給你的好友看哦,分享的知識讓我們共同進步,一起見證對方的成長!!!