1. 程式人生 > >Mybatis 延遲載入 菜鳥日記-day06

Mybatis 延遲載入 菜鳥日記-day06

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物件
}