Mybatis中3種關(guān)聯(lián)關(guān)系的實(shí)現(xiàn)方法示例
三種關(guān)聯(lián)關(guān)系:一對(duì)多,一對(duì)一,多對(duì)多
兩種查詢方式:嵌套查詢,連接查詢(也可稱作:多表單獨(dú)查詢,多表連接查詢)
每一種關(guān)聯(lián)關(guān)系都可以通過(guò)嵌套查詢和連接查詢來(lái)實(shí)現(xiàn)。
嵌套查詢相當(dāng)于進(jìn)行了兩次查詢,而連接查詢將兩張表連接然后再進(jìn)行查詢,這樣只進(jìn)行了一次查詢
由于數(shù)據(jù)表要對(duì)實(shí)體類進(jìn)行映射,所以每一種關(guān)聯(lián)關(guān)系中都需要在java類中定義屬性來(lái)進(jìn)行關(guān)聯(lián),可以通過(guò)如圖關(guān)聯(lián):
一對(duì)一查詢
數(shù)據(jù)表實(shí)現(xiàn):通過(guò)A表的主鍵引用B表的主鍵作為外鍵,就是說(shuō)在A中主鍵和外鍵同一字段。
查詢方式:嵌套查詢,連接查詢;
關(guān)系:丈夫和妻子(Husband Wife)
嵌套查詢實(shí)現(xiàn):
在實(shí)體類husband中關(guān)聯(lián)wife,進(jìn)行連接查詢之后,需要使用resultMap對(duì)查出來(lái)的結(jié)果進(jìn)行結(jié)果映射;
resultMap中type屬性指定映射的類型;id標(biāo)簽為主鍵,result為普通屬性;
association標(biāo)簽指定關(guān)聯(lián)一個(gè)類,property屬性是它在數(shù)據(jù)表中的屬性名,javaType是關(guān)聯(lián)屬性的java類型;
連接查詢實(shí)現(xiàn):
其中association標(biāo)簽中:
select屬性: 加載另外一個(gè)映射語(yǔ)句,可以加載這個(gè)屬性映射需要的復(fù)雜類型,(就是可以再加載指定的映射類型)
column屬性:用于給select傳遞參數(shù),可以將已經(jīng)獲取到的屬性值,傳遞給目標(biāo) select 語(yǔ)句作為參數(shù);
一對(duì)多查詢
數(shù)據(jù)表實(shí)現(xiàn):使用一個(gè)外鍵進(jìn)行關(guān)聯(lián),外鍵放在多方的表中;
關(guān)聯(lián)屬性:可以寫(xiě)在一方的實(shí)體類中也可以寫(xiě)在多方的實(shí)體類中;
- 寫(xiě)在一方中,使用list或別的集合進(jìn)行關(guān)聯(lián)(一方找多方)
- 寫(xiě)在多方中,定義關(guān)聯(lián)對(duì)象屬性(通過(guò)多方找一方)
以多表連接查詢?yōu)槔?/strong>
關(guān)系:一個(gè)國(guó)家對(duì)應(yīng)多個(gè)部長(zhǎng)
通過(guò)resultMap進(jìn)行結(jié)果映射,collection標(biāo)簽可以指定映射的集合,其中porperty屬性指定的是該關(guān)聯(lián)屬性的名稱,ofType指定的是集合里面的java類型,id,result標(biāo)簽同resultMap中的一樣是對(duì)集合里面的屬性進(jìn)行映射;
多表單獨(dú)查詢(嵌套查詢):
與一對(duì)一中類似,在resultMap的collection中聲明中元素類型,然后插入?yún)?shù),將查詢結(jié)果進(jìn)行映射;
自關(guān)聯(lián)查詢:
數(shù)據(jù)表:一張數(shù)據(jù)表中包含著所有的條目,條目之間為一對(duì)多的關(guān)系(一個(gè)欄目下面包含著多個(gè)欄目)
查詢方式:連接查詢(自己連接自己)和嵌套查詢(調(diào)用自身查詢)
以嵌套查詢?yōu)槔?/p>
這是通過(guò)父欄目查詢子欄目的自關(guān)聯(lián)查詢:
在resultMap中collection的select中調(diào)用原來(lái)的查詢語(yǔ)句進(jìn)行查詢,形成一個(gè)循環(huán)調(diào)用,一直到查詢到的子欄目為空的時(shí)候停止;最后對(duì)查詢結(jié)果進(jìn)行映射。
當(dāng)然,也可通過(guò)子欄目查找它的所有的父欄目;
多對(duì)多查詢
數(shù)據(jù)表:需要用一張中間表表示多對(duì)多的關(guān)系,這張中間表引入兩張表的主鍵作為外鍵;
查詢方式:
- 多表連接查詢,不需要定義中間表實(shí)體類
- 多表嵌套查詢,需要定義中間表實(shí)體類
- 多表復(fù)雜查詢,不需要定義中間表實(shí)體類,但是返回值是一個(gè)List;
多表嵌套查詢定義中間實(shí)體類:
由于兩張表之間分別單獨(dú)查詢,需要通過(guò)中間表查找關(guān)聯(lián)并使用resultMap進(jìn)行映射關(guān)系處理,resultMap需要指明映射的java的類,并在實(shí)體類中定義關(guān)聯(lián)屬性才可以得到關(guān)聯(lián)屬性的信息;簡(jiǎn)單來(lái)說(shuō):一張表查詢完之后想要得到另一張表的信息,實(shí)際上是通過(guò)中間表來(lái)進(jìn)行映射得到另一張表的信息的;
多表復(fù)雜查詢:通過(guò)一張表先和中間表進(jìn)行連接查詢,然后再查詢另一張表的信息;
復(fù)雜查詢返回值是一個(gè)List:
由于一張表先和中間表連接,而中間表是多對(duì)多的關(guān)系;所以得到一個(gè)一對(duì)多的List形式查詢結(jié)果;
類似這樣一對(duì)多:
總結(jié):
實(shí)際上除了數(shù)據(jù)庫(kù)的知識(shí)以外,Mybatis中的關(guān)聯(lián)關(guān)系實(shí)現(xiàn),主要通過(guò)resultMap來(lái)實(shí)現(xiàn)的
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
- Mybatis多表關(guān)聯(lián)查詢的實(shí)現(xiàn)(DEMO)
- Mybatis 一對(duì)多和多對(duì)一關(guān)聯(lián)查詢問(wèn)題
- 深入淺出MyBatis中映射文件和實(shí)體類的關(guān)聯(lián)性
- 實(shí)例講解Java的MyBatis框架對(duì)MySQL中數(shù)據(jù)的關(guān)聯(lián)查詢
- MyBatis實(shí)踐之動(dòng)態(tài)SQL及關(guān)聯(lián)查詢
- MyBatis學(xué)習(xí)教程(五)-實(shí)現(xiàn)關(guān)聯(lián)表查詢方法詳解
- MyBatis學(xué)習(xí)筆記(二)之關(guān)聯(lián)關(guān)系
- mybatis實(shí)現(xiàn)一對(duì)一關(guān)聯(lián)映射實(shí)例代碼
- mybatis多對(duì)多關(guān)聯(lián)實(shí)戰(zhàn)教程(推薦)
- mybatis實(shí)現(xiàn)表與對(duì)象的關(guān)聯(lián)關(guān)系_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
相關(guān)文章
Java基于elasticsearch實(shí)現(xiàn)集群管理
這篇文章主要介紹了java基于elasticsearch實(shí)現(xiàn)集群管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02深入講解基于JDK的動(dòng)態(tài)代理機(jī)制
眾所周知相比于靜態(tài)代理,動(dòng)態(tài)代理避免了開(kāi)發(fā)人員編寫(xiě)各個(gè)繁鎖的靜態(tài)代理類,下面這篇文章主要給大家介紹了關(guān)于基于JDK的動(dòng)態(tài)代理機(jī)制的相關(guān)資料,文中通過(guò)圖文以及示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-07-07關(guān)于RabbitMQ的Channel默認(rèn)線程
這篇文章主要介紹了關(guān)于RabbitMQ的Channel默認(rèn)線程,通過(guò)jvm工具觀察rabbitmq的線程使用情況,發(fā)現(xiàn)生產(chǎn)者每發(fā)一條消息,消費(fèi)者這邊就會(huì)創(chuàng)建一條線程,言下之意,一個(gè)channel當(dāng)消息來(lái)到時(shí)就會(huì)異步處理這些消息,需要的朋友可以參考下2023-09-09使用Sharding-JDBC對(duì)數(shù)據(jù)進(jìn)行分片處理詳解
這篇文章主要介紹了使用Sharding-JDBC對(duì)數(shù)據(jù)進(jìn)行分片處理詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Java數(shù)據(jù)結(jié)構(gòu)之簡(jiǎn)單鏈表的定義與實(shí)現(xiàn)方法示例
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之簡(jiǎn)單鏈表的定義與實(shí)現(xiàn)方法,簡(jiǎn)單描述了鏈接的概念、原理,并結(jié)合實(shí)例形式分析了java定義與使用鏈表的相關(guān)步驟與操作技巧,需要的朋友可以參考下2017-10-10Springboot項(xiàng)目啟動(dòng)找不到啟動(dòng)類的解決
這篇文章主要介紹了Springboot項(xiàng)目啟動(dòng)找不到啟動(dòng)類的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Java超詳細(xì)講解如何生成隨機(jī)整數(shù)
在?Java?中,生成隨機(jī)數(shù)的場(chǎng)景有很多,所以本文我們就來(lái)盤(pán)點(diǎn)一下?幾種生成隨機(jī)數(shù)的方式,以及它們之間的區(qū)別和每種生成方式所對(duì)應(yīng)的場(chǎng)景2022-05-05