mybatis學習筆記 13 延遲載入

2021-08-14 10:05:15 字數 4500 閱讀 4050

resultmap可以實現高階對映(使用associationcollection實現一對一及一對多對映),associationcollection具備延遲載入功能。

延遲載入:先從單錶查詢、需要時再從關聯表去關聯查詢,大大提高資料庫效能,因為查詢單錶要比關聯查詢多張表速度要快。

需求:如果查詢訂單並且關聯查詢使用者資訊。如果先查詢訂單資訊即可滿足要求,當我們需要查詢使用者資訊時再查詢使用者資訊。把對使用者資訊的按需去查詢就是延遲載入。

1.只查詢訂單資訊

select * from orders

在查詢訂單的statement中使用association去延遲載入(執行)下邊的satatement(關聯查詢使用者資訊)

select * from orders

2.關聯查詢使用者資訊

select * from  user  where id=#

上邊先去執行findordersuserlazyloading,當需要去查詢使用者的時候再去執行finduserbyid,通過resultmap的定義將延遲載入執行配置起來。

與非延遲載入的主要區別就在association標籤屬性多了selectcolumn

//查詢訂單關聯查詢使用者,使用者資訊是延遲載入

public listfindordersuserlazyloading()throws exception;

延遲載入配置

mybatis預設沒有開啟延遲載入,需要在sqlmapconfig.xml中setting配置。

在mybatis核心配置檔案中配置:lazyloadingenabled、aggressivelazyloading

設定項描述

允許值預設值

lazyloadingenabled

全域性性設定懶載入。如果設為『false』,則所有相關聯的都會被初始化載入

true/false

false

aggressivelazyloading

當設定為『true』的時候,懶載入的物件可能被任何懶屬性全部載入。否則,每個屬性都按需載入。

true/false

true

在sqlmapconfig.xml中配置:

// 查詢訂單關聯查詢使用者,使用者資訊使用延遲載入

@test

public void testfindordersuserlazyloading() throws exception

}

不使用mybatis提供的association及collection中的延遲載入功能,如何實現延遲載入??

實現方法如下:

實現思路:

總之,使用延遲載入方法,先去查詢簡單的sql(最好單錶,也可以關聯查詢),再去按需要載入關聯查詢的其它資訊。

使用的是intellij idea 15.0.2

先說一下結果吧,idea在debug和run條件下,列印結果不同

我為了驗證延遲載入前的user是否為空,在orders類中加入了

public void print()

測試**如下

// 查詢訂單關聯查詢使用者,使用者資訊使用延遲載入

@test

public void testfindordersuserlazyloading() throws exception

}

然後分別run和debug

debug [main] - opening jdbc connection

debug [main] - created connection 110771485.

debug [main] - setting autocommit to false on jdbc connection [com.mysql.jdbc.jdbc4connection@69a3d1d]

debug [main] - ==> preparing: select * from orders

debug [main] - ==> parameters:

debug [main] - <== total: 3

----test-print-----null user==null: true

----test-print-----null user==null: true

----test-print-----null user==null: true

debug [main] - opening jdbc connection

debug [main] - created connection 1219273867.

debug [main] - setting autocommit to false on jdbc connection [com.mysql.jdbc.jdbc4connection@48aca48b]

debug [main] - ==> preparing: select * from orders

debug [main] - ==> parameters:

debug [main] - <== total: 3

但是當你點開list屬性時,控制台又輸出了,而且可以看到list裡的user是有內容的

debug [main] - ==>  preparing: select * from user where id=? 

debug [main] - ==> parameters: 1(integer)

debug [main] - <== total: 1

debug [main] - ==> preparing: select * from user where id=?

debug [main] - ==> parameters: 10(integer)

debug [main] - <== total: 1

執行完所有程式,控制台輸出為:

debug [main] - opening jdbc connection

debug [main] - created connection 1219273867.

debug [main] - setting autocommit to false on jdbc connection [com.mysql.jdbc.jdbc4connection@48aca48b]

debug [main] - ==> preparing: select * from orders

debug [main] - ==> parameters:

debug [main] - <== total: 3

debug [main] - ==> preparing: select * from user where id=?

debug [main] - ==> parameters: 1(integer)

debug [main] - <== total: 1

debug [main] - ==> preparing: select * from user where id=?

debug [main] - ==> parameters: 10(integer)

debug [main] - <== total: 1

----test-print-----user [id=1, username=王五, ***=2, birthday=null, address=null] user==null: false

----test-print-----user [id=1, username=王五, ***=2, birthday=null, address=null] user==null: false

----test-print-----user [id=10, username=張三, ***=1, birthday=thu jul 10 00:00:00 cst 2014, address=北京市] user==null: false

所以,我覺得應該是在debug時,檢視屬性的話,idea會自動呼叫get相應的方法,從而觸發user的查詢。延遲載入的原始碼實現以後我會閱讀,把這個問題弄清楚。

Mybatis學習系列 延遲載入

舉個例子 如果查詢訂單並且關聯查詢使用者資訊。如果先查詢訂單資訊即可滿足要求,當我們需要查詢使用者資訊時再查詢使用者資訊。把對使用者資訊的按需去查詢就是延遲載入。所以延遲載入即先從單錶查詢 需要時再從關聯表去關聯查詢,大大提高資料庫效能,因為查詢單錶要比關聯查詢多張表速度要快。我們來對比一下 關聯查...

Mybatis延遲載入

現在有這麼乙個需求,要查詢所有的訂單,並且獲得該訂單的詳細資訊。如果一次性把所有需要的資料都請求到,那麼對伺服器和資料庫的開銷會很大,所以可以先載入訂單資訊,需要用到訂單詳情的時候再請求詳情資料。那麼就要用到mybatis的延遲載入 name lazyloadingenabled value tru...

mybatis延遲載入

舉個例子 如果查詢訂單並且關聯查詢使用者資訊。如果先查詢訂單資訊即可滿足要求,當我們需要查詢使用者資訊時再查詢使用者資訊。把對使用者資訊的按需去查詢就是延遲載入。所以延遲載入即先從單錶查詢 需要時再從關聯表去關聯查詢,大大提高資料庫效能,因為查詢單錶要比關聯查詢多張表速度要快。我們來對比一下 關聯查...