一、概述

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。


												

最新文章

  1. get方式和set方式提交时乱码
  2. MVC学习系列1--什么是MVC
  3. Linux基础精华
  4. python之对指定目录文件夹的批量重命名
  5. uboot启动内核(3)
  6. Install sheild设置了Blue皮肤,但是有的窗口更改不了问题
  7. python知识点(07-08)
  8. 学习asp.net mvc5心得
  9. I.MX6 android shutdown 内核崩溃
  10. IEnumerable接口的扩展方法
  11. mac git 命令提示
  12. ASA QOS限速
  13. mysql很全的和完整的总结
  14. C语言5种存储区域
  15. [bzoj1067][SCOI2007]降雨量——线段树+乱搞
  16. markdown流程图画法小结
  17. 在linux系统中
  18. ffmpeg的编译和安装
  19. multiple definition of XXX情况分析
  20. 本地win7ping VM linux ipv6地址问题

热门文章

  1. ZViZbsPBdS
  2. Android记事本在菜单栏添加搜索按钮方法
  3. 【Android休眠】之Android休眠机制
  4. 【终端使用】常用Linux命令的基本使用
  5. ArcMap 发布 ArcGIS Server OGC(WMSServer,MapServer)服务
  6. Goland 2019下载和安装(带破解补丁和汉化包)
  7. Nginx出现403 forbidden
  8. Oracle 中关于 Group By 子句与多行函数嵌套搭配使用的注意事项
  9. Ubuntu 18.04安装配置Apache Ant
  10. jQuery---清空节点和删除节点