一:概念
即用到数据的时候才加载数据,不用的时候就不加载.即按需加载,也称懒加载
二:使用
一般在一对多或者多对多的时候使用延迟加载,因为如果我们只需要查询部分信息,那么查询出来后面的关联表的内容,是非常影响内存的.
三:优点
先只查询部分内容,需要的时候再去关联表查关联的内容,这样可以提高数据库的性能,因为单表查询的速度还是比多表查询要快得多
四:我们以一对多(用户表user对账户表account)为例.设置步骤如下:
- 首先在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的条件,即实现了查询关联表的动作
除了上述方法之外,还有一种配置方式:
- 在mybatis的主配置文件中配置如下
- 然后在UserDao.xml中的collection标签中添加属性fetchType
- 其他配置同上一个方法,也可实现延迟加载的特性
归纳:使用延迟加载,可以实现在查询的时候只查询主表,不查询关联表,如果要查关联表的信息,那我们在测试方法中需要使用java代码触发查询,通过主表的xml文件里面的collection标签的select属性去找到关联表接口中的findById方法,然后执行.
延迟加载的思想:在使用的时候调用关联表配置文件中的一个配置