1. 程式人生 > >Spring+SpringMVC+MyBatis深入學習及搭建(七)——MyBatis延遲載入

Spring+SpringMVC+MyBatis深入學習及搭建(七)——MyBatis延遲載入

1.什麼是延遲載入

resultMap可以實現高階對映(使用association、collection實現一對一及一對多對映),association、collection具備延遲載入功能。

需求:

如果查詢訂單並且關聯查詢使用者資訊。如果先查詢訂單資訊即可滿足要求,當我們需要查詢使用者資訊時再查下使用者資訊。把對使用者資訊的按需去查詢就是延遲載入。

延遲載入:先從單表查詢、需要時再從關聯表去關聯查詢,大大提高資料庫效能,因為查詢單表要比關聯查詢多張錶速度要快。

2.使用association實現延遲載入

2.1需求

查詢訂單並且關聯查詢使用者資訊

2.2mapper.xml

需要定義兩個mapper的方法對應的statement。

(1)只查詢訂單資訊

SELECT * FROM orders

在查詢訂單的statement中使用association去延遲載入(執行)下邊的statement(關聯查詢使用者資訊)。

    <!-- 查詢訂單關聯查詢使用者  -->
    <select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">
        SELECT * FROM orders
    </select>

(2)關聯查詢使用者資訊

通過上邊查詢到的訂單資訊中user_id去關聯查詢使用者資訊

使用UserMapper.xml中的findUserById

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

上邊先去執行findOrdersUserLazyLoading,當需要去查詢使用者的時候再去執行fingUserById,通過resultMap的定義將延遲載入執行配置起來。

2.3 延遲載入resultMap

使用association中的select指定延遲載入去執行的statement的id。

    <!-- 延遲載入的resultMap  -->
    <resultMap type="joanna.yan.mybatis.entity.Orders" id="OrdersUserLazyLoadingResultMap">
        <!-- 1.對訂單資訊進行對映配置 -->
        <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"/>
        <!-- 2.實現對使用者資訊進行延遲載入 -->
        <!-- select:指定延遲載入需要執行的statement的id(是根據user_id查詢使用者資訊的statement) 
               要使用UserMapper.xml中findUserById完成根據使用者id(user_id)使用者資訊的查詢,
               如果findUserById不在本mapper中需要前邊加namespace。
             column:訂單資訊中關聯使用者資訊查詢的列,是user_id
              關聯查詢的sql理解為:
             SELECT orders.*,
                (SELECT username FROM USER WHERE orders.user_id = user.id)username,
                (SELECT sex FROM USER WHERE orders.user_id = user.id)sex
             FROM orders
        -->
        <association property="user" javaType="joanna.yan.mybatis.entity.User"
            select="joanna.yan.mybatis.mapper.UserMapper.findUserById" column="user_id">
        </association>
    </resultMap>

2.4mapper.java

    //查詢訂單關聯查詢使用者,使用者資訊時延遲載入
    public List<Orders> findOrdersUserLazyLoading() throws Exception;

2.5測試

2.5.1測試思路

(1)執行上邊mapper方法(findOrdersUserLazyLoading),內部去呼叫joanna.yan.mybatis.mapper.OrdersCustomMapper中findOrdersUserLazyLoading只查詢orders資訊(單表)。

(2)在程式中去遍歷上一步驟查詢出的List<Orders>,當我們呼叫Orders中的getUser()時,開始進行延遲載入。

(3)延遲載入,去呼叫UserMapper.xml中findUserById這個方法獲取使用者資訊。

2.5.2延遲載入配置

mybatis預設沒有開啟延遲載入,需要在SqlMapConfig.xml中setting配置。

在mybatis核心配置檔案中配置:

lazyLoadingEnabled、aggressiveLazyLoading

設定項

描述

允許值

預設值

lazyLoadingEnabled

全域性性設定懶載入。如果設為‘false’,則所有相關聯的都會被初始化載入。

true | false

false

aggressiveLazyLoading

當設定為‘true’的時候,懶載入的物件可能被任何懶屬性全部載入。否則,每個屬性都按需載入。

true | false

true

