首頁  >  文章  >  Java  >  介紹mybatis延遲載入的解決方案

介紹mybatis延遲載入的解決方案

Y2J
Y2J原創
2017-05-13 10:36:031478瀏覽

本篇文章主要介紹了mybatis教程之延遲載入詳解。詳細介紹了延遲載入的意義和用法實現,有興趣的可以了解一下

延遲載入

1 使用延遲載入意義

在進行資料查詢時,為了提高資料庫查詢效能,盡量使用單表查詢,因為單表查詢比多表關聯查詢速度快。

如果查詢單表就可以滿足需求,一開始先查詢單表,當需要關聯資訊時,再關聯查詢,當需要關聯資訊再查詢這個叫延遲載入。 

mybatis中resultMap提供延遲載入功能,透過resultMap設定延遲載入。

2 設定mybatis支援延遲載入

在SqlMapConfig.xml中設定全域參數:


<!-- 全局配置参数 --> 
 
<settings> 
 
<!-- 延迟加载总开关 --> 
 
<setting name="lazyLoadingEnabled" value="true" /> 
 
<!-- 设置按需加载 --> 
 
<setting name="aggressiveLazyLoading" value="false" /> 
 
</settings>

3 延遲載入實作

3.1 實作想法

需求:

查詢訂單及使用者的信息,一對一查詢。

剛開始只查詢訂單資訊

當需要使用者時呼叫 Orders類別中的getUser()方法執行延遲載入 ,向資料庫發出sql。

3.2 mapper.xml


#
<!-- 一对一查询延迟加载 
   开始只查询订单,对用户信息进行延迟加载  
   --> 
   <select id="findOrderUserListLazyLoading" resultMap="orderCustomLazyLoading"> 
     SELECT  
     orders.* 
    FROM 
     orders 
   </select>

3.3 resultMap 


#
<!-- 一对一查询延迟加载 的配置 --> 
  <resultMap type="orders" id="orderCustomLazyLoading"> 
    <!-- 完成了订单信息的映射配置 --> 
    <!-- id:订单关联用户查询的唯 一 标识 --> 
    <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:延迟加载执行的sql所在的statement的id,如果不在同一个namespace需要加namespace  
      sql:根据用户id查询用户信息 column:关联查询的列 property:将关联查询的用户信息设置到Orders的哪个属性 --> 
    <association property="user" 
      select="com.sihai.mybatis.mapper.UserMapper.findUserById" column="user_id"></association> 
 
 
  </resultMap>

 3.4 mapper.java


//一对一查询,延迟加载 
  public List<Orders> findOrderUserListLazyLoading() throws Exception;

3.5 測試程式碼


// 一对一查询延迟加载 
  @Test 
  public void testFindOrderUserListLazyLoading() throws Exception { 
 
    SqlSession sqlSession = sqlSessionFactory.openSession(); 
    // 创建mapper代理对象 
    OrdersMapperCustom ordersMapperCustom = sqlSession 
        .getMapper(OrdersMapperCustom.class); 
 
    // 调用方法 
    List<Orders> list = ordersMapperCustom.findOrderUserListLazyLoading(); 
     
    //这里执行延迟加载,要发出sql 
    User user = list.get(0).getUser(); 
    System.out.println(user); 
     
  }

4 resultType、resultMap、延遲載入使用場景總結

4.1 延遲載入:

延遲加載實現的方法多種多樣,在只查詢單表就可以滿足需求,為了提高資料庫查詢效能使用延遲加載,再查詢關聯資訊。
mybatis提供延遲載入的功能用於service層。

4.2 resultType:

#作用:將查詢結果依照sql列名pojo屬性名一致性對應到pojo。

場合:常見一些明細記錄的展示,將關聯查詢資訊全部展示在頁面時,此時可直接使用resultType將每一筆記錄對應到pojo中,在前端頁面遍歷list(list中是pojo)即可。

4.3 resultMap:

#使用association和collection完成一對一和一對多進階對應。

4.4 association:

#作用:將關聯查詢資訊對應到一個pojo類別。

場合:為了方便取得關聯資訊可以使用association將關聯訂單對應為pojo,例如:查詢訂單及關聯使用者資訊。

4.5 collection:

作用:將關聯查詢資訊對應到一個list集合中。

場合:為了方便取得關聯資訊可以使用collection將關聯資訊對應到list集合中,例如:查詢使用者權限範圍模組和功能,可使用collection將模組和功能清單對應到list中。

【相關推薦】

1. 特別推薦「php程式設計師工具箱」V0.1版本下載

2. Java免費影片教學

3. 全面解析Java註解

以上是介紹mybatis延遲載入的解決方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn