Mybatis延遲加載

如今有這麼一個需求,要查詢全部的訂單,而且得到該訂單的詳細信息。java

若是一次性把全部須要的數據都請求到,那麼對服務器和數據庫的開銷會很大,因此能夠先加載訂單信息,須要用到訂單詳情的時候再請求詳情數據。sql

那麼就要用到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代碼改成markdown

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

</collection>

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

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

在上述代碼的第一個註釋前打一個斷點,而後逐行運行代碼觀察日誌app

debug運行,在第一個斷點停下,而後單步運行過List list = orderMapper.findOrderUser();這一句,能夠看到控制檯輸出相似截圖內容
這裏寫圖片描述
說明此時只是查了orders表,並無根據id查orderdetail
而後繼續執行下一句,能夠看到控制檯輸出相似如圖
這裏寫圖片描述測試

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

相關文章
相關標籤/搜索