在SqlMapConfig.xml中配置:

     <!-- 全域性配置引數,需要時再設定  -->
     <settings>
         <!-- 開啟延遲載入的開關  -->
         <setting name="lazyLoadingEnabled" value="true"/>
         <!-- 將積極載入改為消極載入即按需要載入 -->
         <setting name="aggressiveLazyLoading" value="false"/>
     </settings>

2.5.3測試程式碼

    @Test
    public void findOrdersUserLazyLoadingTest() throws Exception{
        SqlSession sqlSession=sqlSessionFactory.openSession();
        OrdersCustomMapper ordersCustomMapper=sqlSession.getMapper(OrdersCustomMapper.class);
        List<Orders> list=ordersCustomMapper.findOrdersUserLazyLoading();
        for (Orders orders : list) {
            //執行getUser()去查詢使用者資訊,這裡實現按需載入
            User user=orders.getUser();
            System.out.println(user);
        }
        sqlSession.close();
    }

2.6延遲載入思考

不使用mybatis提供的association及collection中的延遲載入功能,如何實現延遲載入?

實現方法如下:

定義兩個mapper方法:

(1)查詢訂單列表

(2)根據使用者id查詢使用者資訊

    實現思路:先去查詢第一個mapper方法,獲取訂單資訊列表

       在測試程式中,按需去呼叫第二個mapper方法去查詢使用者資訊。

總之,使用延遲載入方法,先去查詢簡單的sql(最好單表,也可以關聯查詢),再去按需要載入關聯查詢的其它資訊。

如果此文對您有幫助,微信打賞我一下吧~

相關推薦

Spring+SpringMVC+MyBatis深入學習搭建()——MyBatis延遲載入

1.什麼是延遲載入 resultMap可以實現高階對映(使用association、collection實現一對一及一對多對映),association、collection具備延遲載入功能。 需求: 如果查詢訂單並且關聯查詢使用者資訊。如果先查詢訂單資訊即可滿足要求,當我們需要查詢使用者資訊時再查下使用

Spring+SpringMVC+MyBatis深入學習搭建(三)——MyBatis全局配置文件解析

保持 nbsp 延遲加載 行為 span 方便 doc ima actor 轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/6874672.html 前面有寫到Spring+SpringMVC+MyBatis深入學習及搭建(二)&

Spring+SpringMVC+MyBatis深入學習搭建(四)——MyBatis輸入映射與輸出映射

指定 2.6 face 生成 shm hashmap ace and 包裝 轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/6878529.html 前面有講到Spring+SpringMVC+MyBatis深入學習及搭建(三)&

Spring+SpringMVC+MyBatis深入學習搭建(八)——MyBatis查詢緩存

