MyBatis延迟加载策略
需求和问题
当需求是查询多个表中的数据字段时,解决办法暂时是我们学的只有关联查询,或者多表连接查询,实质是对一张表的查询,对由多个表连接后形成的一张表的查询。会一次性将多张表的所有信息查询出来,这样实际是将多张表变成一张表然后再继续查询,效率很低,于是出现了延迟加载。
背景:有两张表,一张是订单表,一张是用户表,订单和用户一对一的关系,一个订单只对应一个用户,
订单表:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JZnrJRPC-1630499070762)(MyBatis延迟加载策略.assets/orderanduser-1630467955138.png)]
什么是延迟加载
1.延迟延迟加载,也称为懒加载,是指在进行表的关联查询时,设置延迟规则推迟对关联对象的select查询。
2.例子:例如在进行一对一或者一对多查询的时候,只查询出一方,当程序中需要多方的数据时,mybatis再发出sql语句进行查询,这样子延迟加载就可以的减少数据库压力。MyBatis 的延迟加载只是对关联对象的查询有迟延设置,对于主加载对象都是直接执行查询语句的。
3.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PoHOObFt-1630499070764)(MyBatis延迟加载策略.assets/orderanduser.png)]
与单例模式懒汉式思想相近
如果还是不够理解的话,可以和单例模式相结合
懒汉式:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KEKGxaeV-1630499070765)(MyBatis延迟加载策略.assets/lazySingle.png)]
延迟加载的分类
- 直接加载:执行完主对象后,一定直接执行关联对象
- 侵入式加载:在执行对象主对象详情的时候,则执行关联对象
- 深度延迟加载:执行完主对象或者主对象详情不会执行关联对象,只有用到了关联对象的时候才会走深度延迟加载
我们现在只具体讲深度延迟加载
主对象:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EpgB02eQ-1630499070768)(MyBatis延迟加载策略.assets/image-20210901114146490.png)]
关联对象:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7q49bzrK-1630499070772)(MyBatis延迟加载策略.assets/image-20210901114224529.png)]
实现延迟加载方法
主配置文件中添加以下,实现深度延迟加载
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
sql映射文件文件中通过在association内标签使用
select="com.yiyiping.dao.UserDao.findById"
column="userid"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cv0d8AJN-1630499070773)(MyBatis延迟加载策略.assets/image-20210901114146490.png)]
和连接查询不同的是:当表和表之间是一对一关系时,多了fetchType属性和select属性,还有column属性,并且select标签中的sql语句只涉及单表
代码演示
当只涉及主表数据的查询时:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qGnTu8Wm-1630499070774)(MyBatis延迟加载策略.assets/image-20210901195944661.png)]
当涉及主表和关联表时:
演示一:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0nwoFCoM-1630499070775)(MyBatis延迟加载策略.assets/image-20210901200116808.png)]
演示二:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1G9EnmZI-1630499070776)(MyBatis延迟加载策略.assets/image-20210901200304601.png)]
总体分析
-
主配置文件:通过以下开启全局深度延迟加载
<settings> <setting name="lazyLoadingEnabled" value="true"/> </settings>
-
接口代理实现对orders订单表的全部查询,对user用户表通过orders表传入的userid做关系查询[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MIdifJBp-1630499070777)(MyBatis延迟加载策略.assets/image-20210901200815700.png)]
-
编写sql映射文件:order映射文件中采用手动映射,通过resultMap,通过association映射关联对象的属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D2V4bAgb-1630499070778)(MyBatis延迟加载策略.assets/image-20210901201157436.png)]
user映射文件:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zeyU2XsE-1630499070780)(MyBatis延迟加载策略.assets/image-20210901201228121.png)]
-
编写测试文件:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XcsIlygW-1630499070781)(MyBatis延迟加载策略.assets/image-20210901201334486.png)]
片转存中…(img-zeyU2XsE-1630499070780)]
- 编写测试文件:[外链图片转存中…(img-XcsIlygW-1630499070781)]