天天看點

SSM-Mybatis-映射器-級聯SSM-Mybatis-映射器-級聯

SSM-Mybatis-映射器-級聯

​ 級聯的好處是擷取資料關聯十分便捷,但級聯過多會增加系統的複雜程度,還降低系統的性能,當級聯層級超過3層,就不需要考慮使用級聯了,原有是,會造成多個對象關聯 ,導緻系統耦合,複雜,難以維護。是以要根據情況使用。

Mybatis中的級聯

​ 級聯分為三種:

  1. 鑒别器(discriminator):根據某些條件采用具體實作類級聯的方案,如:體檢表要根據性别去區分
  2. 一對一(association):如:一個學生對應一個學号
  3. 一對多(collection):如:班主任對學生

注意:Mybatis沒有多對多級聯,通過兩個一對多級聯進行替換

N+1問題

​ 在N個關聯關系完成了級聯,隻要在加入一個關聯關系,就變成N+1個級聯,所有的級聯SQL都會被執行,顯然會有很多不是我們關心的資料被去除,會造成資源浪費,這就是N+1問題。

​ Mybaits提供了延遲功能,對應N+1問題。

延遲加載(*)

​ 好處:在一次性把常用級聯資料通過SQL直接查詢出來,而對那些不常用的級聯資料不要取出,而是等待需要時才取出,這時不常用的級聯資料可以采用延遲加載的功能

​ 在Mybatis的setting配置中可以配置級聯:

配置項 作用 配置選項說明 預設值
lazyLoadingEnabled 延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設定

fetchType

屬性來覆寫該項的開關狀态。
true|false false
aggressiveLazyLoading 開啟時,任一方法的調用都會加載該對象的所有延遲加載屬性。 否則,每個延遲加載屬性會按需加載(參考

lazyLoadTriggerMethods

)。
true|false false(在 3.4.1 及之前的版本中預設為 true)

aggressiveLazyLoading:配置項是一個層級開關,當為true時它是開啟了層級開關的延遲加載。

另外使用fetchType屬性:可以處理全局定義無法處理的問題,進行自定義(注意:discriminator沒有這個屬性可配置)

這個屬性有兩個值:

  1. eager:擷取目前POJO後立刻加載對應的資料
  2. lazy:擷取目前POJO後延遲加載對應的資料

另一種級聯

  1. 每一個級聯元素中屬性id的配置和POJO實體配置的id要對應,形成級聯。
  2. 在級聯元素中,association是通過javaType的定義去聲明實體映射的,而collection則是使用ofType進行聲明的
  3. discriminator元素定義使用何種具體的resultMap進行級聯

多對多級聯

​ 現實中多對多級聯相當複雜,更多是分拆成兩個一對多的關系。

繼續閱讀