idt rtu void spring 寫到 查詢緩存 修改 針對 target 轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/6956206.html 前面講到:Spring+SpringMVC+MyBatis深入學習及搭建(

Spring+SpringMVC+MyBatis深入學習搭建(十)——MyBatis逆向工程

cat springmvc blank 不為 tex llc root from ssi 轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/6973266.html 前面講到:Spring+SpringMVC+MyBatis深入學習及

Spring+SpringMVC+MyBatis深入學習搭建(二)——MyBatis原始Dao開發和mapper代理開發

oid 方法註入 內部 需要 com 配置文件信息 lec lang auth 前面有寫到Spring+SpringMVC+MyBatis深入學習及搭建(一)——MyBatis的基礎知識。MybatisFirst中存在大量重復的代碼。這次簡化下代碼: 使用MyBatis開發

Spring+SpringMVC+MyBatis深入學習搭建(四)——MyBatis輸入映射與輸出映射(轉發同上)

resultmap 根據 except 就會 ash 用戶名 mvc html like 原地址:http://www.cnblogs.com/shanheyongmu/p/7121556.html 1. 輸入映射 通過parameterType指定輸入參數的類型,類型可

Spring+SpringMVC+MyBatis深入學習搭建(九)——MyBatisSpring整合

1.整合思路需要Spring通過單例方式管理SqlSessionFactory。Spring和MyBatis整合生成代理物件,使用SqlSessionFactory建立SqlSession。(Spring和MyBatis整合自動完成)持久層的mapper都需要由Spring進

Spring+SpringMVC+MyBatis深入學習搭建(八)——MyBatis查詢快取

1.什麼是查詢快取 mybatis提供查詢快取,用於減輕資料庫壓力,提高資料庫效能。 mybatis提供一級快取和二級快取。 一級快取是SqlSession級別的快取。在操作資料庫時需要構造sqlSession物件,在物件中有一個數據結構(HashMap)用於儲存快取資料。不同的sqlSession之間

Spring+SpringMVC+MyBatis深入學習搭建(六)——MyBatis關聯查詢

1.商品訂單資料模型 1.1資料模型分析思路 (1)每張表記錄的資料內容   分模組對每張表記錄的內容進行熟悉,相當於你學習系統需求(功能)的過程。 (2)每張表重要的欄位設定   非空欄位、外來鍵欄位 (3)資料庫級別表與表之間的關係   外來鍵關係 (4)表與表之間的業務關係   在分析表與表之間的

Spring+SpringMVC+MyBatis深入學習搭建(四)——MyBatis輸入對映與輸出對映

1. 輸入對映 通過parameterType指定輸入引數的型別,型別可以是簡單型別、hashmap、pojo的包裝型別。 1.1 #{}與${} #{}實現的是向prepareStatement中的預處理語句設定引數值,sql語句中#{}表示一個佔位符即? <select id="findUse

Spring+SpringMVC+MyBatis深入學習搭建(三)——MyBatis全域性配置檔案解析

MyBatis的全域性配置檔案SqlMapConfig.xml,配置內容和順序如下: properties(屬性) setting(全域性配置引數) typeAliases(類名別名) typeHandlers(類名處理器) objectFactory(物件工廠) plugins(外掛) environm

Spring+SpringMVC+MyBatis深入學習搭建(十一)——SpringMVC架構

框架 ppi spring框架 edit 不同的 com get request html 轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/6985816.html 前面講到:Spring+SpringMVC+MyBatis深入學習

Spring+SpringMVC+MyBatis深入學習搭建(十四)——SpringMVCMyBatis整合

文件拷貝 conf lips glib ide doc from ive body 轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/7010363.html 前面講到:Spring+SpringMVC+MyBatis深入學習及搭建(

Spring+SpringMVC+MyBatis深入學習搭建(五)——動態sql

mybatis核心:對sql語句進行靈活操作,通過表示式進行判斷,對sql進行靈活拼接、組裝。 mybatis提供各種標籤方法實現動態拼接sql。 1. if&where 1.2 需求 使用者資訊綜合查詢列表和使用者資訊查詢列表總數這兩個statement的定義使用動態sql。 對查詢條件進行判斷

Spring+SpringMVC+MyBatis深入學習搭建】17.SpringMVC攔截器

1.攔截器定義 Spring Web MVC的處理器攔截器類似於Servlet開發中的過濾器Filter,用於對處理器進行預處理和後處理。 定義攔截器,實現HandlerInterceptor介面。介面中提供三個方法。 package joanna.yan.ssm.interceptor; imp

spring深入學習(十) IOC 之分析各 scope 的 bean 建立

在 Spring 中存在著不同的 scope,預設是 singleton ,還有 prototype、request 等等其他的 scope,他們的初始化步驟是怎樣的呢?這個答案在這篇部落格中給出。 singleton Spring 的 scope 預設為 singleton,其初始化的程式

多執行緒深入學習面試解決思路

課程目標 執行緒與程序區別 為什麼要使用多執行緒? 多執行緒應用場景? 多執行緒建立方式 獲取執行緒物件以及名稱 守護執行緒 多執行緒執行狀態 join()方法作用 多執行緒分批處理資料 作業題 面試題 備註單詞 執行緒與程序區別

Dubbo服務治理框架深入學習面試題

  Dubbo概述 Dubbo的背景 隨著網際網路的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。  單一應用架構 當網站流量很小時,只需

Mybatis總結(2)-Mybatis的原理搭建

在Mybatis搭建前,應該先了解其執行基本原理 1. 讀取Mybatis的配置檔案-Mybatis-config.xml 2. 由配置檔案的mapper來載入對映檔案mapper.xml 3. 構造一個SqlSessionFactory工廠 4. 用工廠來例項化一個SqlSess