1. 程式人生 > >MyBatis 延遲加載的三種加載方式深入,你get了嗎?

MyBatis 延遲加載的三種加載方式深入,你get了嗎?

ble 必須 關聯 數據 之前 默認值 種類型 加載 節點

延遲加載

  延遲加載對主對象都是直接加載,只有對關聯對象是延遲加載。

  延遲加載可以減輕數據庫的壓力,

  延遲加載不可是一條SQL查詢多表信息,這樣構不成延遲加載,會形成直接加載。

  延遲加載分為三種類型:

1.直接加載

執行完主對象之後,直接執行關聯對象。

2.侵入式加載

在執行主對象詳情的時候,執行關聯對象。

3.深度延遲加載

執行完主對象或主對象詳情不會執行關聯對象,只有用到關聯對象數據的時候才走深度延遲加載。

  延遲加載默認情況下是關閉狀態(false) 延遲加載下的侵入式加載默認情況下是開啟狀態(true)  在這種情況下延遲加載不生效, 比如說延遲加載是一個大的水龍頭總閘,如果總閘沒開,那麽總閘裏面的小的閘肯定沒有水。如果想要使用延遲加載必須寫成true

  現在知道延遲加載的狀態,那他是在哪裏設置開啟關閉狀態的呢? 答案是在大配置文件中設置延遲加載的狀態

看一下幾個例子

1.默認情況的延遲加載  (這是在MyBatis3.4.1版本之前的默認情況) :(aggressiveLazyLoading)侵入式延遲加載為true, 在3.4.1之後的版本(aggressiveLazyLoading)侵入式延遲加載默認值為false

技術分享圖片

  2.侵入式延遲加載

技術分享圖片

技術分享圖片

現在看一下訪問主屬性的侵入式延遲加載的狀態如何

技術分享圖片

  3.深度延遲加載

深度延遲加載 大配置中的設置

技術分享圖片

只訪問主對象的屬性,深度延遲加載的狀態為:

技術分享圖片

現在我們看一下訪問關聯對象的屬性,深度延遲加載的狀態為:

技術分享圖片

在大配置文件設置延遲加載是使用的是setting節點,與其他節點位置順序不要亂。

大配置中的延遲加載代碼:

<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/> <!--現在的狀態為深度延遲加載-->
</settings>
<settings>
<setting name="lazyLoadingEnabled" value="true"/>

<setting name="aggressiveLazyLoading" value="true"/> <!--現在的狀態為侵入式延遲加載-->
</settings>

<settings>
<setting name="lazyLoadingEnabled" value="false"/>
<setting name="aggressiveLazyLoading" value="false"/> <!--現在的狀態為直接加載-->(3.4.1版本之後的直接加載設置)
</settings>

<settings>
<setting name="lazyLoadingEnabled" value="false"/>
<setting name="aggressiveLazyLoading" value="true"/> <!--現在的狀態為直接加載-->(3.4.1版本之前的直接加載設置)
</settings>
 

MyBatis 延遲加載的三種加載方式深入,你get了嗎?