resultmap可以實現高階對映(使用association
、collection
實現一對一及一對多對映),association
、collection
具備延遲載入功能。
延遲載入:先從單錶查詢、需要時再從關聯表去關聯查詢,大大提高資料庫效能,因為查詢單錶要比關聯查詢多張表速度要快。
需求:如果查詢訂單並且關聯查詢使用者資訊。如果先查詢訂單資訊即可滿足要求,當我們需要查詢使用者資訊時再查詢使用者資訊。把對使用者資訊的按需去查詢就是延遲載入。
1.只查詢訂單資訊
select * from orders
在查詢訂單的statement中使用association去延遲載入(執行)下邊的satatement(關聯查詢使用者資訊)
select * from orders
2.關聯查詢使用者資訊
select * from user where id=#
上邊先去執行findordersuserlazyloading,當需要去查詢使用者的時候再去執行finduserbyid,通過resultmap的定義將延遲載入執行配置起來。
與非延遲載入的主要區別就在association
標籤屬性多了select
和column
//查詢訂單關聯查詢使用者,使用者資訊是延遲載入
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延遲載入
舉個例子 如果查詢訂單並且關聯查詢使用者資訊。如果先查詢訂單資訊即可滿足要求,當我們需要查詢使用者資訊時再查詢使用者資訊。把對使用者資訊的按需去查詢就是延遲載入。所以延遲載入即先從單錶查詢 需要時再從關聯表去關聯查詢,大大提高資料庫效能,因為查詢單錶要比關聯查詢多張表速度要快。我們來對比一下 關聯查...