mybatis学习(55):延迟加载
MyBatis中的延遲加載,也稱為懶加載,是指在進行關聯查詢時,按照設置延遲規則推遲對關聯對象的select查詢。延遲加載可以有效的減少數據庫壓力。
??? 注意:MyBatis的延遲加載只是對關聯對象的查詢有延遲設置,對于主加載對象都是直接執行查詢語句的。
一、關聯對象加載時機
、關聯對象加載時機
MyBatis根據對關聯對象查詢的select語句的執行時機,分為三種類型:直接加載、侵入式加載與深度延遲加載
??? 直接加載:執行完對主加載對象的select語句,馬上執行對關聯對象的select查詢。
??? 侵入式延遲:執行對主加載對象的查詢時,不會執行對關聯對象的查詢。但當要訪問主加載對象的詳情時,就會馬上執行關聯對象的select查詢。即對關聯對象的查詢執行,侵入到了主加載對象的詳情訪問中。也可以這樣理解:將關聯對象的詳情侵入到了主加載對象的詳情中,即將關聯對象的詳情作為主加載對象的詳情的一部分出現了。
??? 深度延遲:執行對主加載對象的查詢時,不會執行對關聯對象的查詢。訪問主加載對象的詳情時也不會執行關聯對象的select查詢。只有當真正訪問關聯對象的詳情時,才會執行對關聯對象的select查詢。
??? 注意:延遲加載的應用要求,關聯對象的查詢與主加載對象的查詢必須是分別進行的select語句,不能是使用多表連接所進行的select查詢。因為,多表連接查詢,其實質是對一張表的查詢,對由多個表連接后形成的一張表的查詢。會一次性將多張表的所有信息查詢出來。
二、直接加載
1.主配置文件(Mybatis.xml)
全局屬性lazyLoadingEnabled的值只要設置為false,那么,對于關聯對象的查詢,將采用直接加載。即在查詢過主加載對象后,會馬上查詢關聯對象。
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.測試類:
當程序執行到斷點處語句時,不僅對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>?此時,只有當代碼執行到輸出Minister對象詳情時,底層才執行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()); }當代碼執行斷點處語句時會立即查詢country表,但每查詢minister表。說明現在的延遲加載已經啟動。
當對country對象的詳情進行訪問時,對minister表也進行了查詢。因為該延遲加載策略已經將主加載對象的關聯屬性也作為主加載對象的基本信息了,而前面已經查詢出了主加載對象的基本信息,但其關聯對象基本信息尚無。所以,馬上進行對minister表的查詢。
換個角度來說,該延遲策略使關聯對象的數據侵入到了主加載對象的數據中,所以稱為侵入式延遲加載。
??? 注意:該延遲策略也是一種延遲加載,需要在延遲加載開關lazyLoadingEnabled開啟時才會起作用。若lazyLoadingEnabled為false,則aggressiveLazyLoading無論取何值,均不起作用。
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的mybatis学习(55):延迟加载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql在cmd命令行下的相关操作
- 下一篇: DOS 常用命令