MyBatis(六)--多表關聯查詢


一  什么是多變關聯

1.所謂的多變關聯,就是表結構中存在多對一,一對多的現象,當然也存在多對多。

2.在真正的工作中,經常存在多表關聯的存在,就是說外鍵的存在。比如說:商品表goods,會關聯一個分類表,將每個商品進行分類處理。

3.Bean類中的多變關聯,作為分類表,應該存在有一個List對象來存放屬於該分類的商品對象。而每個商品表中也應該有一個分類bean對象用於說明商品的分類信息

4.在JDBC的正常操作中,我們需要通過兩次查詢來依次存放數據來完成商品Bean,分類Bean對象,當然這使用MyBatis同樣可以做到

5.在MyBatis中,提供了一些操作可以使我們在一次查詢中將直接完成Bean

二 多變關聯實現(一)

1.操作原理:

(1)在單表操作中,我們使用resultType來指定返回類型,並將得到的值依次類型傳遞到業務邏輯中去,而在多變關聯查詢中,我們則不使用resultType,而是使用resultMap將返回值以Map的形式傳遞到resultMap操作中。

(2)如何映射相應的resultMap?必須使得select中的resultMap的值與resultMap中的id值保持一致

(3)將返回值作為Map的話,列名作為key,那多條語句的key值重復問題?我們必須明確,在SQL語句中的多條語句查詢,是像指針逐條逐條輸出的,所以每次都是一個新的map雖然key值都是這些列名,但是Value值卻隨着指針的改變而改變。這也是為什么當我們需要返回一個List對象是,resultType依舊要寫List泛型中的Bean類。

2.一對多與多對多的實現

resultMap的實現

執行結果

 

(1)所謂一對多與多對多無非就是查詢一條與多條的區別,除了返回值一個是bean 對象一個是List對象外並沒有本質區別

(2)id與result,id用於設置主鍵的映射關系(這里也包括外聯表的主鍵),而result則用於設置非主鍵的映射關系

(3)collection中,用於設置外聯表的映射,使用ofType來設置外聯表的Bean類,而原本表的bean類由resultMap中的Type屬性確定

(4)column與property:column則是列名,即SQL語句返回出來的列名,property則是Bean對象的屬性名

3.多對一的實現

select語句:不用在意useCache屬性,這是用於設置緩存的屬性,與這次無關

resultMap語句:

(1)基本是所有東西與一對多相似,下面只說區別
(2)assciation替換javaType

 

 三 多變關聯實現(二)

1.一次查詢的缺陷

我們發現這種寫法實際上是很麻煩的,他需要將表關聯起來,就是使用連接的方式,也就是這樣

即使是一對多也會是這樣

導致了分類表信息大量的重復,如果只是這幾條數據沒什么問題,但是當數據量過大時則會出現效率問題,所以我們還是應該采用兩次查詢來完成操作,當然對於業務邏輯層的執行依舊是一次操作(不然的話,我們費力干這些是為了干嘛?)

2.兩次查詢的操作

執行結果

 

(1)我們本質上還是針對於selClassifyOneAndAll進行了查詢

(2)當返回結果進入classifySepMap中后,先是映射id和result屬性,在進入collection標簽中,而collection標簽中則使用select訪問下一次查詢,並將主鍵使用column屬性傳遞到下次查詢中,找到相應外鍵值並傳遞

(3)property中的list並非指類,而是Classify中的屬性名,第二次查詢(selGoodsByCid)會將結果返回成Goods的集合傳遞到這個屬性中。

 

 四 多變關聯實現(三)

1.約束 : 這種實現要求在select中講結果使用別名的方式與對象中的屬性名映射起來且值是用於多對一查詢

2.對於bean對象的內部bean對象屬性,要使用“bean屬性名.bean對象屬性名的“的方式來指定,但是由於點在SQL語句中有特殊含義,所以需要使用 `` 來取消他的特殊含義。

執行結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM