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

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

一、关联对象加载时机

、关联对象加载时机

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

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

注意:延迟加载的应用要求,关联对象的查询与主加载对象的查询必须是分别进行的select语句,不能是使用多表连接所进行的select查询。因为,多表连接查询,其实质是对一张表的查询,对由多个表连接后形成的一张表的查询。会一次性将多张表的所有信息查询出来。

二、直接加载

1.主配置文件(Mybatis.xml)

全局属性lazyLoadingEnabled的值只要设置为false,那么,对于关联对象的查询,将采用直接加载。即在查询过主加载对象后,会马上查询关联对象。

lazyLoadingEnabled的默认值为false,即直接加载。

<settings><!-- 延迟加载总开关 --><setting name="lazyLoadingEnabled" value="false"/>
</settings>

2.mapper映射文件

<mapper namespace="com.hcx.dao.IMinisterDao"><select id="selectCountryById" resultType="Country">select cid,cname from country where cid=#{cid}</select><resultMap type="Minister" id="ministerMapper"><id column="mid" property="mid"/><result column="mname" property="mname"/><association property="country"javaType="Country"select="selectCountryById"column="countryId"/></resultMap><select id="selectMinisterById" resultMap="ministerMapper">select mid,mname,countryId from minister where mid=#{mid}</select>
</mapper>

3.测试类:

当程序执行到断点处语句时,不仅对country表进行了查询,对minister表也同时进行了查询。

public class MyTest {private ICountryDao dao;private SqlSession session;@Beforepublic void setUp(){session = MyBatisUtils.getSqlSession();dao = session.getMapper(ICountryDao.class);}@Afterpublic void tearDown(){if(session!=null){session.close();}}@Testpublic void test01(){       Country country = dao.selectCountryById(2);//此处加断点System.out.println(country);System.out.println(country.getMinisters().size());}
}

三、深度延迟加载

修改主配置文件的,将延迟加载开关lazyLoadingEnabled开启(置为true),将侵入式延迟加载开关aggressiveLazyLoading关闭(置为false)。

<settings><!-- 延迟加载总开关 --><setting name="lazyLoadingEnabled" value="true"/><!-- 侵入式延迟加载开关 --><setting name="aggressiveLazyLoading" value="false"/>
</settings>

此时,只有当代码执行到输出Minister对象详情时,底层才执行select语句对minister表进行查询。

四、侵入式延迟加载

修改主配置文件的,将延迟加载开关lazyLoadingEnabled开启(置为true),将侵入式延迟加载开关aggressiveLazyLoading也开启(置为true,默认为true)。

<settings><!-- 延迟加载总开关 --><setting name="lazyLoadingEnabled" value="true"/><!-- 侵入式延迟加载开关 --><setting name="aggressiveLazyLoading" value="true"/>
</settings>

测试类

@Test
public void test01(){       Country country = dao.selectCountryById(2);//此处加断点System.out.println(country);System.out.println(country.getMinisters().size());
}

当代码执行断点处语句时会立即查询country表,但每查询minister表。说明现在的延迟加载已经启动。
当对country对象的详情进行访问时,对minister表也进行了查询。因为该延迟加载策略已经将主加载对象的关联属性也作为主加载对象的基本信息了,而前面已经查询出了主加载对象的基本信息,但其关联对象基本信息尚无。所以,马上进行对minister表的查询。
换个角度来说,该延迟策略使关联对象的数据侵入到了主加载对象的数据中,所以称为侵入式延迟加载。

注意:该延迟策略也是一种延迟加载,需要在延迟加载开关lazyLoadingEnabled开启时才会起作用。若lazyLoadingEnabled为false,则aggressiveLazyLoading无论取何值,均不起作用。

mybatis学习(55):延迟加载相关推荐

  1. Mybatis学习第四天:Mybatis延迟加载懒加载,一级缓存,二级缓存,注解开发

    文章目录 Mybatis中的延迟加载 一对一进行延迟加载 一对多的延迟加载 缓存机制: 一级缓存 二级缓存 注解开发 注解开发--单表的增删改查 注解开发--建立表与实体类的对应关系 注解开发--多表 ...

