1. 程式人生 > >【MyBatis學習11】MyBatis中的延遲載入

【MyBatis學習11】MyBatis中的延遲載入

1. 什麼是延遲載入

  舉個例子:如果查詢訂單並且關聯查詢使用者資訊。如果先查詢訂單資訊即可滿足要求,當我們需要查詢使用者資訊時再查詢使用者資訊。把對使用者資訊的按需去查詢就是延遲載入。 所以延遲載入即先從單表查詢、需要時再從關聯表去關聯查詢,大大提高資料庫效能,因為查詢單表要比關聯查詢多張錶速度要快。
  我們來對比一下:

關聯查詢:SELECT orders.*, user.username FROM orders, USER WHERE orders.user_id = user.id
延遲載入相當於:
SELECT orders.*,
(SELECT username FROM USER WHERE orders.user_id = user.id)username FROM orders

  所以這就比較直觀了,也就是說,我把關聯查詢分兩次來做,而不是一次性查出所有的。第一步只查詢單表orders,必然會查出orders中的一個user_id欄位,然後我再根據這個user_id查user表,也是單表查詢。下面來總結一下如何使用這個延遲載入

2. 使用association實現延遲載入

  前面博文中總結了resultMap可以實現高階對映(使用association、collection實現一對一及一對多對映),其實association和collection還具備延遲載入的功能,這裡我就拿association來說明,collection和association使用的方法都是一樣的。需求就是上面提到的,查詢訂單並且關聯查詢使用者,查詢使用者使用延遲載入。
  由上面的分析可知,延遲載入要查詢兩次,第二次是按需查詢,之前一對一關聯查詢的時候只需要查一次,把訂單和使用者資訊都查出來了,所以只要寫一個mapper即可,但是延遲載入查兩次,所以理所當然要有兩個mapper。

2.1 兩個mapper.xml

  需要定義兩個mapper的方法對應的statement。先來分析一下思路:

  1. 只查詢訂單資訊的statement,使用resultMap
  2. 通過查詢到的訂單資訊中的user_id去查詢使用者資訊的statement,得到使用者
  3. 定義的resultMap將兩者關聯起來,即用訂單資訊user_id去查使用者

  下面來實現這個思路:
1. 只查詢訂單資訊的statement:

<select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap"
>
SELECT * FROM orders </select>

2. 只查詢使用者資訊的statement:

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

3. 定義上面那個resultMap:
resultMap

2.2 延遲載入的配置

  mybatis預設沒有開啟延遲載入,需要在SqlMapConfig.xml中setting配置。前面一篇博文中提到SqlMapConfig.xml中的一些配置,有一個<settings>,當時沒說,這裡就派上用場了,可以通過這個標籤來配置一下延遲載入。

<settings>
    <!-- 開啟延遲載入的開關 -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 將積極載入改為消極載入,即延遲載入 -->
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

2.3 mapper.java

  別忘了寫mapper介面:

public interface UserMapperOrders {

    //省去不相關程式碼

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

  到此為止,延遲載入就做完了,下面來測試一下:

@Test
public void testFindOrdersUserLazyLoading() throws Exception {
    SqlSession sqlSession = sqlSessionFactory.openSession();
    UserMapperOrders userMapperOrders = sqlSession.getMapper(UserMapperOrders.class);
    //查詢訂單表(單表)
    List<Orders> list = userMapperOrders.findOrdersUserLazyLoading();

    //遍歷上邊的訂單列表
    for(Orders orders : list) {
        //執行getUser()去查詢使用者資訊,這裡實現按需載入
        User user = orders.getUser();
        System.out.println(user);
    }
}
文末福利:“程式設計師私房菜”,一個有溫度的公眾號~
程式設計師私房菜

相關推薦

MyBatis學習11MyBatis延遲載入

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

java學習筆記MyBatis當實體類的屬性名和表的欄位名不一樣時的解決方法

在使用MyBatis開發DAO層時,當實體類中的屬性名和表中的欄位名不一樣時,查詢出來的值為null,此時有3種解決方法 解決方法1                在Mapper.xml對映檔案中,寫SQL語句時起別名 解決

MyBatis學習8MyBatis的二級快取

1. 二級快取的原理   前面介紹了,mybatis中的二級快取是mapper級別的快取,值得注意的是,不同的mapper都有一個二級快取,也就是說,不同的mapper之間的二級快取是互不影響的。為了更加清楚的描述二級快取,先來看一個示意圖:     從圖中可以看出: sqlSession1去查詢使用

MyBatis學習12MyBatis的一級快取

