我們之前有說(shuō)
resultMap
可以用于延遲加載
那么今天我們就來(lái)一起
研究一下延遲加載
為什么需要延遲加載寡夹?
在我們的實(shí)際開(kāi)發(fā)中,如果單表查詢能滿足業(yè)務(wù)需求厂置。盡量用單表查詢菩掏,因?yàn)?b>單表查詢的效率比多表關(guān)聯(lián)查詢快。那么當(dāng)業(yè)務(wù)需求需要用到多表查詢,我們應(yīng)該怎么辦呢昵济?Mybatis 引入了延遲加載的概念智绸。
什么叫延遲加載?
為了滿足業(yè)務(wù)需求访忿,必須進(jìn)行多表查詢時(shí)瞧栗,可以先進(jìn)行單表查詢 ,在業(yè)務(wù)信息中需要用到關(guān)聯(lián)表信息的時(shí)候醉顽,再進(jìn)行關(guān)聯(lián)表的單表查詢沼溜。
我們來(lái)做一個(gè)小例子
我們?cè)跀?shù)據(jù)庫(kù)中建了幾張表平挑,先來(lái)看一下用戶表的表數(shù)據(jù)游添,其中有一個(gè)字段為DEPT_ID代表我們的部門(mén)系草。
再來(lái)看那一下我們的部門(mén)表。
那么現(xiàn)在我們想查詢用戶的部門(mén)名稱唆涝,利用單表分開(kāi)查詢找都,的過(guò)程如下:
先查詢用戶得到用戶的的部門(mén) ID(DEPT_ID)
再根據(jù) DEPT_ID 獲取部門(mén)的名稱
那么現(xiàn)在我們來(lái)演示一下,利用mybatis的延遲加載實(shí)現(xiàn)廊酣。用兩條SQL語(yǔ)句來(lái)查詢能耻,先來(lái)寫(xiě)一下接口。
再來(lái)寫(xiě)一下我們的SQL映射文件中的SQL語(yǔ)句亡驰。
這邊只有一條查詢語(yǔ)句晓猛,進(jìn)行了一次查詢。
利用上面的這條語(yǔ)句凡辱,就可以找到我們的 deptMapper.Java 中的方法〗渲埃現(xiàn)在DeptMapper.Java 中添加一個(gè) getDeptById();方法。
在我們的 deptMapper.xml 中添加 SQL 語(yǔ)句透乾。
寫(xiě)好之后現(xiàn)在來(lái)測(cè)試一下洪燥,查詢一下 ID=1 的用戶的部門(mén)名稱。
看到我們的查詢結(jié)果了乳乌,是頂級(jí)部門(mén)捧韵。這僅僅是實(shí)現(xiàn)了利用兩條語(yǔ)句來(lái)進(jìn)行多表查詢,還沒(méi)有實(shí)現(xiàn)延遲加載汉操。
Mybatis 的延遲加載實(shí)現(xiàn)
Mybatis 提供了全局設(shè)置參數(shù)和 resultMap 標(biāo)簽的高級(jí)應(yīng)用來(lái)實(shí)現(xiàn)延遲加載
setting 設(shè)置
這是沒(méi)有設(shè)置延遲加載的再来,我們打了個(gè)斷點(diǎn),看一下磷瘤∑浔祝可以看出還沒(méi)有執(zhí)行到獲取部門(mén)名稱的那條語(yǔ)句,我們的部門(mén)信息就已經(jīng)加載出來(lái)了膀斋。
這是設(shè)置了延遲加載的結(jié)果梭伐,同樣的地方打的斷點(diǎn),dept 對(duì)象是空的仰担,表示我們的第二條查詢語(yǔ)句沒(méi)有執(zhí)行糊识。
按下 F6 下一步。
這個(gè)時(shí)候摔蓝,我們的第二條語(yǔ)句才執(zhí)行赂苗,dept 的內(nèi)容才加載進(jìn)來(lái)了。
好的各位小伙伴
今天的延遲加載
就分享到這里了
記得要練習(xí)呦贮尉!
拜拜拌滋!