  2. mybatis学习笔记(13)-延迟加载

    2019独角兽企业重金招聘Python工程师标准>>> mybatis学习笔记(13)-延迟加载 标签: mybatis [TOC] resultMap可以实现高级映射(使用asso ...

  3. MyBatis学习——分步查询与延迟加载

    声明:面试是遇到延迟加载问题,在网页搜索到此篇文章,感觉很有帮助,留此学习之用! 一.分步查询 分步查询通常应用于关联表查询,如:电商平台,查询订单信息时需要查询部分的用户信息:OA系统查询个人信息时 ...

  4. 【转】MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突

    [转]MyBatis学习总结(四)--解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体 ...

  5. 事务中mybatis通过id查不到但是通过其他条件可以查到_40打卡 MyBatis 学习

    第57次(mybatis) 学习主题:mybatis 学习目标: 1 掌握框架的概念 2 掌握mybatis环境搭建 对应视频: http://www.itbaizhan.cn/course/id/8 ...

  6. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作

    上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...

  7. MyBatis学习--简单的增删改查

    jdbc程序 在学习MyBatis的时候先简单了解下JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: 1 Public static void main(String[] arg ...

  8. Mybatis学习总结二

    Mybatis学习总结二 0.不需要修改的文件(在src下面) jdbc.properties文件 log4j.properties文件 SqlMapConfig.xml文件 1.高级结果映射 1.1 ...

  9. MyBatis学习总结一

    Mybatis学习总结一 1.Mybatis介绍 2.Mybatis架构图 2.1.架构图的意义 2.1.1.JDBC编写 2.1.2.反思问题 2.2.Mybatis架构图 3.入门案例 3.1.下 ...

最新文章

  1. 用JDBC写一个学生管理系统(添加、删除、修改、查询学生信息)
  2. 自然语言处理(NLP)之词义消歧(WSD)的简介与实现
  3. mybatis 报错最终解决 :argument type mismatch
  4. 从强制卸载Office到强制安装WPS
  5. Java调用Python遇到的一系列问题与解决方案
  6. 龙格-库塔(Runge-Kutta)方法数学原理及实现
  7. Netty1:初识Netty
  8. dos安装深度linux,U盘用grub4dos引导Deepin v20 Beta iso安装的方法
  9. Oracle expdp/impdp导出导入命令及数据库备份
  10. Spring AOP实现声明式事务代码分析
  11. SVN日常提交工作时需要注意的事项
  12. python 文本分析教程_Python笔记_第五篇_Python数据分析基础教程_文件的读写
  13. JS中,把一个数字转换为字串
  14. ai进入轮廓模式怎么退出_AI 绘图工具里,我不知道按了什么键一保存都是轮廓了!怎么办!怎样恢复呢?...
  15. 最新[发货100]PHP源码免费虚拟商品自动发货系统v1.0
  16. c语言中ifelse意义,c语言if和else if的区别
  17. 最大流(标号法 Ford-Fulkerson算法)
  18. 【图文详解】一文全面彻底搞懂HBase、LevelDB、RocksDB等NoSQL背后的存储原理:LSM-tree日志结构合并树...
  19. Matlab论文插图绘制模板第33期—等高线填充图(contourf)
  20. SQL更改表名,数据库名,字段名

热门文章

  1. 用于主题检测的临时日志(c48534c5-686f-461e-811f-a15a2f265756 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)...
  2. BI Publisher开发基本流程
  3. iWindowsMobile Launches Updated ZoomBoard
  4. linux内核epub,Android底层开发技术实战详解——内核、移植和驱动(第2版)[EPUB][MOBI][AZW3][42.33MB]...
  5. python matplotlib库安装出错_使用pip install Matplotlib时出现内存错误
  6. c语言定时器回调函数的参数,定时器的简单实现即回调函数的运用
  7. 树莓派Raspbian Buster/Debian 10 安装ROS
  8. 【机器视觉学习笔记】二值图像连通区域提取算法(C++)
  9. 【 Grey Hack 】万金油脚本:常见端口获取Password
  10. [react] 请说说react中Portal是什么?