Mybatis中三種關聯關係的實現

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

兩種查詢方式:嵌套查詢,鏈接查詢(也可稱做:多表單獨查詢,多表鏈接查詢)數據庫

每一種關聯關係均可以經過嵌套查詢和鏈接查詢來實現。ide

嵌套查詢至關於進行了兩次查詢,而鏈接查詢將兩張錶鏈接而後再進行查詢,這樣只進行了一次查詢對象

因爲數據表要對實體類進行映射,因此每一種關聯關係中都須要在java類中定義屬性來進行關聯,能夠經過如圖關聯:blog

Mybatis中三種關聯關係的實現

一對一查詢

數據表實現:經過A表的主鍵引用B表的主鍵做爲外鍵,就是說在A中主鍵和外鍵同一字段。ci

查詢方式:嵌套查詢,鏈接查詢;it

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

嵌套查詢實現:class

Mybatis中三種關聯關係的實現

在實體類husband中關聯wife,進行鏈接查詢以後,須要使用resultMap對查出來的結果進行結果映射;表單

resultMap中type屬性指定映射的類型;id標籤爲主鍵,result爲普通屬性;

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

鏈接查詢實現:

Mybatis中三種關聯關係的實現

其中association標籤中:

select屬性: 加載另一個映射語句,能夠加載這個屬性映射須要的複雜類型,(就是能夠再加載指定的映射類型)

column屬性:用於給select傳遞參數,能夠將已經獲取到的屬性值傳遞給目標 select 語句做爲參數;

一對多查詢

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

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

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

以多表鏈接查詢爲例:

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

Mybatis中三種關聯關係的實現

經過resultMap進行結果映射,collection標籤能夠指定映射的集合,其中porperty屬性指定的是該關聯屬性的名稱,ofType指定的是集合裏面的java類型,id,result標籤同resultMap中的同樣是對集合裏面的屬性進行映射;

多表單獨查詢(嵌套查詢):

Mybatis中三種關聯關係的實現

與一對一中相似,在resultMap的collection中聲明中元素類型,而後插入參數,將查詢結果進行映射;

自關聯查詢:

數據表:一張數據表中包含着全部的條目,條目之間爲一對多的關係(一個欄目下面包含着多個欄目)

查詢方式:鏈接查詢(本身鏈接本身)和嵌套查詢(調用自身查詢)

 以嵌套查詢爲例:

Mybatis中三種關聯關係的實現

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

在resultMap中collection的select中調用原來的查詢語句進行查詢,造成一個循環調用,一直到查詢到的子欄目爲空的時候中止;最後對查詢結果進行映射。

固然,也可經過子欄目查找它的全部的父欄目;

多對多查詢

數據表:須要用一張中間表表示多對多的關係,這張中間表引入兩張表的主鍵做爲外鍵;

查詢方式:

  1. 多表鏈接查詢,不須要定義中間表實體類
  2. 多表嵌套查詢,須要定義中間表實體類
  3. 多表複雜查詢,不須要定義中間表實體類,可是返回值是一個List

多表嵌套查詢定義中間實體類:

因爲兩張表之間分別單獨查詢,須要經過中間表查找關聯並使用resultMap進行映射關係處理,resultMap須要指明映射的java的類,並在實體類中定義關聯屬性才能夠獲得關聯屬性的信息;簡單來講:一張表查詢完以後想要獲得另外一張表的信息,其實是經過中間表來進行映射獲得另外一張表的信息的;

多表複雜查詢:經過一張表先和中間表進行鏈接查詢,而後再查詢另外一張表的信息;

Mybatis中三種關聯關係的實現

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

因爲一張表先和中間錶鏈接,而中間表是多對多的關係;因此獲得一個一對多的List形式查詢結果;

相似這樣一對多:

Mybatis中三種關聯關係的實現

總結:

實際上除了數據庫的知識之外,Mybatis中的關聯關係實現,主要經過resultMap來實現的

相關文章
相關標籤/搜索