目錄
2.使用association實作延遲載入
2.1需求
2.2mapper.xml
2.3 延遲載入resultMap
2.4mapper.java
2.5測試
2.5.1測試想法
2.5.2延遲加載配置
首頁 Java java教程 MyBatis延遲載入實例詳解

MyBatis延遲載入實例詳解

Jun 25, 2017 am 10:38 AM
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中的getUser()時,開始進行延遲載入。

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

2.5.2延遲加載配置

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

在mybatis核心設定檔中設定:

lazyLoadingEnabled、aggressiveLazyLoading

#falsetrue

設定項目

#描述

允許值

#預設值

lazyLoadingEnabled

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

true | false

aggressiveLazyLoading

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

true | false

#在SqlMapConfig.xml中配置:

     <!-- 全局配置参数,需要时再设置  --> <settings> <!-- 打开延迟加载的开关  --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 将积极加载改为消极加载即按需要加载 --> <setting name="aggressiveLazyLoading" value="false"/> </settings>
登入後複製
2.5.3測試程式碼

    @Testpublic 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(最好是單表,也可以關聯查詢),再去按需要載入關聯查詢的其它資訊。 ###

以上是MyBatis延遲載入實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

詳解MyBatis動態SQL標籤中的Set標籤功能 詳解MyBatis動態SQL標籤中的Set標籤功能 Feb 26, 2024 pm 07:48 PM

MyBatis動態SQL標籤解讀:Set標籤用法詳解MyBatis是一個優秀的持久層框架,它提供了豐富的動態SQL標籤,可以靈活地建構資料庫操作語句。其中,Set標籤是用來產生UPDATE語句中SET子句的標籤,在更新作業中非常常用。本文將詳細解讀MyBatis中Set標籤的用法,以及透過具體的程式碼範例來示範其功能。什麼是Set標籤Set標籤用於MyBati

揭秘C語言的吸引力: 發掘程式設計師的潛質 揭秘C語言的吸引力: 發掘程式設計師的潛質 Feb 24, 2024 pm 11:21 PM

學習C語言的魅力:解鎖程式設計師的潛力隨著科技的不斷發展,電腦程式設計已經成為了一個備受關注的領域。在眾多程式語言中,C語言一直以來都備受程式設計師的喜愛。它的簡單、高效以及廣泛應用的特點,使得學習C語言成為了許多人進入程式設計領域的第一步。本文將討論學習C語言的魅力,以及如何透過學習C語言來解鎖程式設計師的潛力。首先,學習C語言的魅力在於其簡潔性。相較於其他程式語言而言,C語

解析MyBatis的快取機制:比較一級快取和二級快取的特性和用法 解析MyBatis的快取機制:比較一級快取和二級快取的特性和用法 Feb 25, 2024 pm 12:30 PM

MyBatis的快取機制解析:一級快取與二級快取的差異與應用在MyBatis框架中,快取是一個非常重要的特性,可以有效提升資料庫操作的效能。其中,一級快取和二級快取是MyBatis常用的兩種快取機制。本文將詳細解析一級快取與二級快取的差異與應用,並提供具體的程式碼範例進行說明。一、一級緩存一級緩存也被稱為本地緩存,它預設開啟且不可關閉。一級快取是SqlSes

一起學習word根號輸入方法 一起學習word根號輸入方法 Mar 19, 2024 pm 08:52 PM

在word編輯文字內容時,有時會需要輸入公式符號。有的小夥子們不知道在word根號輸入的方法,小面就讓小編跟小夥伴們一起分享下word根號輸入的方法教學。希望對小夥伴們有幫助。首先,開啟電腦上的Word軟體,然後開啟要編輯的文件,並將遊標移到需要插入根號的位置,參考下方的圖片範例。 2.選擇【插入】,再選擇符號裡的【公式】。如下方圖片紅色圈的部分內容所示:3.接著選擇下方的【插入新公式】。如下方圖片紅色圈的部分內容所示:4.選擇【根式】,再選擇適當的根號。如下方圖片紅色圈的部分內容所示:

霧鎖王國能野地搭建築嗎 霧鎖王國能野地搭建築嗎 Mar 07, 2024 pm 08:28 PM

玩家在霧鎖王國中進行遊戲時可以收集不同的材料用來建造建築,有很多玩家想知道野地搭建築嗎,霧鎖王國能野地是不能搭建築的,必須要在祭壇的範圍內才可以搭建。霧鎖王國能野地搭建築嗎答:不能。 1.霧鎖王國能野地是不能搭建築的。 2、建築必須要在祭壇的範圍內才可以搭建。 3、玩家可以自行放置靈火祭壇,但一旦離開了範圍,將無法進行建築搭建。 4.我們也可以直接在山上挖個洞當做我們的家,這樣不用耗建築材料。 5.玩家自己搭建的建築中,有舒適度機制,也就是說,內裝越好,舒適度越高。 6.高舒適度將為玩家帶來屬性加成,例如

從零開始學習Go語言中的main函數 從零開始學習Go語言中的main函數 Mar 27, 2024 pm 05:03 PM

標題:從零開始學習Go語言中的main函數Go語言作為一種簡潔、高效的程式語言,備受開發者青睞。在Go語言中,main函數是一個入口函數,每個Go程式都必須包含main函數作為程式的入口點。本文將從零開始介紹如何學習Go語言中的main函數,並提供具體的程式碼範例。一、首先,我們需要安裝Go語言的開發環境。可前往官方網站(https://golang.org

即時監控 MyBatis 控制台中的 SQL 輸出 即時監控 MyBatis 控制台中的 SQL 輸出 Feb 25, 2024 pm 03:48 PM

MyBatis是一款受歡迎的持久層框架,它提供了方便的SQL映射和資料庫操作功能,讓開發者能夠更有效率地與資料庫互動。在實際開發過程中,我們有時候需要在控制台即時列印出MyBatis執行的SQL語句,以便更好地偵錯和最佳化SQL查詢。本文將介紹如何實作在MyBatis中控制台即時列印SQL,並提供具體的程式碼範例。首先,我們需要在My

在PyCharm中快速安裝PyTorch:簡易指南 在PyCharm中快速安裝PyTorch:簡易指南 Feb 24, 2024 pm 09:54 PM

PyTorch安裝指南:在PyCharm中快速搭建開發環境PyTorch是當前深度學習領域中備受歡迎的框架之一,具有易用性和靈活性的特點,深受開發者青睞。本文將為大家介紹如何在PyCharm中快速建置PyTorch的開發環境,方便大家開始深度學習專案的開發。步驟一:安裝PyTorch首先,我們需要安裝PyTorch。 PyTorch的安裝通常需要考慮到系統環境

See all articles