SSM-Mybatis-映射器-級聯
級聯的好處是擷取資料關聯十分便捷,但級聯過多會增加系統的複雜程度,還降低系統的性能,當級聯層級超過3層,就不需要考慮使用級聯了,原有是,會造成多個對象關聯 ,導緻系統耦合,複雜,難以維護。是以要根據情況使用。
Mybatis中的級聯
級聯分為三種:
- 鑒别器(discriminator):根據某些條件采用具體實作類級聯的方案,如:體檢表要根據性别去區分
- 一對一(association):如:一個學生對應一個學号
- 一對多(collection):如:班主任對學生
注意:Mybatis沒有多對多級聯,通過兩個一對多級聯進行替換
N+1問題
在N個關聯關系完成了級聯,隻要在加入一個關聯關系,就變成N+1個級聯,所有的級聯SQL都會被執行,顯然會有很多不是我們關心的資料被去除,會造成資源浪費,這就是N+1問題。
Mybaits提供了延遲功能,對應N+1問題。
延遲加載(*)
好處:在一次性把常用級聯資料通過SQL直接查詢出來,而對那些不常用的級聯資料不要取出,而是等待需要時才取出,這時不常用的級聯資料可以采用延遲加載的功能
在Mybatis的setting配置中可以配置級聯:
配置項 | 作用 | 配置選項說明 | 預設值 |
---|---|---|---|
lazyLoadingEnabled | 延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設定 屬性來覆寫該項的開關狀态。 | true|false | false |
aggressiveLazyLoading | 開啟時,任一方法的調用都會加載該對象的所有延遲加載屬性。 否則,每個延遲加載屬性會按需加載(參考 )。 | true|false | false(在 3.4.1 及之前的版本中預設為 true) |
aggressiveLazyLoading:配置項是一個層級開關,當為true時它是開啟了層級開關的延遲加載。
另外使用fetchType屬性:可以處理全局定義無法處理的問題,進行自定義(注意:discriminator沒有這個屬性可配置)
這個屬性有兩個值:
- eager:擷取目前POJO後立刻加載對應的資料
- lazy:擷取目前POJO後延遲加載對應的資料
另一種級聯
- 每一個級聯元素中屬性id的配置和POJO實體配置的id要對應,形成級聯。
- 在級聯元素中,association是通過javaType的定義去聲明實體映射的,而collection則是使用ofType進行聲明的
- discriminator元素定義使用何種具體的resultMap進行級聯
多對多級聯
現實中多對多級聯相當複雜,更多是分拆成兩個一對多的關系。