Mybatis 延遲加載


1、什么是延遲加載

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

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

  1. Mybatis的延遲加載功能默認是關閉的

  2. 需要在SqlMapConfig.xml文件中通過setting標簽配置來開啟延遲加載功能

  3. 開啟延遲加載的屬性:
    lazyLoadingEnabled:全局性設置懶加載。如果設為‘false’,則所有相關聯的都會被初始化加載。默認為false
    aggressiveLazyLoading:當設置為‘true’的時候,懶加載的對象可能被任何懶屬性全部加載。否則,每個屬性都按需加載。默認為true

  4. 配置

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

3、延遲加載的resultMap

  1. 在resultMap中使用association或者collection,即可使用延遲加載。

  2. 延遲加載需要兩個statement語句來完成

  3. 在resultMap中使用association或者collection來配置兩個statement直接的管理

  4. 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文件

  1. 必須要有兩個statement

  2. 兩個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<Orders> findOrdersByLazyLoad() throws Exception;

6、測試代碼

  public void testFindOrdersByLazyLoad() throws Exception{
        SqlSession session = sessionFactory.openSession();
        Mapper mapper = session.getMapper(Mapper.class);
		//只會發送查詢訂單信息的SQL
        List<Orders> 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