Mybatis學習系列 延遲載入

2021-07-30 23:51:14 字數 2011 閱讀 6637

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

我們來對比一下:

關聯查詢:select orders.*, user.usernamefrom orders, user where orders.user_id= user.id延遲載入相當於:

select orders.*,

(select username from user where orders.user_id = user.id)username from orders

所以這就比較直觀了,也就是說,我把關聯查詢分兩次來做,而不是一次性查出所有的。第一步只查詢單錶orders,必然會查出orders中的乙個user_id欄位,然後我再根據這個user_id查user表,也是單錶查詢。下面來總結一下如何使用這個延遲載入

只查詢訂單資訊的statement,使用resultmap

通過查詢到的訂單資訊中的user_id去查詢使用者資訊的statement,得到使用者

定義的resultmap將兩者關聯起來,即用訂單資訊user_id去查使用者

下面來實現這個思路:

1. 只查詢訂單資訊的statement:

<

selectid=

"findordersuserlazyloading"

resultmap

="ordersuserlazyloadingresultmap"

>

select * from orders

select

>

2. 只查詢使用者資訊的statement:

<

selectid=

"finduserbyid"

parametertype

="int"

resulttype

="user"

>

select * from user where id = #

select

>

3. 定義上面那個resultmap:

mybatis預設沒有開啟延遲載入,需要在sqlmapconfig.xml中setting配置。前面一篇博文中提到sqlmapconfig.xml中的一些配置,有乙個,當時沒說,這裡就派上用場了,可以通過這個標籤來配置一下延遲載入。

<

settings

>

<

setting

name

="lazyloadingenabled"

value

="true"

/>

<

setting

name

="aggressivelazyloading"

value

="false"

/>

settings

>

public

inte***ce

到此為止,延遲載入就做完了,下面來測試一下:

@test

public

void

testfindordersuserlazyloading

() throws

exception

}

—–樂於分享,共同進步!

—–我的部落格主頁:

Mybatis延遲載入

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

mybatis延遲載入

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

mybatis延遲載入

在mybatis中,通常會進行多表聯合查詢,但是有的時候並不會立即用到所有的聯合查詢結果,此時需要一種機制,當需要的時候再查詢,這種 按需查詢 的機制,就可以使用延遲載入來實現。延遲載入可以做到,先從單錶查詢,需要時再從關聯表關聯查詢,這樣可以大大提高資料庫的效能,因為查詢單錶要比關聯查詢多張表速度...