MyBatis延迟加载策略

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)]

总体分析

  1. 主配置文件:通过以下开启全局深度延迟加载

    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>
    
  2. 接口代理实现对orders订单表的全部查询,对user用户表通过orders表传入的userid做关系查询[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MIdifJBp-1630499070777)(MyBatis延迟加载策略.assets/image-20210901200815700.png)]

  3. 编写sql映射文件:order映射文件中采用手动映射,通过resultMap,通过association映射关联对象的属性

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D2V4bAgb-1630499070778)(MyBatis延迟加载策略.assets/image-20210901201157436.png)]

    user映射文件:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zeyU2XsE-1630499070780)(MyBatis延迟加载策略.assets/image-20210901201228121.png)]

  4. 编写测试文件:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XcsIlygW-1630499070781)(MyBatis延迟加载策略.assets/image-20210901201334486.png)]

片转存中…(img-zeyU2XsE-1630499070780)]

  1. 编写测试文件:[外链图片转存中…(img-XcsIlygW-1630499070781)]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值