Mybatis 延遲加載


1、什么是延遲加載

  1. 延遲加載的條件:resultMap可以實現高級映射(使用association、collection實現一對一及一對多映射),association、collection具備延遲加載功能。
  2. 延遲加載的好處:
    先從單表查詢、需要時再從關聯表去關聯查詢,大大提高 數據庫性能,因為查詢單表要比關聯查詢多張表速度要快。
  3. 延遲加載的實例:
    如果查詢訂單並且關聯查詢用戶信息。如果先查詢訂單信息即可滿足要求,當我們需要查詢用戶信息時再查詢用戶信息。把對用戶信息的按需去查詢就是延遲加載。

    2、如何開啟延遲加載功能

  4. Mybatis的延遲加載功能默認是關閉的
  5. 需要在SqlMapConfig.xml文件中通過setting標簽配置來開啟延遲加載功能
  6. 開啟延遲加載的屬性:
    lazyLoadingEnabled:全局性設置懶加載。如果設為‘false’,則所有相關聯的都會被初始化加載。默認為false
    aggressiveLazyLoading:當設置為‘true’的時候,懶加載的對象可能被任何懶屬性全部加載。否則,每個屬性都按需加載。默認為true
  7. 配置

     <settings> <!--開啟延遲加載--> <setting name="lazyLoadingEnabled" value="true"/> <!--關閉積極加載--> <setting name="aggressiveLazyLoading" value="false"/> </settings>

    3、延遲加載的resultMap

  8. 在resultMap中使用association或者collection,即可使用延遲加載。
  9. 延遲加載需要兩個statement語句來完成
  10. 在resultMap中使用association或者collection來配置兩個statement直接的管理
  11. resultMap代碼 :

     <!--查詢訂單和創建訂單的用戶,使用延遲加載--> <resultMap id="OrderAndUserLazyLoad" type="Orders"> <id column="id" property="id"/> <result column="user_id" property="userId" /> <result column="number" property="number" /> <result column="createtime" property="createtime" /> <result column="note" property="note" /> <!-- select:要延遲加載的statement的id colunm:關聯兩張表的那個列的列名 --> <association property="user" javaType="User" select="findUser" column="user_id"> </association> </resultMap>

    4、延遲加載的mapper文件

  12. 必須要有兩個statement
  13. 兩個statement直接必須存在關聯的數據列

     <select id="findOrdersByLazyLoad" resultMap="OrderAndUserLazyLoad"> SELECT * FROM orders </select> <select id="findUser" parameterType="int" resultType="User"> SELECT * FROM User WHERE id = #{value} </select>

    5、mapper接口

    public List findOrdersByLazyLoad() throws Exception;

    6、測試代碼

    public void testFindOrdersByLazyLoad() throws Exception{
    SqlSession session = sessionFactory.openSession();
    Mapper mapper = session.getMapper(Mapper.class);
    //只會發送查詢訂單信息的SQL
    List orders = mapper.findOrdersByLazyLoad();
    for (Orders order : orders){
    //會發生查詢用戶信息的SQL
    order.getUser();
    }
    }

7、總結

    1. 不使用mybatis提供的association及collection中的延遲加載功能,如何實現延遲加載??
      實現方法如下:
      定義兩個mapper方法:
      1、查詢訂單列表
      2、根據用戶id查詢用戶信息
      實現思路:
      先去查詢第一個mapper方法,獲取訂單信息列表
      在程序中(service),按需去調用第二個mapper方法去查詢用戶信息。

    2. 總之:
      使用延遲加載方法,先去查詢簡單的sql(最好單表,也可以關聯查詢),再去按需要加載關聯查詢的其它信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM