Mybatis消極式載入,mybatis延遲

來源:互聯網
上載者:User

Mybatis消極式載入,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>

這樣就實現了消極式載入,下面對代碼進行測試。

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

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

debug運行,在第一個斷點停下,然後單步運行過List list = orderMapper.findOrderUser();這一句,可以看到控制台輸出類似內容

說明此時只是查了orders表,並沒有根據id查orderdetail
然後繼續執行下一句,可以看到控制台輸出類似

剛剛執行的代碼只是為了列印出list中的內容,就對資料庫進行檢索,說明這是通過消極式載入實現。在真正需要用到orderdetail時才會去查orderdetail表,實現了按需分配。直到需要的時候才執行必要的代碼,提高了伺服器和資料庫的效率。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.