mybatis之嵌套查詢(xún)和嵌套結(jié)果有哪些區(qū)別
mybatis嵌套查詢(xún)和嵌套結(jié)果有啥區(qū)別
嵌套查詢(xún)的弊端:即嵌套查詢(xún)的N+1問(wèn)題
盡管嵌套查詢(xún)大量的簡(jiǎn)化了存在關(guān)聯(lián)關(guān)系的查詢(xún),但它的弊端也比較明顯:即所謂的N+1問(wèn)題。關(guān)聯(lián)的嵌套查詢(xún)顯示得到一個(gè)結(jié)果集,然后根據(jù)這個(gè)結(jié)果集的每一條記錄進(jìn)行關(guān)聯(lián)查詢(xún)。
現(xiàn)在假設(shè)嵌套查詢(xún)就一個(gè)(即resultMap內(nèi)部就一個(gè)association標(biāo)簽),現(xiàn)查詢(xún)的結(jié)果集返回條數(shù)為N,那么關(guān)聯(lián)查詢(xún)語(yǔ)句將會(huì)被執(zhí)行N次,加上自身返回結(jié)果集查詢(xún)1次,共需要訪問(wèn)數(shù)據(jù)庫(kù)N+1次。
如果N比較大的話,這樣的數(shù)據(jù)庫(kù)訪問(wèn)消耗是非常大的!所以使用這種嵌套語(yǔ)句查詢(xún)的使用者一定要考慮慎重考慮,確保N值不會(huì)很大。
嵌套結(jié)果查詢(xún)
嵌套語(yǔ)句的查詢(xún)會(huì)導(dǎo)致數(shù)據(jù)庫(kù)訪問(wèn)次數(shù)不定,進(jìn)而有可能影響到性能。
Mybatis還支持一種嵌套結(jié)果的查詢(xún):即對(duì)于一對(duì)多,多對(duì)多,多對(duì)一的情況的查詢(xún),Mybatis通過(guò)聯(lián)合查詢(xún),將結(jié)果從數(shù)據(jù)庫(kù)內(nèi)一次性查出來(lái),然后根據(jù)其一對(duì)多,多對(duì)一,多對(duì)多的關(guān)系和ResultMap中的配置,進(jìn)行結(jié)果的轉(zhuǎn)換,構(gòu)建需要的對(duì)象。
探索嵌套查詢(xún)和嵌套結(jié)果這對(duì)孿生子的秘密!?。?/h2>
MyBatis在映射文件中加載關(guān)聯(lián)關(guān)系對(duì)象主要通過(guò)兩種方式:嵌套查詢(xún)和嵌套結(jié)果。
嵌套查詢(xún)是指通過(guò)執(zhí)行另外一條SQL映射語(yǔ)句來(lái)返回預(yù)期的復(fù)雜類(lèi)型;
嵌套結(jié)果是使用嵌套結(jié)果映射來(lái)處理重復(fù)的聯(lián)合結(jié)果的子集。開(kāi)發(fā)人員可以使用上述任意一種方式實(shí)現(xiàn)對(duì)關(guān)聯(lián)關(guān)系的加載。
這兩者之間有什么聯(lián)系?

如何理解這些區(qū)別呢?????
咱們直接代碼來(lái)說(shuō)話。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zsj.mapper.PersonMapper">
<!-- 嵌套查詢(xún):通過(guò)執(zhí)行另外一條SQL映射語(yǔ)句來(lái)返回預(yù)期的特殊類(lèi)型 -->
<select id="findPersonById" parameterType="Integer"
resultMap="IdCardWithPersonResult">
SELECT * from tb_person where id=#{id}
</select>
<resultMap type="Person" id="IdCardWithPersonResult">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="age" column="age" />
<result property="sex" column="sex" />
<!-- 一對(duì)一:association使用select屬性引入另外一條SQL語(yǔ)句 -->
<association property="card" column="card_id" javaType="IdCard"
select="com.zsj.mapper.IdCardMapper.findCodeById" />
</resultMap>
<!-- 嵌套結(jié)果:使用嵌套結(jié)果映射來(lái)處理重復(fù)的聯(lián)合結(jié)果的子集 -->
<select id="findPersonById2" parameterType="Integer"
resultMap="IdCardWithPersonResult2">
SELECT p.*,idcard.code
from tb_person p,tb_idcard idcard
where p.card_id=idcard.id
and p.id= #{id}
</select>
<resultMap type="Person" id="IdCardWithPersonResult2">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="age" column="age" />
<result property="sex" column="sex" />
<association property="card" javaType="IdCard">
<id property="id" column="card_id" />
<result property="code" column="code" />
</association>
</resultMap>
</mapper>
輸出結(jié)果:
嵌套查詢(xún):

