延迟加载,可能对于大家来说是一个很陌生的东西,今天我们就来整理一下关于延迟加载的知识点。
那延迟加载到底什么是个什么东西,怎么用呢:
延迟加载 (懒加载) ,就是说在关联查询的时候,利用延迟加载,先加载主信息,需要关联信息时再去按需加载关联信息。
这样会大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
在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表
可能大家看起来会有点困难,又不理解的地方明白了可以私信我。
搞明白这个,可是会很省数据库的性能的。