日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mybatis学习(55):延迟加载

發(fā)布時間:2023/12/10 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatis学习(55):延迟加载 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

MyBatis中的延遲加載,也稱為懶加載,是指在進行關聯(lián)查詢時,按照設置延遲規(guī)則推遲對關聯(lián)對象的select查詢。延遲加載可以有效的減少數(shù)據(jù)庫壓力。

??? 注意:MyBatis的延遲加載只是對關聯(lián)對象的查詢有延遲設置,對于主加載對象都是直接執(zhí)行查詢語句的。

一、關聯(lián)對象加載時機

、關聯(lián)對象加載時機

MyBatis根據(jù)對關聯(lián)對象查詢的select語句的執(zhí)行時機,分為三種類型:直接加載、侵入式加載與深度延遲加載

??? 直接加載:執(zhí)行完對主加載對象的select語句,馬上執(zhí)行對關聯(lián)對象的select查詢。
??? 侵入式延遲:執(zhí)行對主加載對象的查詢時,不會執(zhí)行對關聯(lián)對象的查詢。但當要訪問主加載對象的詳情時,就會馬上執(zhí)行關聯(lián)對象的select查詢。即對關聯(lián)對象的查詢執(zhí)行,侵入到了主加載對象的詳情訪問中。也可以這樣理解:將關聯(lián)對象的詳情侵入到了主加載對象的詳情中,即將關聯(lián)對象的詳情作為主加載對象的詳情的一部分出現(xiàn)了。
??? 深度延遲:執(zhí)行對主加載對象的查詢時,不會執(zhí)行對關聯(lián)對象的查詢。訪問主加載對象的詳情時也不會執(zhí)行關聯(lián)對象的select查詢。只有當真正訪問關聯(lián)對象的詳情時,才會執(zhí)行對關聯(lián)對象的select查詢。

??? 注意:延遲加載的應用要求,關聯(lián)對象的查詢與主加載對象的查詢必須是分別進行的select語句,不能是使用多表連接所進行的select查詢。因為,多表連接查詢,其實質(zhì)是對一張表的查詢,對由多個表連接后形成的一張表的查詢。會一次性將多張表的所有信息查詢出來。

二、直接加載

1.主配置文件(Mybatis.xml)

全局屬性lazyLoadingEnabled的值只要設置為false,那么,對于關聯(lián)對象的查詢,將采用直接加載。即在查詢過主加載對象后,會馬上查詢關聯(lián)對象。

lazyLoadingEnabled的默認值為false,即直接加載。

<settings><!-- 延遲加載總開關 --><setting name="lazyLoadingEnabled" value="false"/> </settings>

2.mapper映射文件?

<mapper namespace="com.hcx.dao.IMinisterDao"><select id="selectCountryById" resultType="Country">select cid,cname from country where cid=#{cid}</select><resultMap type="Minister" id="ministerMapper"><id column="mid" property="mid"/><result column="mname" property="mname"/><association property="country"javaType="Country"select="selectCountryById"column="countryId"/></resultMap><select id="selectMinisterById" resultMap="ministerMapper">select mid,mname,countryId from minister where mid=#{mid}</select> </mapper>

3.測試類:

當程序執(zhí)行到斷點處語句時,不僅對country表進行了查詢,對minister表也同時進行了查詢。

?

public class MyTest {private ICountryDao dao;private SqlSession session;@Beforepublic void setUp(){session = MyBatisUtils.getSqlSession();dao = session.getMapper(ICountryDao.class);}@Afterpublic void tearDown(){if(session!=null){session.close();}}@Testpublic void test01(){ Country country = dao.selectCountryById(2);//此處加斷點System.out.println(country);System.out.println(country.getMinisters().size());} }

三、深度延遲加載

修改主配置文件的,將延遲加載開關lazyLoadingEnabled開啟(置為true),將侵入式延遲加載開關aggressiveLazyLoading關閉(置為false)。

?

<settings><!-- 延遲加載總開關 --><setting name="lazyLoadingEnabled" value="true"/><!-- 侵入式延遲加載開關 --><setting name="aggressiveLazyLoading" value="false"/> </settings>

?此時,只有當代碼執(zhí)行到輸出Minister對象詳情時,底層才執(zhí)行select語句對minister表進行查詢。

四、侵入式延遲加載

修改主配置文件的,將延遲加載開關lazyLoadingEnabled開啟(置為true),將侵入式延遲加載開關aggressiveLazyLoading也開啟(置為true,默認為true)。

?

<settings><!-- 延遲加載總開關 --><setting name="lazyLoadingEnabled" value="true"/><!-- 侵入式延遲加載開關 --><setting name="aggressiveLazyLoading" value="true"/> </settings>

?測試類

@Test public void test01(){ Country country = dao.selectCountryById(2);//此處加斷點System.out.println(country);System.out.println(country.getMinisters().size()); }

當代碼執(zhí)行斷點處語句時會立即查詢country表,但每查詢minister表。說明現(xiàn)在的延遲加載已經(jīng)啟動。
當對country對象的詳情進行訪問時,對minister表也進行了查詢。因為該延遲加載策略已經(jīng)將主加載對象的關聯(lián)屬性也作為主加載對象的基本信息了,而前面已經(jīng)查詢出了主加載對象的基本信息,但其關聯(lián)對象基本信息尚無。所以,馬上進行對minister表的查詢。
換個角度來說,該延遲策略使關聯(lián)對象的數(shù)據(jù)侵入到了主加載對象的數(shù)據(jù)中,所以稱為侵入式延遲加載。

??? 注意:該延遲策略也是一種延遲加載,需要在延遲加載開關lazyLoadingEnabled開啟時才會起作用。若lazyLoadingEnabled為false,則aggressiveLazyLoading無論取何值,均不起作用。

?

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的mybatis学习(55):延迟加载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。