天天看點

MyBatis之級聯

在這之前我們知道了MyBatis為我們提供了三種級聯:一對一關系(assocation)、一對多關系(collection)、鑒别器(discriminator)。在最後一個鑒别器例子中,看到了當層級關系比較負責時,我們似乎已經難以應對和維護各種級聯關系,在對資料庫進行查詢是否應用MyBatis為我們提供的級聯這需要在實際中去斟酌和取舍。在我們通過級聯來查詢資訊時會發現有一個問題,當我們隻想查詢出學生的普通資訊(姓名、性别),而不想查詢出他的成績、課程、體檢表時,之前的三個例子不管你是否需要成績、課程等資訊它都會去執行,隻要有一個關聯。這并不是我們所想要的,我們所想要的是,我需要時才去執行這條sql,我需要成績時才将此條sql發送到資料庫查詢出結果,不需要時就不需要發送到資料庫進行查詢。很高興的是,MyBatis為我們提供了這一需求,即:lazyLoadingEnabled。

我們在mybatis-config.xml配置檔案中做一下配置:

<settings>
    <setting name="lazyLoadingEnabled" value="true"/><!-- 開啟懶加載模式(按需加載),預設情況下是即時加載 -->
</settings>      

這句話的意思就是我們上面所要想達到的效果——按需加載。但其實隻有這麼一句話是不夠的,MyBatis的延遲加載方式是按層級延遲加載。

MyBatis之級聯

當我們在查詢學生的基本資訊時,MyBatis會根據鑒别器去找到健康情況。而在當我們通路課程成績時,由于學生證和課程成績出于同一層級,是以學生證也會跟着被加載。隻有課程不是和課程成績出于同一層級,是以它不會被加載。這還沒有達到我們想要的“按需加載”效果,我們所想要達到的按需加載是真正隻有用到的時候才會去加載。這個時候就需要在剛剛的配置檔案中再做以下的配置:

<settings>
    <setting name="lazyLoadingEnabled" value="true"/><!-- 開啟懶加載模式(按需加載),預設情況下是即時加載 -->
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>      

attressiveLazyLoading配置項,意思就是這個意思——侵略性延遲加載。

這實際上是在mybatis-config.xml檔案中做的全局配置,當想要針對某些屬性進行延遲加載,對某些屬性進行立即加載時,我們可以細化到具體的mapper映射配置檔案中去。例如StudentMapper.xml:

MyBatis之級聯
1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper  
 3   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
 4   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <mapper namespace="day_8_mybatis.mapper.StudentMapper">
 6     <resultMap type="day_8_mybatis.pojo.Student" id="studentMap">
 7         <id property="id" column="id"/>
 8         <result property="name" column="name"/>
 9         <result property="sex" column="sex"/>
10         <association property="selfCard" column="id" select="day_8_mybatis.mapper.SelfCardMapper.findSelfCardByStudentId" fetchType="lazy"/>
11         <collection property="courseScoreList" column="id" select="day_8_mybatis.mapper.CourseScoreMapper.findCourseScoreByStudentId" fetchType="eager"/>
12         <discriminator javaType="string" column="sex">
13             <case value="男" resultMap="maleStudentMap"/>
14             <case value="女" resultMap="femaleStudentMap"/>
15         </discriminator>
16     </resultMap>
17 <!--以下省略-->      
MyBatis之級聯

在第10行中我們對查詢出學生的學生證資訊配置為延遲加載,第11行中我們對查詢出學生的課程成績做了立即加載配置。

以上幾乎就是MyBatis級聯的全部内容,至于用級聯還是用sql的join語句隻有在實際中去認真仔細考量和權衡。

不積跬步,無以至千裡;不積小流,無以成江海。

轉載網址:http://www.cnblogs.com/yulinfeng/p/6036296.html