• 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>

    执行顺序如下:

    总结:

  • 相关阅读:
    Tarjan-割点&桥&双连通
    树状数组
    loli的搜索测试-5
    思维题
    生成树
    贪心
    loli的搜索测试-4
    树链剖分
    基于AHK的上课自动签到
    用列表实现栈
  • 原文地址:https://www.cnblogs.com/hoje/p/8117129.html
Copyright © 2020-2023  润新知