Mybatis中連接查詢和嵌套查詢實(shí)例代碼
首先在mysql中確立表:
#表一:地址國(guó)家表 CREATE TABLE address(aid INT AUTO_INCREMENT PRIMARY KEY,aname VARCHAR(20)); INSERT INTO address VALUES(NULL,"魏國(guó)"); INSERT INTO address VALUES(NULL,"蜀國(guó)"); INSERT INTO address VALUES(NULL,"吳國(guó)"); #表二:出場(chǎng)人物表 CREATE TABLE person( pid INT AUTO_INCREMENT PRIMARY KEY, pname VARCHAR(20), paid INT, CONSTRAINT pafk FOREIGN KEY person(paid) REFERENCES address(aid) ON UPDATE CASCADE ON DELETE CASCADE ); INSERT INTO person VALUES(1,"曹操",1); INSERT INTO person VALUES(2,"荀彧",1); INSERT INTO person VALUES(3,"張遼",1); INSERT INTO person VALUES(4,"劉備",2); INSERT INTO person VALUES(5,"關(guān)羽",2); INSERT INTO person VALUES(6,"張飛",2); INSERT INTO person VALUES(7,"諸葛亮",2); INSERT INTO person VALUES(8,"孫權(quán)",3); INSERT INTO person VALUES(9,"周瑜",3); INSERT INTO person VALUES(10,"陸遜",3); INSERT INTO person VALUES(11,"公孫瓚",NULL); #表三:交通工具表 CREATE TABLE tool(tid INT AUTO_INCREMENT PRIMARY KEY,tname VARCHAR(20)); INSERT INTO tool VALUES(1,"馬"); INSERT INTO tool VALUES(2,"船"); #表四:地址國(guó)家——交通工具 多對(duì)多關(guān)系表 CREATE TABLE aandt( a_aid INT, a_tid INT, PRIMARY KEY(a_aid,a_tid),#聯(lián)合主鍵,是指多個(gè)字段組成一個(gè)組合,該組合在數(shù)據(jù)表中唯一 CONSTRAINT FOREIGN KEY aandt(a_aid) REFERENCES address(aid) ON UPDATE CASCADE ON DELETE CASCADE, CONSTRAINT FOREIGN KEY aandt(a_tid) REFERENCES tool(tid) ON UPDATE CASCADE ON DELETE CASCADE ); INSERT INTO aandt VALUES(1,1); INSERT INTO aandt VALUES(2,1); INSERT INTO aandt VALUES(2,2); INSERT INTO aandt VALUES(3,2);
查詢a表的所有信息,如果a表的信息有對(duì)應(yīng)的b表的信息,則查詢b表的信息,如果沒有,則不查詢。
多對(duì)一,如:查詢所有人物信息,如果人物有對(duì)應(yīng)國(guó)家,則查詢國(guó)家信息,如果沒有,則不查詢。多個(gè)人物屬于一個(gè)國(guó)家。
一對(duì)多,如:查詢所有國(guó)家信息,如果國(guó)家有對(duì)應(yīng)人物,則查詢?nèi)宋镄畔ⅲ绻麤]有,則不查詢。一個(gè)國(guó)家擁有多個(gè)城市。
多對(duì)多,如:查詢所有國(guó)家信息,如果國(guó)家擁有對(duì)應(yīng)的交通工具,則查詢交通工具信息,沒有則不查詢。與此同時(shí),多種交通工具存在于于多個(gè)國(guó)家。
一、連接查詢:
連接查詢使用時(shí),使用偏向于a表所在方向的外連接,可獲得a表所有信息,和對(duì)應(yīng)的b表信息。該方式為餓漢式,內(nèi)存占用較大,但對(duì)數(shù)據(jù)庫(kù)訪問次數(shù)較少而導(dǎo)致消耗時(shí)間少。
1、多對(duì)一:
<!--多對(duì)一的數(shù)據(jù)庫(kù)--> <mapper namespace="com.fh.dao.PersonDao"> <!--該映射的id為map1,該映射的內(nèi)容為:將查詢到的字段的結(jié)果值,按照本映射的對(duì)應(yīng)關(guān)系,分別封裝在Person實(shí)體類下的各個(gè)屬性上,整體構(gòu)成Person--> <resultMap id="map1" type="com.fh.domain.Person"> <id column="pid" property="pid"/><!--id:主鍵映射; column:數(shù)據(jù)庫(kù)表字段; property:類中對(duì)應(yīng)屬性名--> <result column="pname" property="pname"/><!--result:非主鍵映射--> <result column="paid" property="paid"/> <association property="address" javaType="com.fh.domain.Address"><!--association:在查詢到多,然后對(duì)應(yīng)出一時(shí),用于關(guān)聯(lián)對(duì)應(yīng)出一的一方; property:查詢類中包含的子對(duì)象屬性; javaType:子對(duì)象屬性封裝對(duì)應(yīng)的類--> <id column="aid" property="aid"/> <result column="aname" property="aname"/> </association> </resultMap> <select id="findAllPerson" resultMap="map1">/*resultMap:自己編寫的結(jié)果集,本查詢的返回值正是該結(jié)果集所對(duì)應(yīng)的映射組構(gòu)成的Person*/ -- 查詢所有人及其對(duì)應(yīng)的地址,以人為主,則對(duì)人側(cè)外連接 SELECT * FROM person p LEFT OUTER JOIN address a ON p.paid = a.aid </select> </mapper>
2、一對(duì)多:
<!--一對(duì)多的數(shù)據(jù)庫(kù)--> <mapper namespace="com.fh.dao.AddressDao"> <resultMap id="map2" type="com.fh.domain.Address"> <id column="aid" property="aid"/> <result column="aname" property="aname"/> <collection property="personList" ofType="com.fh.domain.Person"><!--collection:查詢到一,接著關(guān)聯(lián)對(duì)應(yīng)出多時(shí),指向多的一方; foType:集合中每個(gè)元素所屬的映射類--> <id column="pid" property="pid"/> <result column="pname" property="pname"/> <result column="paid" property="paid"/> </collection> </resultMap> <select id="findAllAddress" resultMap="map2"> SELECT * FROM address a LEFT OUTER JOIN person p ON a.aid = p.paid; </select> </mapper>
3、多對(duì)多:
<mapper namespace="com.fh.dao.ToolDao"> <resultMap id="map3" type="com.fh.domain.Tool"> <id column="tid" property="tid"/> <result column="tname" property="tname"/> <collection property="addressList" ofType="com.fh.domain.Address"> <id column="aid" property="aid"/> <result column="aname" property="aname"/> </collection> </resultMap> <select id="findAllTool" resultMap="map3"> SELECT t.*,a.* FROM tool AS t LEFT OUTER JOIN aandt AS a_t ON t.`tid` = a_t.`a_tid` LEFT OUTER JOIN address AS a ON a_t.`a_aid` = a.`aid`; </select>
二、嵌套查詢:
嵌套查詢使用時(shí),先查詢a表的信息,然后依賴a和b表的外鍵約束,利用in(),再次查詢b表對(duì)應(yīng)到a表上的信息。該方式可以改為餓漢式,內(nèi)存使用較小,但需要多次訪問數(shù)據(jù)庫(kù)而導(dǎo)致消耗時(shí)間多。
1、多對(duì)一:
PersonDao接口內(nèi)寫入:
//查詢所有人,以及其對(duì)應(yīng)的地址 List<Person> findPersonFromAddress();
對(duì)應(yīng)映射配置中:
<!--多對(duì)一的數(shù)據(jù)庫(kù)--> <mapper namespace="com.fh.dao.PersonDao"> <!--person映射的基本屬性對(duì)應(yīng)下面person的結(jié)果集,本結(jié)果集內(nèi)部再繼續(xù)進(jìn)行處理--> <resultMap id="map1" type="com.fh.domain.Person"> <id column="pid" property="pid"/> <result column="pname" property="pname"/> <result column="paid" property="paid"/> <!-- 對(duì)應(yīng)到person內(nèi)的子屬性對(duì)象,column內(nèi)為person對(duì)應(yīng)到address的外鍵,由此外鍵,傳入select內(nèi)的方法進(jìn)行二次嵌套查詢,交由AddressDao在其中的指定方法進(jìn)行處理 即要求查詢目標(biāo)為:Address.aid = Person.paid --> <association property="address" column="paid" select="com.fh.dao.AddressDao.findAddressById"/> </resultMap> <!--第一次查詢?yōu)橹徊樵冎饕獙?duì)象,自定義結(jié)果集--> <select id="findPersonFromAddress" resultMap="map1"> select * from person </select> </mapper>
繼續(xù)編寫指向AddressDao接口中的findAddressById:
//按照id查詢Address List<Address> findAddressById(Integer id);
回到AddressDao配置文件:
<mapper namespace="com.fh.dao.AddressDao"> <!--根據(jù)id對(duì)address查詢--> <select id="findAddressById" resultType="com.fh.domain.Address"> SELECT * FROM address WHERE aid = #{aid} </select>
2、一對(duì)多:
AddressDao接口內(nèi)寫入:
List<Address> findAddressWithPerson();
其對(duì)應(yīng)映射配置中:
<resultMap id="map2" type="com.fh.domain.Address"> <id column="aid" property="aid"/> <result column="aname" property="aname"/> <collection property="personList" column="aid" select="com.fh.dao.PersonDao.findPersonById"/> </resultMap> <select id="findAddressWithPerson" resultMap="map2"> select * from address </select>
針對(duì)指出的PersonDao接口的findPersonById:
List<Person> findPersonById(Integer id);
其對(duì)應(yīng)的映射配置中:
<select id="findPersonById" resultType="com.fh.domain.Person"> select * from person where pid = #{pid} </select>
對(duì)于嵌套查詢的延遲加載問題,需添加配置:
方法一:
association或collection中多加一條屬性:fetchType=“l(fā)azy”
方法二:
<settings> <setting name="lazyLoadingEnable" value="true"/> <setting name="lazyLoadTriggerMethods" value="true"/><!--本條設(shè)置表示將包括原本不會(huì)延遲加載的equals/clone/hashCode/toString在內(nèi)所有方法進(jìn)行延遲加載--> </settings>
到此這篇關(guān)于Mybatis中連接查詢和嵌套查詢的文章就介紹到這了,更多相關(guān)Mybatis連接查詢和嵌套查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java+MySQL實(shí)現(xiàn)圖書管理系統(tǒng)(完整代碼)
這篇文章主要介紹了Java+MySQL實(shí)現(xiàn)圖書管理系統(tǒng)(完整代碼),本文給大家介紹的非常想詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Java使用Redisson分布式鎖實(shí)現(xiàn)原理
Redisson分布式鎖 之前的基于注解的鎖有一種鎖是基本redis的分布式鎖,這篇文章主要介紹了Java使用Redisson分布式鎖實(shí)現(xiàn)原理,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-10-10SpringCloud解決Feign異步回調(diào)問題(SpringBoot+Async+Future實(shí)現(xiàn))
這篇文章主要介紹了SpringCloud解決Feign異步回調(diào)問題(SpringBoot+Async+Future實(shí)現(xiàn)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11SpringData整合ElasticSearch實(shí)現(xiàn)CRUD的示例代碼(超詳細(xì))
本文主要介紹了SpringData整合ElasticSearch實(shí)現(xiàn)CRUD的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07SpringBoot啟動(dòng)過程的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot啟動(dòng)過程的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09