1. 程式人生 > 程式設計 >Mybatis中3種關聯關係的實現方法示例

Mybatis中3種關聯關係的實現方法示例

三種關聯關係:一對多,一對一,多對多

兩種查詢方式:巢狀查詢,連線查詢(也可稱作:多表單獨查詢,多表連線查詢)

每一種關聯關係都可以通過巢狀查詢和連線查詢來實現。

巢狀查詢相當於進行了兩次查詢,而連線查詢將兩張表連線然後再進行查詢,這樣只進行了一次查詢

由於資料表要對實體類進行對映,所以每一種關聯關係中都需要在java類中定義屬性來進行關聯,可以通過如圖關聯:


一對一查詢

資料表實現:通過A表的主鍵引用B表的主鍵作為外來鍵,就是說在A中主鍵和外來鍵同一欄位。

查詢方式:巢狀查詢,連線查詢;

關係:丈夫和妻子(Husband Wife)

巢狀查詢實現:


在實體類husband中關聯wife,進行連線查詢之後,需要使用resultMap對查出來的結果進行結果對映;

resultMap中type屬性指定對映的型別;id標籤為主鍵,result為普通屬性;

association標籤指定關聯一個類,property屬性是它在資料表中的屬性名,javaType是關聯屬性的java型別;

連線查詢實現:


其中association標籤中:

select屬性: 載入另外一個對映語句,可以載入這個屬性對映需要的複雜型別,(就是可以再載入指定的對映型別)

column屬性:用於給select傳遞引數,可以將已經獲取到的屬性值,傳遞給目標 select 語句作為引數;

一對多查詢

資料表實現:使用一個外來鍵進行關聯,外來鍵放在多方的表中;

關聯屬性:可以寫在一方的實體類中也可以寫在多方的實體類中;

  1. 寫在一方中,使用list或別的集合進行關聯(一方找多方)
  2. 寫在多方中,定義關聯物件屬性(通過多方找一方)

以多表連線查詢為例:

關係:一個國家對應多個部長


通過resultMap進行結果對映,collection標籤可以指定對映的集合,其中porperty屬性指定的是該關聯屬性的名稱,ofType指定的是集合裡面的java型別,id,result標籤同resultMap中的一樣是對集合裡面的屬性進行對映;

多表單獨查詢(巢狀查詢):


與一對一中類似,在resultMap的collection中宣告中元素型別,然後插入引數,將查詢結果進行對映;

自關聯查詢:

資料表:一張資料表中包含著所有的條目,條目之間為一對多的關係(一個欄目下面包含著多個欄目)

查詢方式:連線查詢(自己連線自己)和巢狀查詢(呼叫自身查詢)

以巢狀查詢為例:


這是通過父欄目查詢子欄目的自關聯查詢:

在resultMap中collection的select中呼叫原來的查詢語句進行查詢,形成一個迴圈呼叫,一直到查詢到的子欄目為空的時候停止;最後對查詢結果進行對映。

當然,也可通過子欄目查詢它的所有的父欄目;

多對多查詢

資料表:需要用一張中間表表示多對多的關係,這張中間表引入兩張表的主鍵作為外來鍵;

查詢方式:

  1. 多表連線查詢,不需要定義中間表實體類
  2. 多表巢狀查詢,需要定義中間表實體類
  3. 多表複雜查詢,不需要定義中間表實體類,但是返回值是一個List;

多表巢狀查詢定義中間實體類:

由於兩張表之間分別單獨查詢,需要通過中間表查詢關聯並使用resultMap進行對映關係處理,resultMap需要指明對映的java的類,並在實體類中定義關聯屬性才可以得到關聯屬性的資訊;簡單來說:一張表查詢完之後想要得到另一張表的資訊,實際上是通過中間表來進行對映得到另一張表的資訊的;

多表複雜查詢:通過一張表先和中間表進行連線查詢,然後再查詢另一張表的資訊;


複雜查詢返回值是一個List:

由於一張表先和中間表連線,而中間表是多對多的關係;所以得到一個一對多的List形式查詢結果;

類似這樣一對多:


總結:

實際上除了資料庫的知識以外,Mybatis中的關聯關係實現,主要通過resultMap來實現的

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。