首頁 > Java > java教程 > 主體

MyBatis延遲載入實例詳解

零下一度
發布: 2017-06-25 10:38:13
原創
1291 人瀏覽過

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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!