Mybatis 中的延迟加载

您所在的位置:网站首页 延迟的意思是指什么 Mybatis 中的延迟加载

Mybatis 中的延迟加载

2024-07-14 13:22| 来源: 网络整理| 查看: 265

1、问题提出

在之前的文章一对多中,当我们有一个用户,他又一百个账户。 (1)在查询用户时,要不要把关联的账户信息查询出来? (2)在查询账户时,要不要把关联的用户信息查询出来?

对于第一个问题,我们应该是什么时候需要查询账户信息,才查询。没必要每次查询用户信息都把账户信息也查询出来。因为如果每次都查询出账户信息,对我们的内存开销是很大的,而且每次查询也都不一定用到账户信息。对于第二个问题,我们就可以在查询账户信息的时候查询出关联的用户信息,因为我们如果只是单纯的账户信息没有说明用户是谁,这对于我们来说是不友好的。也没什么意义,所以在每次查询账户信息的时候都要显示出关联的用户信息。 2、延迟加载和立即加载

第一个问题其实就是延迟加载。 第二个问题就是立即加载。

延迟加载

在真正的使用数据时才发起查询,不用的时候不查。按需加载(懒加载)。

立即加载

不管用不用,只要一调用方法,马上发起查询。

3、四种对应的表关系中的加载 四种表 关系:一对一,一对多,多对一,多对多。一对多、多对多:通常情况下,我们都是采用延迟加载。多对一、一对一:通常情况下,我们都是采用立即加载。 4、实现一对一的延迟加载

这里的项目结构和https://blog.csdn.net/weixin_44588495/article/details/91556447里面的大部分内容是一样的,我们只需要更改一些配置信息。

更改IAccountDao.xml的配置信息 这里将association标签中的内容全部删除,添加了一个select属性,select属性指向的是IUserDao接口的findById方法,也就是说执行这个sql语句后,就会执行findById这个方法,其中入口参数就是column中的uid这个值。 select * from account 更改SqlMapConfig.xml中的信息 在这里添加两条setting标签配置信息。根据mybatis的文档 http://www.mybatis.org/mybatis-3/zh/configuration.html#settings 需要设置这两个属性。才能开启延迟加载。 在这里插入图片描述 运行结果

未调用获取账户信息的方法。

在MybatisAccountTest中调用 public void testFindAll() throws Exception{ List accounts = accountDao.findAll(); for (Account a:accounts){ System.out.println("-----------------------"); System.out.println(a ); } }

在这里插入图片描述 调用获取信息的方法

在MybatisAccountTest中调用 public void testFindAll() throws Exception{ List accounts = accountDao.findAll(); for (Account a:accounts){ System.out.println("-----------------------"); System.out.println(a ); System.out.println(a.getUser()); } }

在这里插入图片描述

5、实现一对多的延迟加载

这里的项目结构和https://blog.csdn.net/weixin_44588495/article/details/91556447里面的大部分内容是一样的,我们只需要更改一些配置信息。这里面的道理和一对一是一样的。只不过改的是collection标签内的属性。

更改IUserDao.xml select * from users select * from users where id = #{uid}

IAccountDao接口:这里多增加了一个findAccountByUid方法

package com.mybatis.dao; import com.mybatis.domain.Account; import java.util.List; public interface IAccountDao { /** * 查询所有的Account * @return */ List findAll(); List findAccountByUid(Integer uid); }

IAccountDao.xml中需要增加一条方法配置信息

select * from account where uid = #{uid}

SqMapConfig.xml文件和一对一是一样的。

运行结果:

未调用获取账户信息的方法。

在MybatisTest中调用 public void testFindAll() throws Exception{ List users = userDao.findAll(); for (User user:users){ System.out.println("--------------------------------------"); System.out.println(user); } }

在这里插入图片描述 调用获取信息的方法

在MybatisTest中调用 public void testFindAll() throws Exception{ List users = userDao.findAll(); for (User user:users){ System.out.println("--------------------------------------"); System.out.println(user); System.out.println(user.getAccounts()); } }

在这里插入图片描述 这样就起到了该调用的时候调用,不用浪费多余的内存空间。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3