延迟加载

延迟加载,可能对于大家来说是一个很陌生的东西,今天我们就来整理一下关于延迟加载的知识点。

那延迟加载到底什么是个什么东西,怎么用呢:

延迟加载 (懒加载) ,就是说在关联查询的时候,利用延迟加载,先加载主信息,需要关联信息时再去按需加载关联信息。

这样会大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

在mybatis中,resultMap标签 的association标签和collection标签具有延迟加载的功能。

我们在这里先来做一个小测试:

首先要先创建一个包装类,在包装类中我们继承事先建好的order类,让包装类中有order类的属性,

然后再在包装类中写入事先创建好的user属性。

我们测试一下没有配置延迟加载的时候mybatis操作sql语句的次数。

这个是UserMapper.xml文件中的,我们写了一个sql语句是根据ID查询。

这个是OrderMapper.xml配置文件中的。我们就正常的查询order表的数据,但是返回类型大家看好是包装类的。

resultMap中写了order的字段和对应的UserMapper.xml的sql语句。

user_id是order表中的字段,与user表中的id关联

红线框住的地方是懒加载最核心的地方。(当然这就是懒加载的写法,但是懒加载需要配置,我们写到这就是为了让大家看到没有懒加载的效果,和加上懒加载的效果)

这个是我的测试类,我们来打印一下查询执行了几条sql语句。(这里我们没有要使用user的字段)

 

数据库还是把user的sql语句执行了。 

然后我们在配置文件中加上懒加载的配置。 

 然后我们再看一下效果,

 

 加上了懒加载就只执行了一条sql语句

 原因是,我们没有加上打印,代码中没有输出list中的相关信息,所以就没有继续执行user中sql语句

 也就是你只是需要得到OrdersPojo(包装类)本身对象及其属性信息,并没有想得到user属性。

 

设置积极的懒加载

<!-- 设置积极的懒加载,默认是true -->

<setting name="aggressiveLazyLoading" value="false"/>

如果不设置,当你打印如下 也就是只是获取ordersPojo对象的属性时,那么mybatis也会自动将 该对象的user属性查询出来。

但如果你设置了积极的懒加载模式 ,如果没有使用user对象,则也不会执行sql查询user表

可能大家看起来会有点困难,又不理解的地方明白了可以私信我。

搞明白这个,可是会很省数据库的性能的。

原文地址:https://www.cnblogs.com/buwang/p/9969185.html