一、概述

1.概念

  就是在需要用到数据时才去进行加载,不需要用的数据就不加载数据。延迟加载也称为懒加载。

2.优缺点

优点:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

缺点:因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。

二、配置

在MyBatis的settings配置中存在两个元素可以配置级联,如下表:

配置项 作用 配置选项说明 默认值
lazyLoadingEnabled

延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。

在特定关联关系中,可通过设置fetchType属性来覆盖该项的开关状态。

true|false false
aggressiveLazyLoading

当启用时,对任意延迟加载属性的调用会使带有延迟加载属性的对象完整加载;

反之,则每种属性按需加载

true|false

版本3.4.1(包含)之前为true,

之后为false

三、测试

1.修改配置项

我们在SqlMapConfig.xml中修改配置:

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

2.测试

我们在之前的测试类中进行测试:

加断点进行调试:

从上面看出运行到断点打出日志,雇员的基础信息个鉴别器的数据已经被sql取出,这是第一批被取出的数据。我们跳过断点继续执行:

可以看出雇员的工牌和任务表都被查询出来了,为什么这两个被一并查询出来了?我们分析下雇员级联的层级关系,如下图:

从上图我可以看出,aggressiveLazyLoading配置项是一个层级开关,当设置为true时,它是一个开启了层级开关的延迟加载。

3.配置项修改:

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

4.执行测试类打印日志

从打印的日志中我们看出只有雇员记录打印出来了,其他内容都采取了延迟加载,并且层级加载也失效了。

四、分析

1.分析

  从测试中我们知道lazyLoadingEnabled决定是否开启延迟加载,而选项aggressiveLazyLoading则控制是否采取层级加载,但是他们都是全局性的配置,有时候并不能解决我们的实际需求。我们在加载雇员信息时只加载雇员任务信息,层级关系会将工牌信息也加载出来。为看处理这个问题,在MyBatis中使用fetchType属性,它可以处理全局定义无法处理的问题。

2.fetchType

  etchType属性出现在级联元素中,在association和collection中,可以通过eager(获取当前pojo后立即加载对应数据)和lazy(获取当前pojo后延迟加载对应的数据)进行配置。注意discriminator没有这个属性可以配置。

3.测试

在保证配置文件中如下配置我们对之前的雇员配置文件进行修改。

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

修改雇员相应的IEmployeeDao.xml配置文件:

<collection property="employeeTaskList" column="id"
fetchType="eager"
select="com.xhbjava.dao.IEmployeeTaskDao.getEmployeeTaskByEmpId" />

执行测试类打印日志:

从日志中我们看到这个时候可以按照我们的需求进行数据加载,先加载雇员信息,再加载雇员任务信息,fetchType属性会忽略全局配置项lazyLoadingEnabled和aggressiveLazyLoading。


												

Mybaits(11)延迟加载的更多相关文章

  1. 地区sql

    /*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : lo ...

  2. Angular入门到精通系列教程(11)- 模块(NgModule),延迟加载模块

    1. 摘要 2. NgModule举例.说明 3. Angular CLI生成模块 4. 延迟加载模块 5. 总结 环境: Angular CLI: 11.0.6 Angular: 11.0.7 No ...

  3. 【MyBatis学习11】MyBatis中的延迟加载

    1. 什么是延迟加载 举个例子:如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息.把对用户信息的按需去查询就是延迟加载. 所以延迟加载即先从单表 ...

  4. mybaits(十)mybatis常见面试

      面试题总结 1.MyBatis 解决了什么问题? 或:为什么要用 MyBatis? 或:MyBatis 的核心特性? 1)资源管理(底层对象封装和支持数据源) 2)结果集自动映射 3)SQL 与代 ...

  5. ABP(现代ASP.NET样板开发框架)系列之11、ABP领域层——仓储(Repositories)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之11.ABP领域层——仓储(Repositories) ABP是“ASP.NET Boilerplate Proj ...

  6. ViewPager+Fragment取消预加载(延迟加载)(转)

    原文:http://www.2cto.com/kf/201501/368954.html 在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragmen ...

  7. jquery-lazyload延迟加载图片

    下载地址:https://github.com/tuupola/jquery_lazyload用法:头部引用<script src="jquery.js" type=&quo ...

  8. Hibernate 延迟加载原理

        如何简单的理解延迟加载?开发中常见的org.hibernate.LazyInitializationException no session错误又是怎么产生的?下面通过一个简单的例子来解析一下 ...

  9. 【小贴士】【stringify神BUG】【localstorage失效】【消灭Safari alert框】【是否延迟加载】【页面10px白屏】

    前言 最近碰到几个恶心问题,也发现一点优化技巧,以及对Hybrid知识的一些整理,这里便一并拿出来做分享了,关于Hybrid的调试,会是我今后一个重点 我的博客首先是学习笔记,方便自己做知识沉淀,以后 ...

随机推荐

  1. thinkphp5.0 insert添加数据

    首先引入文件:use think\Db; public function zhuce(){ $username = input("username");//手机号 $passwor ...

  2. 咸鱼的ACM之路:DFS水题集

    DFS的核心就是从一种状态出发,转向任意的一个可行状态,直到达到结束条件为止.(个人理解) 下面全是洛谷题,毕竟能找到测试点数据的OJ我就找到这一个....在其他OJ上直接各种玄学问题... P159 ...

  3. H5_0014:background-size设置

    2,background-position

  4. Log4net实用说明

    Log4net实用说明 Appender Filter Layout Logger ObjectRender Repository PatterLayout格式化字符表 配置文件说明 Appender ...

  5. redis测试题

    1.什么是Redis? Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存. ...

  6. 三分钟学会.NET Core Jwt 策略授权认证

    一.前言 大家好我又回来了,前几天讲过一个关于Jwt的身份验证最简单的案例,但是功能还是不够强大,不适用于真正的项目,是的,在真正面对复杂而又苛刻的客户中,我们会不知所措,就现在需要将认证授权这一块也 ...

  7. 第十周 11.28 psp0

    课堂测试总结 学生:马小心                                              日期:2017.11.28 作业号 日期 过程 估计数据 实际数据 累计数据 时间 ...

  8. Piggy-Bank HDU - 1114 完全背包

    #include<iostream> #include<cstring> using namespace std; const int INF=0x3f3f3f3f; ]; s ...

  9. Flask知识总结

    1.-----------------路由设置的2种方式----------------- 查看源码,route方法里,本质是执行app.add_url_rule() 因此可以这么写(主流方式): @ ...

  10. springboot 扫描不到包 @SpringBootApplication 自动配置原理

    解决方案 在main类中增加注解 @ComponentScan("com.test.test.*") 扫描具体的包 @ComponentScan(basePackages = {& ...