[Mybatis 注解开发] (三)延迟加载与多表查询

下载本博客源代码文件
提起码:4ym5

延迟加载

数据表存在四中对应关系:

  1. 一对多:一个用户拥有多个账户
  2. 多对一:多个账户属于一个用户
  3. 一对一:每个用户对应一个身份证号
  4. 多对多:一个用户可以有多个社会身份,一个社会身份可以赋予多个用户

在mybatis中,多对一和一对一是一样的,因为如果将每个账户(按时间)细分的话,每个特定账户对应一个用户。
在mybatis中,四种关系可以被分为两类来处理:x对一 和 x对多。


什么是延迟加载呢?
问题:
1: 在x对多中,当我们有一个用户,它有1000个账户。在查询用户的时候,要不要把关联的账户查出来?如果查出来每次会耗时和耗内存,也不一定会使用。但是不查出来,当需要使用的时候如何处理呢?
2: 在x对1中,在查询账户的时候,要不要把关联的用户查出来?

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

什么是立即加载
不管用不用,只要一调用方法,马上发起查询。

回答:
一对多,多对多:通常情况下我们都是采用延迟加载。
多对一,一对一:通常情况下我们都是采用立即加载。

实现多表查询并使用延迟加载

查询所有账户,并获取账户所属的用户信息

1:在domain中创建Account类,加入账户的账户id,所属用户id和余额属性。
并在账户类中加入一个账户所属的用户user对象,体现他们的关系。
生成属性的get and set方法和toString方法。
在这里插入图片描述
2:在dao中创建IAccountDao接口,并添加账户的findAll方法。
在下图Results注解中,红色区域的Result注解是配置账户类属性和账户表列名的对应关系。
蓝色区域配置账户的所属用户信息:
property = “user” : 表示配置账户的所属用户信息。
column = “uid” :表示在进行后续查询时,使用的参数数据是账户表中的uid信息。
one=@One() : 表示后续查询的对应关系是x对一的关系。
@One中的select = “com.itheima.dao.IUserDao.findUserById”:指定后续查询使用的方法的具体位置。这里我们将账户表查到的所属用户uid信息传入用户类中的findUserById方法中进行后续的查询。
@One中的fetchType = FetchType.EAGER:表示加载方式为立即加载。
注意:sql语句为 select * from user
在这里插入图片描述
3:编写AccountTest测试类,进行测试
在这里插入图片描述
4:运行结果
在这里插入图片描述

查询所有用户,并显示用户拥有的所有账户信息,延迟加载(使用时才加载)

1:在User类中添加一个Account集合,并生成对应的get and set方法。
在这里插入图片描述
2:在IAccountDao中添加根据用户id查询账户信息的功能函数
在这里插入图片描述
3:在IUserDao接口中配置findAll方法的Results注解。
在下图Results注解中,红色区域的Result注解是配置用户类属性和用户表列名的对应关系。
蓝色区域配置用户的拥有的账户集合信息:
property = “accounts” : 表示配置用户拥有的账户集合信息。
column = “id” :表示在进行后续查询时,使用的参数数据是用户表中的id信息,去账户表中查询对应的账户信息。
one=@Many() : 表示后续查询的对应关系是x对多的关系。
@Many中的select = “com.itheima.dao.com.itheima.dao.IAccountDao.findAccountByUid”:指定后续查询使用的方法的具体位置。这里我们将用户表查到的所属用户id信息传入账户类中的findAccountByUid方法中进行后续的查询。
@Many中的fetchType = FetchType.LAZY:表示加载方式为延迟加载,在使用到账户信息时才加载。
注意:sql语句为 select * from user
在这里插入图片描述
4:测试延迟加载,即当我们值查询用户信息,不使用账户信息时。
在这里插入图片描述
结果只执行了 select * from user 这条语句
在这里插入图片描述
当我们同时需要打印账户信息时:
在这里插入图片描述
执行了 select * from user 和 select * from account where uid = ? 两条语句。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值