嵌套結(jié)果:

從上面的調(diào)試日志可以看出,兩者不同方式的查詢(xún)SQL語(yǔ)句的難易程度和語(yǔ)句數(shù)。并且從代碼中不難看出兩者在編寫(xiě)SQL語(yǔ)句代碼方面不同,嵌套查詢(xún)相較于嵌套結(jié)果來(lái)說(shuō),編寫(xiě)較簡(jiǎn)單!??!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
參考文獻(xiàn):MyBatis官方文檔
相關(guān)文章
SpringBoot?整合?Elasticsearch?實(shí)現(xiàn)海量級(jí)數(shù)據(jù)搜索功能
這篇文章主要介紹了SpringBoot?整合?Elasticsearch?實(shí)現(xiàn)海量級(jí)數(shù)據(jù)搜索,本文主要圍繞?SpringBoot?整合?ElasticSearch?接受數(shù)據(jù)的插入和搜索使用技巧,在實(shí)際的使用過(guò)程中,版本號(hào)尤其的重要,不同版本的?es,對(duì)應(yīng)的?api?是不一樣,需要的朋友可以參考下2022-07-07
幾種JAVA細(xì)粒度鎖的實(shí)現(xiàn)方式
這篇文章主要為大家詳細(xì)介紹了幾種JAVA細(xì)粒度鎖的實(shí)現(xiàn)方式,感興趣的小伙伴們可以參考一下2016-05-05
關(guān)于SpringSecurity?Context?中獲取和更改當(dāng)前用戶(hù)信息的問(wèn)題
SpringSecurityContext在異步線程中無(wú)法獲取用戶(hù)信息,因其與請(qǐng)求線程綁定;此外,用戶(hù)信息更新后跳轉(zhuǎn)頁(yè)面時(shí),身份會(huì)被降級(jí)為匿名,導(dǎo)致信息無(wú)法及時(shí)同步,本文給大家介紹SpringSecurity?Context?中獲取和更改當(dāng)前用戶(hù)信息的問(wèn)題,感興趣的朋友一起看看吧2024-09-09
springboot創(chuàng)建監(jiān)聽(tīng)和處理事件的操作方法
這篇文章主要介紹了springboot創(chuàng)建監(jiān)聽(tīng)和處理事件的操作方法,使用Spring Boot的事件機(jī)制來(lái)監(jiān)聽(tīng)和處理事件有多種優(yōu)勢(shì),本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2024-07-07
ElasticSearch之索引模板滾動(dòng)索引實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了ElasticSearch之索引模板滾動(dòng)索引實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Java實(shí)現(xiàn)二分查找樹(shù)及其相關(guān)操作
二分查找樹(shù)是一種有組織的二叉樹(shù)。我們可以通過(guò)鏈接節(jié)點(diǎn)表示這樣一棵樹(shù),二分查找樹(shù)(Binary Search Tree)的基本操作有搜索、求最大值、求最小值、求前驅(qū)、求后繼、插入及刪除,對(duì)java二分查找樹(shù)相關(guān)知識(shí)感興趣的朋友一起看看吧2021-07-07
深入理解JavaWeb中過(guò)濾器與監(jiān)聽(tīng)器的應(yīng)用
這篇文章主要介紹了JavaWeb中過(guò)濾器與監(jiān)聽(tīng)器的應(yīng)用,過(guò)濾器能夠?qū)ζヅ涞恼?qǐng)求到達(dá)目標(biāo)之前或返回響應(yīng)之后增加一些處理代碼,監(jiān)聽(tīng)器是一個(gè)接口內(nèi)容由我們實(shí)現(xiàn),會(huì)在特定時(shí)間被調(diào)用,感興趣想要詳細(xì)了解可以參考下文2023-05-05

