mybatis学习(55):延迟加载

简介: mybatis学习(55):延迟加载

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

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

一、关联对象加载时机

、关联对象加载时机

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

   直接加载:执行完对主加载对象的select语句,马上执行对关联对象的select查询。

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

   深度延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的select查询。

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

二、直接加载

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

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

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

1. ​​<settings>​​
2. ​​<!-- 延迟加载总开关 -->​​
3. ​​<setting name="lazyLoadingEnabled" value="false"/>​​
4. ​​</settings>​​

2.mapper映射文件

1. ​​<mapper namespace="com.hcx.dao.IMinisterDao">​​
2. 
3. ​​<select id="selectCountryById" resultType="Country">​​
4. ​​select cid,cname from country where cid=#{cid}​​
5. ​​</select>​​
6. 
7. ​​<resultMap type="Minister" id="ministerMapper">​​
8. ​​<id column="mid" property="mid"/>​​
9. ​​<result column="mname" property="mname"/>​​
10. ​​<association property="country"​​
11. ​​javaType="Country"​​
12. ​​select="selectCountryById"​​
13. ​​column="countryId"/>​​
14. ​​</resultMap>​​
15. 
16. ​​<select id="selectMinisterById" resultMap="ministerMapper">​​
17. ​​select mid,mname,countryId from minister where mid=#{mid}​​
18. ​​</select>​​
19. ​​</mapper>​​

3.测试类:

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

1. ​​public class MyTest {​​
2. 
3. ​​private ICountryDao dao;​​
4. ​​private SqlSession session;​​
5. 
6. ​​@Before​​
7. ​​public void setUp(){​​
8. ​​session = MyBatisUtils.getSqlSession();​​
9. ​​dao = session.getMapper(ICountryDao.class);​​
10. ​​}​​
11. 
12. ​​@After​​
13. ​​public void tearDown(){​​
14. ​​if(session!=null){​​
15. ​​session.close();​​
16. ​​}​​
17. ​​}​​
18. 
19. ​​@Test​​
20. ​​public void test01(){ ​​
21. ​​Country country = dao.selectCountryById(2);​​
22. ​​//此处加断点​​
23. ​​System.out.println(country);​​
24. ​​System.out.println(country.getMinisters().size());​​
25. ​​}​​
26. ​​}​​

三、深度延迟加载

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

1. ​​<settings>​​
2. ​​<!-- 延迟加载总开关 -->​​
3. ​​<setting name="lazyLoadingEnabled" value="true"/>​​
4. ​​<!-- 侵入式延迟加载开关 -->​​
5. ​​<setting name="aggressiveLazyLoading" value="false"/>​​
6. ​​</settings>​​

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

四、侵入式延迟加载

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

1. ​​<settings>​​
2. ​​<!-- 延迟加载总开关 -->​​
3. ​​<setting name="lazyLoadingEnabled" value="true"/>​​
4. ​​<!-- 侵入式延迟加载开关 -->​​
5. ​​<setting name="aggressiveLazyLoading" value="true"/>​​
6. ​​</settings>​​

测试类

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

当代码执行断点处语句时会立即查询country表,但每查询minister表。说明现在的延迟加载已经启动。

当对country对象的详情进行访问时,对minister表也进行了查询。因为该延迟加载策略已经将主加载对象的关联属性也作为主加载对象的基本信息了,而前面已经查询出了主加载对象的基本信息,但其关联对象基本信息尚无。所以,马上进行对minister表的查询。

换个角度来说,该延迟策略使关联对象的数据侵入到了主加载对象的数据中,所以称为侵入式延迟加载。

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


相关文章
|
12月前
|
SQL XML Java
八、(了解即可)MyBatis懒加载(或者叫延迟加载)
八、(了解即可)MyBatis懒加载(或者叫延迟加载)
385 1
|
缓存 NoSQL Java
Mybatis学习:Mybatis缓存配置
MyBatis缓存配置包括一级缓存(事务级)、二级缓存(应用级)和三级缓存(如Redis,跨JVM)。一级缓存自动启用,二级缓存需在`mybatis-config.xml`中开启并配置映射文件或注解。集成Redis缓存时,需添加依赖、配置Redis参数并在映射文件中指定缓存类型。适用于查询为主的场景,减少增删改操作,适合单表操作且表间关联较少的业务。
268 6
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
2904 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
安全 Java 数据库连接
后端框架的学习----mybatis框架(3、配置解析)
这篇文章详细介绍了MyBatis框架的核心配置文件解析,包括环境配置、属性配置、类型别名设置、映射器注册以及SqlSessionFactory和SqlSession的生命周期和作用域管理。
后端框架的学习----mybatis框架(3、配置解析)
|
Java 关系型数据库 数据库连接
mybatis-plus学习
MyBatis-Plus ,MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。
207 5
|
Java 数据库连接 mybatis
后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
|
Java 数据库连接 测试技术
后端框架的学习----mybatis框架(8、lombok)
这篇文章介绍了如何在MyBatis框架中使用lombok库来简化Java实体类的编写,包括在IDEA中安装Lombok插件、在项目中导入lombok依赖以及在实体类上使用Lombok提供的注解。
|
Java 数据库连接 数据库
后端框架的学习----mybatis框架(6、日志)
这篇文章介绍了如何在MyBatis框架中使用日志功能,包括配置MyBatis的日志实现、使用log4j作为日志工具,以及如何通过配置文件控制日志级别和输出格式。
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(5、分页)
这篇文章介绍了如何在MyBatis框架中实现分页功能,包括使用SQL的`limit`语句进行分页和利用MyBatis的`RowBounds`对象进行分页的方法。
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(7、使用注解开发)
这篇文章讲述了如何使用MyBatis框架的注解方式进行开发,包括在接口上使用注解定义SQL语句,并通过动态代理实现对数据库的增删改查操作,同时强调了接口需要在核心配置文件中注册绑定。