Mybatis 延遲載入 菜鳥日記-day06
阿新 • • 發佈:2018-12-23
Mybatis 延遲載入
一、什麼是延遲載入
以訂單表和使用者表的關聯查詢來說:
需求:查詢訂單資訊,同時關聯查詢到訂單的所屬使用者資訊。
需求變化:查詢訂單資訊,但是進行關聯查詢到的所屬使用者資訊可能用,也可能不用。
存在問題:sql 簡單查詢的速度較快,而複雜一些的關聯查詢比較慢且耗費資源更大。如果需求中用不到使用者資訊那麼關聯查詢結果費力又多餘
那麼怎麼才能實現,對關聯查詢按需進行,而不是每次查詢都獲取關聯查詢得到的使用者資訊?
Mybatis延遲載入技術閃亮登場
二、延遲載入的好處
主要就是上面提到的,查詢單表(簡單表)的資訊,其他關聯資訊用到的時候再去呼叫,提高查詢效率,節省資料庫資源。
三、Mybatis使用延遲載入
1.開啟開關(設定settings)
settings屬性中關於延遲載入的有
<settings>
<!--開啟延遲載入,預設為false-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--關閉積極載入,預設為true-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
延遲載入開關:開啟的話,關聯的物件可以延遲載入
積極載入開關:true 情況,你可以懶,但是你非要勤快,遇到可以延遲載入的都非要去直接載入。false情況,能偷懶就偷懶,你不是非要用到的話 我才不會去給你拿 --這是比較官方的解釋:當設定為true時,懶載入的物件可能被任何懶屬性全部載入;否則,每個屬性按需載入
2.Mapper檔案配置
1)原來的關聯查詢語句寫成單表查詢
select 標籤中的sql 進行單表查詢 select * from 訂單表。
2)ResultMap定義
首先返回值是沒有疑意的也就是
<resultMap type="訂單類全限定名 " id="" >
< id coloum="列名" property="對應類中屬性名">
...
<!--這些是沒有任何變化的-->
出現變化的位置,在association中實現對使用者資訊的延遲載入
<association
propertype="訂單資訊中user屬性"
javaType="使用者類--到這裡都是沒有任何變化的"
select="statementid--這裡指定了通過id查詢使用者的statement方法名"
column="這裡指定用作關聯查詢的條件欄位 也就是user_id" >
<!--通過select column 這兩行指定方法+傳入引數 實現對User的 延遲載入 的關聯查詢-->
</association>
<!--collection 也是一樣的-->
3.測試使用
//sqlSessionFactory 建立sqlSession
// 獲得Mapper 代理
// 查詢所有訂單資訊
for(訂單類 order:訂單查詢結果)
{
//其他省略
//下面呼叫getUser方法
order.getUser();
//當迴圈到 order的user_id 和上一個order user_id 不同時才會向資料庫發出請求,查詢得到User物件
}