Mybaits(11)延迟加载
一、概述
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)延迟加载的更多相关文章
- 地区sql
/*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : lo ...
- Angular入门到精通系列教程(11)- 模块(NgModule),延迟加载模块
1. 摘要 2. NgModule举例.说明 3. Angular CLI生成模块 4. 延迟加载模块 5. 总结 环境: Angular CLI: 11.0.6 Angular: 11.0.7 No ...
- 【MyBatis学习11】MyBatis中的延迟加载
1. 什么是延迟加载 举个例子:如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息.把对用户信息的按需去查询就是延迟加载. 所以延迟加载即先从单表 ...
- mybaits(十)mybatis常见面试
面试题总结 1.MyBatis 解决了什么问题? 或:为什么要用 MyBatis? 或:MyBatis 的核心特性? 1)资源管理(底层对象封装和支持数据源) 2)结果集自动映射 3)SQL 与代 ...
- ABP(现代ASP.NET样板开发框架)系列之11、ABP领域层——仓储(Repositories)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之11.ABP领域层——仓储(Repositories) ABP是“ASP.NET Boilerplate Proj ...
- ViewPager+Fragment取消预加载(延迟加载)(转)
原文:http://www.2cto.com/kf/201501/368954.html 在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragmen ...
- jquery-lazyload延迟加载图片
下载地址:https://github.com/tuupola/jquery_lazyload用法:头部引用<script src="jquery.js" type=&quo ...
- Hibernate 延迟加载原理
如何简单的理解延迟加载?开发中常见的org.hibernate.LazyInitializationException no session错误又是怎么产生的?下面通过一个简单的例子来解析一下 ...
- 【小贴士】【stringify神BUG】【localstorage失效】【消灭Safari alert框】【是否延迟加载】【页面10px白屏】
前言 最近碰到几个恶心问题,也发现一点优化技巧,以及对Hybrid知识的一些整理,这里便一并拿出来做分享了,关于Hybrid的调试,会是我今后一个重点 我的博客首先是学习笔记,方便自己做知识沉淀,以后 ...
随机推荐
- Android列表类视图之基本适配器BaseAdapter
说到列表视图,不难联想到前面提到过的数组适配器,但是数组适配器只能搭建文本选择项,扩展能力并不强,Android提供了一种适应性更强的基本适配器BaseAdapter,该适配器允许开发者在别的代码中进 ...
- MySQL在大数据、高并发场景下的SQL语句优化和"最佳实践"
本文主要针对中小型应用或网站,重点探讨日常程序开发中SQL语句的优化问题,所谓“大数据”.“高并发”仅针对中小型应用而言,专业的数据库运维大神请无视.以下实践为个人在实际开发工作中,针对相对“大数据” ...
- 2020省选模拟训练1 排列(perm)多项式exp+EGF
这道题真的还是简单的一批..... 我当时要是参加考试的话该多好(凭这一道题就能进前 5 了) 十分显然的指数型生成函数. 令 $f[i]$ 表示有 $i$ 个点的答案. 然后显然有 $f[i]=\s ...
- Beego :布局页面
1:页面布局 一个html页面由:head部分,body部分,内部css,内部js,外联css,外联的js这几部分组成.因此,一个布局文件也就需要针对这些进行拆分. 2> 新建一个lay ...
- PAT (Basic Level) Practice (中文)1041 考试座位号 (15 分)
每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考 ...
- PAT (Advanced Level) Practice 1008 Elevator (20 分) (模拟)
The highest building in our city has only one elevator. A request list is made up with N positive nu ...
- html5的页面在IOS中,按钮 变成圆角怎么办?
在button的css 中添加: -webkit-appearance: none; border: none; border-radius: 0; ok 的啦 文章来源:刘俊 ...
- 小白的java学习之路 “ 带参数的方法”
一.带参数的方法: 1.1 语法: <访问修饰符> 返回类型 <方法名>(<形式参数列表>) { //方法的主体 } 1.2 案例: 榨汁机 public clas ...
- set类型的应用场景 —— Redis实战经验
set类型是string类型的集合,其特点是集合元素无序且不重复,每个集合最多可以存储 232 - 1 个元素(40多亿),set类型主要有以下应用场景. 1. 好友/关注/粉丝/感兴趣的人集合 se ...
- 浅谈C#委托的用法-delegate[转]
一.委托的概念 委托和类一样是一种用户自定义类型,它存储的就是一系列具有相同签名和返回类型的方法的地址,调用委托的时候,它所包含的所有方法都会被执行. 借用百度上的一句话概括:委托是一个类,它定义了方 ...