最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis中連接查詢和嵌套查詢實(shí)例代碼

 更新時(shí)間:2020年12月09日 15:48:16   作者:櫻花樹下的貓老師  
這篇文章主要給大家介紹了關(guān)于Mybatis中連接查詢和嵌套查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

首先在mysql中確立表:

#表一:地址國家表
CREATE TABLE address(aid INT AUTO_INCREMENT PRIMARY KEY,aname VARCHAR(20));

INSERT INTO address VALUES(NULL,"魏國");
INSERT INTO address VALUES(NULL,"蜀國");
INSERT INTO address VALUES(NULL,"吳國");


#表二:出場(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,"船");


#表四:地址國家——交通工具 多對(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)國家,則查詢國家信息,如果沒有,則不查詢。多個(gè)人物屬于一個(gè)國家。

一對(duì)多,如:查詢所有國家信息,如果國家有對(duì)應(yīng)人物,則查詢?nèi)宋镄畔?,如果沒有,則不查詢。一個(gè)國家擁有多個(gè)城市。

多對(duì)多,如:查詢所有國家信息,如果國家擁有對(duì)應(yīng)的交通工具,則查詢交通工具信息,沒有則不查詢。與此同時(shí),多種交通工具存在于于多個(gè)國家。

一、連接查詢:

連接查詢使用時(shí),使用偏向于a表所在方向的外連接,可獲得a表所有信息,和對(duì)應(yīng)的b表信息。該方式為餓漢式,內(nèi)存占用較大,但對(duì)數(shù)據(jù)庫訪問次數(shù)較少而導(dǎo)致消耗時(shí)間少。

1、多對(duì)一:

<!--多對(duì)一的數(shù)據(jù)庫-->
 <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ù)庫表字段; 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ù)庫-->
 <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ù)庫而導(dǎo)致消耗時(shí)間多。

1、多對(duì)一:

PersonDao接口內(nèi)寫入:

//查詢所有人,以及其對(duì)應(yīng)的地址
 List<Person> findPersonFromAddress();

對(duì)應(yīng)映射配置中:

<!--多對(duì)一的數(shù)據(jù)庫-->
 <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)文章

  • SpringBoot密碼加密的實(shí)現(xiàn)示例

    SpringBoot密碼加密的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot密碼加密的實(shí)現(xiàn)示例,包括引入依賴、配置加密工具、生成加密密鑰、加密密碼、配置解密,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • Java基于Socket實(shí)現(xiàn)網(wǎng)絡(luò)編程實(shí)例詳解

    Java基于Socket實(shí)現(xiàn)網(wǎng)絡(luò)編程實(shí)例詳解

    本文主要給大家介紹的是Java基于Socket實(shí)現(xiàn)網(wǎng)絡(luò)編程的實(shí)例,并給大家介紹了TCP與UDP傳輸協(xié)議,有需要的小伙伴可以來參考下
    2016-07-07
  • mybatis快速入門學(xué)習(xí)教程新手注意問題小結(jié)

    mybatis快速入門學(xué)習(xí)教程新手注意問題小結(jié)

    MyBatis 是支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射的優(yōu)秀的持久層框架。接下來通過本文給大家介紹mybatis快速入門學(xué)習(xí)教程新手注意問題小結(jié),需要的朋友可以參考下
    2017-02-02
  • springboot實(shí)現(xiàn)微信掃碼登錄的項(xiàng)目實(shí)踐

    springboot實(shí)現(xiàn)微信掃碼登錄的項(xiàng)目實(shí)踐

    微信掃碼功能是目前第三方登錄常見功能,前不久有個(gè)項(xiàng)目剛好用上,本文主要介紹了springboot實(shí)現(xiàn)微信掃碼登錄的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • java中的static{}塊的實(shí)例詳解

    java中的static{}塊的實(shí)例詳解

    這篇文章主要介紹了java中的static{}塊的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例來幫助大家理解該如何使用static塊,需要的朋友可以參考下
    2017-08-08
  • SpringBoot中的@ControllerAdvice使用方法詳細(xì)解析

    SpringBoot中的@ControllerAdvice使用方法詳細(xì)解析

    這篇文章主要介紹了SpringBoot中的@ControllerAdvice使用方法詳細(xì)解析, 加了@ControllerAdvice的類為那些聲明了@ExceptionHandler、@InitBinder或@ModelAttribute注解修飾的 方法的類而提供的專業(yè)化的@Component,以供多個(gè) Controller類所共享,需要的朋友可以參考下
    2024-01-01
  • java面試常見問題之Hibernate總結(jié)

    java面試常見問題之Hibernate總結(jié)

    這篇文章主要介紹了在java面試過程中hibernate比較常見的問題,包括Hibernate的檢索方式,Hibernate中對(duì)象的狀態(tài),Hibernate的3種檢索策略是什么,Session的find()方法以及Query接口的區(qū)別等方面問題的總結(jié),需要的朋友可以參考下
    2015-07-07
  • Java?多個(gè)時(shí)間區(qū)間進(jìn)行合并處理方法

    Java?多個(gè)時(shí)間區(qū)間進(jìn)行合并處理方法

    用戶在選擇多個(gè)時(shí)間區(qū)間之后,如選擇的時(shí)間區(qū)間連續(xù)或者有重疊,需要對(duì)所選的時(shí)間區(qū)間進(jìn)行合并,這其實(shí)是一個(gè)區(qū)間合并問題,下面通過本文給大家介紹Java?多個(gè)時(shí)間區(qū)間進(jìn)行合并處理的解決方案,一起看看吧
    2024-02-02
  • Java中的移位運(yùn)算符使用及原理詳解

    Java中的移位運(yùn)算符使用及原理詳解

    在 Java 中,移位運(yùn)算符用于對(duì)二進(jìn)制數(shù)進(jìn)行位移操作,它們可以將一個(gè)數(shù)的所有位向左或向右移動(dòng)指定的位數(shù),本文小編將給大家詳細(xì)的介紹一下Java移位運(yùn)算符,需要的朋友可以參考下
    2023-09-09
  • Java源碼解析LinkedList

    Java源碼解析LinkedList

    今天小編就為大家分享一篇關(guān)于Java源碼解析LinkedList,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01

最新評(píng)論

修武县| 壶关县| 连城县| 宝清县| 通渭县| 德清县| 寿宁县| 蓬莱市| 嘉荫县| 莱阳市| 枞阳县| 凤城市| 青神县| 茌平县| 睢宁县| 怀仁县| 乌鲁木齐县| 黑龙江省| 广河县| 萨迦县| 禄丰县| 双峰县| 荔浦县| 乌兰浩特市| 松阳县| 延安市| 白银市| 沛县| 旺苍县| 寻乌县| 上思县| 盘锦市| 堆龙德庆县| 普格县| 西乡县| 饶河县| 和平县| 临洮县| 绥滨县| 衡阳市| 玉林市|