實際的開發中,對數據庫的操作常常會涉及到多張表,這在面向對象中就涉及到了對象與對象之間的關聯關係。針對多表之間的操作,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 >
元素進行處理(其用法和一對多關聯關係查詢語句用法基本相同)。
在數據庫中,多對多的關聯關係通常使用一箇中間表來維護。