淺談MyBatis的關聯映射

實際的開發中,對數據庫的操作常常會涉及到多張表,這在面向對象中就涉及到了對象與對象之間的關聯關係。針對多表之間的操作,MyBatis提供了關聯映射,通過關聯映射就可以很好的處理對象與對象之間的關聯關係。

在關係型數據庫中,多表之間存在着三種關聯關係,分別爲一對一、一對多和多對多:
在這裏插入圖片描述
一對一 :在任意一方引入對方主鍵作爲外鍵;在本類中定義對方類型的對象,如A類中定義B類類型的屬性b,B類中定義A類類型的屬性a;
一對多:在“”的一方,添加“一”的一方的主鍵作爲外鍵;一個A類類型對應多個B類類型的情況,需要在A類中以集合的方式引入B類類型的對象,在B類中定義A類類型的屬性a;
多對多:產生中間關係表,引入兩張表的主鍵作爲外鍵,兩個主鍵成爲聯合主鍵或使用新的字段作爲主鍵;在A類中定義B類類型的集合,在B類中定義A類類型的集合。

一對一

<resultMap>元素中,包含了一個<association>子元素,MyBatis就是通過該元素來處理一對一關聯關係的。
<association>元素中,通常可以配置以下屬性:
在這裏插入圖片描述
MyBatis加載關聯關係對象主要通過兩種方式:嵌套查詢和嵌套結果
在這裏插入圖片描述
在這裏插入圖片描述
雖然使用嵌套查詢的方式比較簡單,但是嵌套查詢的方式要執行多條SQL語句,這對於大型數據集合和列表展示不是很好,因爲這樣可能會導致成百上千條關聯的SQL語句被執行,從而極大的消耗數據庫性能並且會降低查詢效率。

使用MyBatis的延遲加載在一定程度上可以降低運行消耗並提高查詢效率。MyBatis默認沒有開啓延遲加載,需要在覈心配置文件中的<settings>元素內進行配置,具體配置方式如下:

	<settings>
            <setting name="lazyLoadingEnabled" value="true" />  
            <setting name="aggressiveLazyLoading" value="false"/>  
    </settings>

在映射文件中,<association>元素和<collection>元素中都已默認配置了延遲加載屬性,即默認屬性fetchType=“lazy”(屬性fetchType="eager"表示立即加載),所以在配置文件中開啓延遲加載後,無需在映射文件中再做配置。

一對多

<resultMap>元素中,包含了一個<collection>子元素,MyBatis就是通過該元素來處理一對多關聯關係的。<collection>子元素的屬性大部分與<association>元素相同,但其還包含一個特殊屬性–ofType 。
ofType屬性與javaType屬性對應,它用於指定實體對象中集合類屬性所包含的元素類型。

<collection >元素的使用也非常簡單,同樣可以參考如下兩種示例進行配置,具體代碼如下:
在這裏插入圖片描述

多對多

多對多的關聯關係查詢,同樣可以使用<collection >元素進行處理(其用法和一對多關聯關係查詢語句用法基本相同)。
在數據庫中,多對多的關聯關係通常使用一箇中間表來維護。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章