延迟加载实现流程

一:概念
    即用到数据的时候才加载数据,不用的时候就不加载.即按需加载,也称懒加载
二:使用
    一般在一对多或者多对多的时候使用延迟加载,因为如果我们只需要查询部分信息,那么查询出来后面的关联表的内容,是非常影响内存的.
三:优点
    先只查询部分内容,需要的时候再去关联表查关联的内容,这样可以提高数据库的性能,因为单表查询的速度还是比多表查询要快得多

四:我们以一对多(用户表user对账户表account)为例.设置步骤如下:

  1. 首先在mybatis的主配置文件SqlMapConfig中,进行全局配置在这里插入图片描述

    2 .编写完UserDao接口的findAll方法,在UserDao.xml中,原collection标签下原封装Account的内容全部删除,在collection标签里面添加以下属性:
        (1) property:User实体类中成员变量位置处的Account的集合引用
        (2) oftype:Account封装为Account对象
        (3) column:使用延迟加载必须填写的一项内容,这个column表示我们查询了user表之后,获取的User表的id信息(即和关联表Account关联的键),这个id也将作为AccountDao中findById方法的参数传入使用
        (4) select:指定关联表中按照id查询的方法的全路径,在我们需要用到关联表的数据的时候,依赖此属性去找到关联表的那个执行方法在这里插入图片描述

    3:设置完成之后,UserDao.xml文件中的查询所有的标签里面的sql语句就需要改为select * from user,用来获取所有的user表中的数据,而在上面配置的时候我们已经把查询的user表的id设置为参数传到AccountDao.xml的方法中
在这里插入图片描述
    4.在AccountDao接口中定义一个方法findById(int id),这个id就是在需要查询关联表的时候,从UserDao那个column属性传递过来的.
5.在AccountDao.xml文件的select标签中,对findById方法做如下映射
在这里插入图片描述
    以上,我们在测试时候调用UserDao的findAll方法
在这里插入图片描述
    如上图所示,我们打印所有的user信息,获取的结果是只有user信息,而不包含关联表的account信息,即实现了延迟加载.且只执行了查询user的sql语句,结果如下:
在这里插入图片描述
    而当我们在打印的时候要获取user.getAccountList()的时候,说明我们需要去查询关联表的内容,按如下查询
在这里插入图片描述
则显示的结果是:
在这里插入图片描述
    我们可以看到,执行的sql也拼接上了后面的where的条件,即实现了查询关联表的动作
除了上述方法之外,还有一种配置方式:

  1. 在mybatis的主配置文件中配置如下
    在这里插入图片描述
  2. 然后在UserDao.xml中的collection标签中添加属性fetchType
    在这里插入图片描述
  3. 其他配置同上一个方法,也可实现延迟加载的特性

    归纳:使用延迟加载,可以实现在查询的时候只查询主表,不查询关联表,如果要查关联表的信息,那我们在测试方法中需要使用java代码触发查询,通过主表的xml文件里面的collection标签的select属性去找到关联表接口中的findById方法,然后执行.
    延迟加载的思想:在使用的时候调用关联表配置文件中的一个配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值