mybatis實現延遲加載攻略

mybatis延遲加載的實現

1.關於延遲加載

(1)延遲加載也叫懶加載,根據需求加載數據,先加載主要顯示的數據,如果需要關聯的數據顯示,再加載關聯的數據顯示

2.爲什麼使用延遲加載

(1)假設場景:用戶表和訂單表,用戶表有多個用戶,每個用戶有多個訂單, 某些時候,我們需要同時查看用戶信息和用戶的訂單信息,這個時候用戶的信息和訂單的信息都需要顯示。但如果我們只查看訂單列表,就沒必要把用戶信息和用戶的訂單的數據全部查詢出來,只顯示訂單信息就夠了。如果想看訂單詳情,這時候需要顯示訂單的用戶信息,再來加載訂單的用戶數據。那這個時候很明顯 就需要用到延遲加載 (2)好處就是:避免資源浪費,提升查詢速度 ​

3.如何實現

(1)在sqlMapConfig配置文件中加入以下節點:

  <settings>

<setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> </settings>

lazyLoadingEnabled 這個是開啓懶加載的全局配置 aggressiveLazyLoading 這個屬性必須改爲false 否則不生效

(2) 1) 將原始的關聯查詢代碼改爲單表查詢 原始sql語句

  <select id="findUserAndOrderResultMap" resultMap="orderUserMap">
               SELECT orders.id,
                    orders.number,
                    orders.createtime,
                    user.id userId,
                    user.username,
                    user.birthday,
                    user.sex,
                    user.address
                    FROM orders,USER WHERE orders.user_id  = user.id
  </select> 

更改後sql語句

  <select id="findUserAndOrderResultMap" resultMap="orderUserMap">
               SELECT *
                    FROM orders
  </select> 

2) 更改關聯查詢的resultMap內的映射association節點加入懶加載需要的查詢條件 和sql語句statementId 原始resultMap映射

  <resultMap type="orders" id="orderUserMap">
              <id column="id" property="id"/>
              <result column="number" property="number"/>
              <result column="createtime" property="createtime"/>
              <!-- association節點標明唯一關係映射 -->
              <association property="user" javaType="user">
                   <id column="userId" property="id"/>
                     <result column="username" property="username"/>
                     <result column="birthday" property="birthday"/>
                     <result column="sex" property="sex"/>
                     <result column="address" property="address"/>
              </association>
   </resultMap> 

更改後的resultMap映射

   <resultMap type="orders" id="orderUserMap">
              <id column="id" property="id"/>
              <result column="number" property="number"/>
              <result column="createtime" property="createtime"/>
              <!-- association節點標明唯一關係映射 -->
              <association property="user" javaType="user"  column="user_id" select="findUserById">  
             </association>
   </resultMap> 

3) 添加根據id查詢用戶的sql語句statement

   <select id="findUserById" parameterType="int" resultType="user">
            select * from user where id = #{id}
   </select>

 

##4.效果演示 查詢訂單信息輸出

      List<Orders> list =     userMapper.findOrderAndUser();
      for(Orders orders:list){
          System.out.println(orders.getNumber());
      }

運行測試方法控制檯只會輸出一條sql語句查詢所有訂單 00:02:27,127 DEBUG findOrderAndUser:139 - > Preparing: SELECT * FROM orders 00:02:27,166 DEBUG findOrderAndUser:139 - ==> Parameters: 00:02:27,280 DEBUG findOrderAndUser:139 - < Total: 3 如果在訂單內部獲取用戶,纔會又輸出一條根據訂單的用戶id查詢用戶的sql語句

    List<Orders> list =   userMapper.findOrderAndUser();
      for(Orders orders:list){
          System.out.println(orders.getNumber());
          System.out.println(orders.getUser());
      }  

00:09:22,927 DEBUG findOrderAndUser:139 - > Preparing: SELECT * FROM orders 00:09:22,964 DEBUG findOrderAndUser:139 - ==> Parameters: 00:09:23,078 DEBUG findOrderAndUser:139 - < Total: 3 1000010 00:09:23,079 DEBUG findUserById:139 - > Preparing: select * from user where id = ? 00:09:23,079 DEBUG findUserById:139 - ==> Parameters: 1(Integer) 00:09:23,081 DEBUG findUserById:139 - < Total: 1 User [id=1, username=王五, sex=男, birthday=null, address=null]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章