  快取的作用是減輕資料庫的壓力,提高資料庫的效能的。mybatis中提供了一級快取和二級快取,先來看一下兩個快取的示意圖:   從圖中可以看出: 一級快取是SqlSession

SpringMVC學習09SpringMVC的攔截器

Springmvc的處理器攔截器類似於Servlet 開發中的過濾器Filter,用於對處理器進行預處理和後處理。本文主要總結一下springmvc中攔截器是如何定義的,以及測試攔截器的執行情況和使用方法。 1. springmvc攔截器的定義和配置 1.1 springmvc攔截器

Mybatis 學習筆記(六)——延遲載入

一、延遲載入介紹   延遲載入的目的是為了加快查詢速度,提升資料庫效能。對於一個複雜的查詢sql,在業務許可的情況下,我們可以用兩種方式來提升查詢速度(Mybatis環境),讓資料庫的效能蹭蹭的往上提升。第一種是將這個複查查詢分成兩個 statement 先執行

SpringMVC學習06SpringMVC的資料校驗

  這一篇博文主要總結一下springmvc中對資料的校驗。在實際中,通常使用較多是前端的校驗,比如頁面中js校驗,對於安全要求較高的建議在服務端也要進行校驗。服務端校驗可以是在控制層conroller

深度學習-CNNCNN的引數與計算量

一個卷積神經網路的基本構成一般有卷積層(convolutional layer)、池化層(pooling layer)、全連線層(fully connection layer)。本文以caffe中的LeNet-5為例,分析卷積層和全連線層的引數數量和計算量情況。 卷積層的基

latex學習筆記LaTex的距離(固定長度、橡皮長度、長度命令)

固定長度 cm 釐米 mm 毫米 in 英寸(1in=2.54cm) pt 點(1in=72.27pt) bp 大點(1in= 72bp) pc pica (1pc =12pt) 十二點活字 dd

機器學習系列libsvm的svm-toy嘗試

主要內容 利用libSVM自帶的簡易工具來演示SVM的兩類分類過程。(以下內容只是利用libSVM自帶的一個簡易的工具供大家更好的理解SVM,如果你對SVM已經有了一定的瞭解,可以直接跳過這部分內容) 實驗 首先,你要了解的是libSVM只是眾多SVM實現版本中的其中

Spring學習筆記SpringApplication Context和Servlet Context的區別

1. Servlet Context It is initilized when an servlet application is deployed. Servlet Context holds all the configurations (init

Selenium學習筆記測試如何設定等待時間

有時候為了保證指令碼執行的穩定性,需要指令碼中新增等待時間。 sleep等待固定時間 python 的time 包提供了休眠方法sleep() ,匯入time 包後就可以使用sleep()進行指令碼的執行過程進行休眠。 implicitly_wait() 是webdirve

J2EE學習筆記Struts2Action的配置

Struts2中Action控制器用來處理深層業務邏輯,在編寫好Action類後,在src路徑下建立檔案struts.xml,在其中新增程式碼配置Action<action name="struts" class="org.action.StrutsAction">

Lua學習筆記Lua協程的使用

一、簡介 Lua 協同程式(coroutine)與執行緒比較類似:擁有獨立的堆疊,獨立的區域性變數,獨立的指令指標,同時又與其它協同程式共享全域性變數和其它大部分東西。 協同是非常強大的功能,但是用起來也很複雜。 二、使用 1.建立: --

Lua學習筆記 Lua實現面向物件,轉自雲風的部落格

local _class={} function class(super) local class_type={} class_type.ctor=false class_type.super=super class_type.new=function(...) local obj={}

OpenCV筆記 11VS2013執行OpenCV 3.0時常見錯誤及解決方法

===========2016年10月29日更新================= 本次在筆記本中安裝VS2015和OPENCV 3.1.0參照毛新雲的教程的出現了諸多問題, 最後按照這篇部落格的步

MyBatis學習05SqlMapConfig.xml檔案的配置總結

  經過上兩篇博文的總結,對mybatis中的dao開發方法和流程基本掌握了,這一節主要來總結一下mybatis中的全域性配置檔案SqlMapConfig.xml在開發中的一些常用配置,首先看一下該全域性配置檔案中都有哪些可以配置的東西: 配置內容 作用 <

學習轉載MyBatis原始碼解析——日誌記錄

宣告:轉載自前輩:開心的魚a1 一 .概述 MyBatis沒有提供日誌的實現類,需要接入第三方的日誌元件,但第三方日誌元件都有各自的Log級別,且各不相同,但MyBatis統一提供了trace、debug、warn、error四個級別; 自動掃描日誌實現,並且第三方日誌外掛載入優先順序如下:sl

MyBatis學習15使用MyBatis Generator自動建立程式碼

這兩天需要用到MyBatis的程式碼自動生成的功能,由於MyBatis屬於一種半自動的ORM框架,所以主要的工作就是配置Mapping對映檔案,但是由於手寫對映檔案很容易出錯,所以可利用MyBatis生成器自動生成實體類、DAO介面和Mapping對映檔案。這樣可以省去很多的功夫,將生成的程

springboot學習筆記springboot+mybatis整合一

1、pom.xml maven依賴引入 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boo