MyBatis---- Mybatis 延迟加载策略

上一篇👉:MyBatis---- JNDI数据源



🚴大家好!我是近视的脚踏实地,后边这系列主要是记录自己MyBatis的学习笔记,这篇文章主要来学习Mybatis 有哪些实现延迟的策略
     唯有行动  才能解除你所有的不安

1、延迟加载和立即加载的概念

通过前面的学习,我们已经掌握了 Mybatis 中一对一,一对多,多对多关系的配置及实现,可以实现对象的关联查询。实际开发过程中很多时候我们并不需要总是在加载用户信息时就一定要加载他的账户信息。此时就是我们所说的延迟加载,如下例子

mybatis中的延迟加载
       问题:在一对多中,当我们有一个用户,它有100个账户。
                  在查询用户的时候,要不要把关联的账户查出来?
                  在查询账户的时候,要不要把关联的用户查出来?

那从两个问题出发,如果我们在查一个用户,它关联100个账户,我们在查用户的时候,同时就把它关联的账户查出来,那么这个时候我们在内存中开辟的空间应该是这样的👇:
在这里插入图片描述

(首先有一个用户对象,同时里边有一个accounts集合,这个accounts集合引用了一个account集合,接着这个里边就会存放着有100个account列表,那么这样的情况下,比如我们要做的事就是查询功能,但是由于我们用户里边关联了一个账户集合,并且这个账户有100个用户,我们一查用户,就会把那100个账户都查出来,那么这个时候无疑是对内存一个非常大的开销,那么也是换句话说,如果我们不用的时候,是完全不应该把这些内容查出来的,那么如果我们要用的时候又没查出来,那就又用不了,所以就要讲到延迟查询的概念 )

在查询用户时,用户下的账户信息应该是什么时候使用,什么时候查询的。
在查询账户时,账户的所属用户信息应该是随着账户查询时一起查询出来。
(因为如果你只查询uid id这些信息,用户看不懂是谁,所以至少还要把用户的姓名等查询出来)

那么通过分析,可以发现不一样的地方,那么就是查询的时机。第一个查询用户时,账户的信息应该是按照需求来加载的,你用就查,不用就不查,那么这种延迟加载的思想就是我们符合第一种查询用户。

什么是延迟查询👇:
       在真正使用数据时才发起查询,不用时不查询。延迟加载也称懒加载
好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

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

什么是立即加载👇:
       不管用不用,只要一调用方法,马上发起查询。

在对应的四种表关系中:一对多,多对一,一对一,多对多
       一对多,多对多:通常情况下我们都是采用延迟加载。
       多对一,一对一:通常情况下我们都是采用立即加载。

2、mybatis一对一实现延迟加载

那么首先先新建一个新的项目,然后把之前oneTomany那个工程src下的代码拷贝过来,同时把pom文件的坐标考过来

那么现在查询账户的话,它会不会马上去查询用户呢,显然它是一定会的,因为这条语句👇:
在这里插入图片描述
那么我们拿到sqlyog中执行一下,其实他是一下就查询了两张表,那么我一下就把两张表查了,那自然而然也就没有延迟的存在,因为我们是把所有的数据都过来
在这里插入图片描述
那么换句话来说,我们在实际的开发过程中,在多对一或者一对一的情况下,我们就可以直接采用这种方式来实现功能,但是我们还是要知道,要学习一下在使用association的时候怎么样实现延迟加载。那么因为我们之前实现的是立即加载的内容,所以我们就需要对AccountDao.xml文件中的配置做一些改变,让他能实现延迟的功能。

那么首先我们要实现延迟加载的操作,我们的sql语句的写法就必须改,以及配置好延迟加载的功能
在这里插入图片描述
接着到测试类中运行
在这里插入图片描述
运行结果👇:
在这里插入图片描述
在这里插入图片描述
那么从上图中首先是打开JDBC Connection,然后接下来select * from user查了两次,一个参数是46,一个是45,然后一个是执行了三条sql语句,是在一次查询统一执行的,也就是换句话说,我们并没有看到它延迟的效果,因为它在查询的时候,后边这些都做了操作,所以说此时还没有真正地实现功能,那么要真正实现功能,我们还要做一个配置。那么我们先打开mybatis的官网去看看延迟使用了什么方法👉:https://mybatis.org/mybatis-3/zh/configuration.html#settings
在这里插入图片描述

所以看到它的默认是false,所以默认是关闭着的,所以接在sqlMapConfig.xml中进行配置👇:
在这里插入图片描述
那么再来运行测试类得到如下结果👇:

在这里插入图片描述

这个时候运行,它出现的顺序是有点不太一样,那么和之前对比,在没有开启延迟加载的时候它是一股脑地那些都输出了,而开启了之后它是一个一个地进行了输出。那么为什么它显示用户的信息呢,因为是在测试类中,写的语句让他显示的👇:
在这里插入图片描述
在这里插入图片描述
那么我们可以先把遍历的部分注释掉,然后运行再看看,那么效果就是它只执行了一条语句,也就是查询account,此时就再也没有那个查询user的操作👇: 这就是在一对一的情况下实现延迟加载的功能
在这里插入图片描述

3、myvatis一对多实现延迟加载

那么接下来来实现一多的方式,按照跟刚才一样的思路,首先我们需要先去改造UserDao接口,里边有个findAll方法,这个方法对应了UserDao.xml中的,也是由于用了LEFT OUTER JOIN,此时它肯本不可能实现延迟,因为它一次就把两张表的内容查询了,所以后边的内容我们都不要了,修改后👇:
在这里插入图片描述
接着就是要做UserDao.xml中collection的配置
在这里插入图片描述
接着要去AccountDao中添加一个findAccountByUid的方法👇:
在这里插入图片描述
接着到AccountDao.xml中对这个方法进行配置👇:
在这里插入图片描述
那么接下来就打开UserTest测试类来去测试
在这里插入图片描述
同样先来执行一下,运行结果👇:
在这里插入图片描述
可以发现已经有了延迟加载的特征,但是没有采用延迟原因是我们打印了出来,那么把遍历的注释掉再来运行,就可以看到他只执行了一个查询用户,并没有执行查询用户下的账户信息,那么这个就是一对多情况下的延迟加载👇:
在这里插入图片描述
那么其实延迟加载的思想都是在用的时候去调用对方配置文件中的一个配置来实现查询的功能


下一篇👉MyBatis---- Mybatis 缓存

本篇博客到这就完啦,非常感谢您的阅读🙏,那么下一篇将会学习Mybatis的缓存,如果对您有帮助,可以帮忙点个赞或者来波关注鼓励一下喔😬

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值