天天看點

MyBatis之級聯小結

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

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

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

MyBatis之級聯小結

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

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

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

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

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

      本文轉自zsdnr  51CTO部落格,原文連結:http://blog.51cto.com/12942149/1929699,如需轉載請自行聯系原作者