三種關聯關係:一對多,一對一,多對多java
兩種查詢方式:嵌套查詢,鏈接查詢(也可稱做:多表單獨查詢,多表鏈接查詢)數據庫
每一種關聯關係均可以經過嵌套查詢和鏈接查詢來實現。ide
嵌套查詢至關於進行了兩次查詢,而鏈接查詢將兩張錶鏈接而後再進行查詢,這樣只進行了一次查詢對象
因爲數據表要對實體類進行映射,因此每一種關聯關係中都須要在java類中定義屬性來進行關聯,能夠經過如圖關聯:blog
數據表實現:經過A表的主鍵引用B表的主鍵做爲外鍵,就是說在A中主鍵和外鍵同一字段。ci
查詢方式:嵌套查詢,鏈接查詢;it
關係:丈夫和妻子(Husband Wife)io
嵌套查詢實現:class
在實體類husband中關聯wife,進行鏈接查詢以後,須要使用resultMap對查出來的結果進行結果映射;表單
resultMap中type屬性指定映射的類型;id標籤爲主鍵,result爲普通屬性;
association標籤指定關聯一個類,property屬性是它在數據表中的屬性名,javaType是關聯屬性的java類型;
鏈接查詢實現:
其中association標籤中:
select屬性: 加載另一個映射語句,能夠加載這個屬性映射須要的複雜類型,(就是能夠再加載指定的映射類型)
column屬性:用於給select傳遞參數,能夠將已經獲取到的屬性值,傳遞給目標 select 語句做爲參數;
數據表實現:使用一個外鍵進行關聯,外鍵放在多方的表中;
關聯屬性:能夠寫在一方的實體類中也能夠寫在多方的實體類中;
以多表鏈接查詢爲例:
關係:一個國家對應多個部長
經過resultMap進行結果映射,collection標籤能夠指定映射的集合,其中porperty屬性指定的是該關聯屬性的名稱,ofType指定的是集合裏面的java類型,id,result標籤同resultMap中的同樣是對集合裏面的屬性進行映射;
多表單獨查詢(嵌套查詢):
與一對一中相似,在resultMap的collection中聲明中元素類型,而後插入參數,將查詢結果進行映射;
數據表:一張數據表中包含着全部的條目,條目之間爲一對多的關係(一個欄目下面包含着多個欄目)
查詢方式:鏈接查詢(本身鏈接本身)和嵌套查詢(調用自身查詢)
以嵌套查詢爲例:
這是經過父欄目查詢子欄目的自關聯查詢:
在resultMap中collection的select中調用原來的查詢語句進行查詢,造成一個循環調用,一直到查詢到的子欄目爲空的時候中止;最後對查詢結果進行映射。
固然,也可經過子欄目查找它的全部的父欄目;
數據表:須要用一張中間表表示多對多的關係,這張中間表引入兩張表的主鍵做爲外鍵;
查詢方式:
多表嵌套查詢定義中間實體類:
因爲兩張表之間分別單獨查詢,須要經過中間表查找關聯並使用resultMap進行映射關係處理,resultMap須要指明映射的java的類,並在實體類中定義關聯屬性才能夠獲得關聯屬性的信息;簡單來講:一張表查詢完以後想要獲得另外一張表的信息,其實是經過中間表來進行映射獲得另外一張表的信息的;
多表複雜查詢:經過一張表先和中間表進行鏈接查詢,而後再查詢另外一張表的信息;
複雜查詢返回值是一個List:
因爲一張表先和中間錶鏈接,而中間表是多對多的關係;因此獲得一個一對多的List形式查詢結果;
相似這樣一對多:
實際上除了數據庫的知識之外,Mybatis中的關聯關係實現,主要經過resultMap來實現的