zoukankan      html  css  js  c++  java
  • MyBatis_延迟加载

    一、延迟加载

       MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时, 按照设置延迟规则推迟对关联对象的select查询。延迟加载可以有效的减少数据库压力。

     MyBatis的延迟加载只是对关联对象的查询有延迟设置,对于主加载对象都是直接执行查询语句的。

    二、关联对象的加载时机

      MyBatis根据对关联对象查询的select语句的执行时机,分为三种类型:直接加载侵入式延迟加载深度延迟加载

    • 直接加载:执行完对主加载对象的select语句,马上执行对关联对象的select查询。
    • 侵入式延迟加载:执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情时,就会马上执行关联对象的select查询,即对关联对象的查询执行,侵入到主加载对象的详情访问中。(将关联对象的详情侵入到了主加载对象的详情中,即将关联对象的详情作为主加载对象的详情一 部分出现)
    • 深度延迟加载:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只要当真正访问关联对象的详情时,才会执行对关联对象的select查询。

    示例:建立country和minister的DB表

    直接加载示例:

    <setting name="lazyLoadingEnabled" value="flase"/>

    上面的语句,系统默认设置为“false”

    输出:

    深度延迟加载示例(只访问cname,就不查minister表,提高了效率)

    <!--设置整个应用所使用的常量  -->
    <settings>
     <setting name="lazyLoadingEnabled" value="true"/>//系统默认"aggressiveLazyLoading"为false
    </settings>

    "lazyLoadingEnabled"类似于开关功能。

    @Test
        public void test01() {
            Country country = dao.selectCountryById(1);
            System.out.println(country.getCname());
        }

    执行顺序如下(当前“aggressiveLazyLoading”为false):

    侵入式延迟示例:

    <settings>
     <setting name="lazyLoadingEnabled" value="true"/>
     <setting name="aggressiveLazyLoading" value="true"/>
    </settings>

    执行顺序如下:

    总结:

  • 相关阅读:
    高精度
    SPOJ 3267(DQUERY) D-query 【主席树】【离线树状数组】
    POJ 3225 Help with Intervals 【线段树】
    HDU 4288 Coder 【线段树】
    HDU 1542 Atlantis 【线段树+扫描线】
    Codeforces 732D Exams【二分+贪心】
    HDU 2795 Billboard 【线段树】
    2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest Problem J 【二分+DP+单调队列】
    HDU 5521 Meeting 【拆点+最短路】
    POJ 3255 Roadblocks 【次短路】
  • 原文地址:https://www.cnblogs.com/hoje/p/8117129.html
Copyright © 2011-2022 走看看