程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> Mybatis延遲加載

Mybatis延遲加載

編輯:DB2教程

Mybatis延遲加載


現在有這麼一個需求,要查詢所有的訂單,並且獲得該訂單的詳細信息。

如果一次性把所有需要的數據都請求到,那麼對服務器和數據庫的開銷會很大,所以可以先加載訂單信息,需要用到訂單詳情的時候再請求詳情數據。

那麼就要用到mybatis的延遲加載

開啟延遲加載
在mybaits配置文件中添加設置
<!--延遲加載-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
配置resultMap
原本的方式是在sql中連接兩張表,然後在resultMap中用collection標簽添加級聯屬性。現在可以把sql分成兩部分,第一部分只查詢訂單表,第二部分通過訂單id查詢訂單詳情。
<select id="findOrderUser" resultMap="orderUserResultMap">
   SELECT * FROM orders
</select>
<select id="findDetailByOrdreId" resultType="cn.elinzhou.mybatisTest.pojo.OrderDetailCustom">
    SELECT * FROM orderdetail WHERE orders_id = #{_parameter}
</select>

然後配置orderUserResultMap,傳統的方式在orderUserResultMap的collection配置級聯屬性,例如

<!--訂單詳情list-->
<collection property="orderDetails" ofType="cn.elinzhou.mybatisTest.pojo.OrderDetailCustom">
    <id column="orderdetail_id" property="id"/>
    <result column="orderdetail_orders_id" property="orders_id"/>
    <result column="orderdetail_items_id" property="items_id"/>
    <result column="orderdetail_items_num" property="items_num"/>
</collection>

如果這樣的所有的數據將一次性查詢,所以這裡可以通過調用之前定義過的findDetailByOrdreId並通過延遲加載訂單詳情數據。

把上述的collection代碼改為

<collection property="orderDetails" 
            column="id" 
            ofType="cn.elinzhou.mybatisTest.pojo.OrderDetailCustom"
            select="cn.elinzhou.mybatisTest.mapper.OrderDetailMapper.findDetailByOrdreId">

</collection>

這樣就實現了延遲加載,下面對代碼進行測試。

@Test
public void testFindOrders() throws Exception {
    OrdersMapper orderMapper = sqlSession.getMapper(OrdersMapper.class);
    List<OrdersCustrom> list = orderMapper.findOrderUser();
    /************觀察代碼執行到此處時控制台日志輸出******************/
    System.out.println(list);
    /************觀察代碼執行到此處時控制台日志輸出******************/
}

在上述代碼的第一個注釋前打一個斷點,然後逐行運行代碼觀察日志

debug運行,在第一個斷點停下,然後單步運行過List list = orderMapper.findOrderUser();這一句,可以看到控制台輸出類似截圖內容
這裡寫圖片描述
說明此時只是查了Z喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcmRlcnOx7aOssqLDu9PQuPm+3WlksulvcmRlcmRldGFpbDxiciAvPg0KyLu687zM0PjWtNDQz8LSu77ko6y/ydLUv7S1vb/Y1sbMqMrks/bA4MvGyOfNvDxiciAvPg0KPGltZyBhbHQ9"這裡寫圖片描述" src="http://www.bkjia.com/uploads/allimg/150703/0416222W0-1.png" title="\" />

剛剛執行的代碼只是為了打印出list中的內容,就對數據庫進行檢索,說明這是通過延遲加載實現。在真正需要用到orderdetail時才會去查orderdetail表,實現了按需分配。直到需要的時候才執行必要的代碼,提高了服務器和數據庫的效率。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved