下载本博客源代码文件
提起码:4ym5
延迟加载
数据表存在四中对应关系:
- 一对多:一个用户拥有多个账户
- 多对一:多个账户属于一个用户
- 一对一:每个用户对应一个身份证号
- 多对多:一个用户可以有多个社会身份,一个社会身份可以赋予多个用户
在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 = ? 两条语句。