简介
- 通过前面的学习,我们已经掌握了Mybatis中一对一,一对多,多对多关系的配置及实现,可以实现对象的
关联查询。实际开发过程中很多时候我们并不需要总是在加载用户信息时就一定要加载他的账户信息。此时就是我们所说的延迟加载。
延迟加载
- 延迟加载(懒加载)就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。
- 优点
- 先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张速度要快。
- 坏处
- 因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。
- 优点
目录结构
- src
- main
- java
- cn.water.dao
- AccountDao.java(持久层接口)
- UserDao.java(持久层接口)
- cn.water.domain
- Account.java(实体类)
- User.java(实体类)
- cn.water.dao
- resources
- cn.water.dao
- AccountDao.xml(映射配置文件)
- UserDao.xml(映射配置文件)
- SqlMapConfig.xml(MyBatis主配置文件)
- jdbcConfig.properties(数据库连接信息文件)
- cn.water.dao
- java
- test
- java.cn.water
- MybatisTest.java(测试类)
- java.cn.water
- main
MyBatis主配置文件
SqlMapConfig.xml
1 |
|
数据库连接信息文件
jdbcConfig.properties
1 | jdbc.driver=com.mysql.jdbc.Driver |
实体类
Account.java
1 | package cn.water.domain; |
User.java
1 | package cn.water.domain; |
持久层接口
AccountDao.java
1 | package cn.water.dao; |
UserDao.java
1 | package cn.water.dao; |
映射配置文件
AccountDao.xml
1 |
|
UserDao.xml
1 |
|
测试类
MyBatisTest.java
1 | package cn.water; |
一对一查询(延迟)
- 一对一查询:从查询 账户信息(Account) 出发,关联查询 用户信息(User)
- 立即加载:一次多表查询
- SELECT u.*,a.* FROM user u,account a WHERE u.id = a.uid;
- 延迟加载:多次单表查询(提供关联信息)
- SELECT * FROM account;(获取uid)
- SELECT * FROM user WHERE id = #{uid}; (提供uid)
- 立即加载:一次多表查询
Account 实体类
- 将 用户类(User)设置为变量
1 | public class Account implements Serializable { |
User 实体类
1 | public class User implements Serializable { |
Account 持久层接口
1 | /* 一对一查询 */ |
User 持久层接口
- 返回值 对应 Account类的User变量
1 | /* 一对一查询 */ |
Account 映射配置文件
1 | <!-- 【次表:Account】 --> |
User 映射配置文件
1 | <!-- 单表查询 --> |
测试类
1 |
|
运行结果
![](10.延迟加载\延迟加载 一对一查询 控制台输出.png)
一对多查询(延迟)
- 一对多查询:从查询 用户信息(User) 出发,关联查询 账户信息(Account)
- 立即加载:一次多表查询
- SELECT * FROM user u LEFT OUTER JOIN account a ON u.id = a.uid;
- 延迟加载:多次单表查询(通过关联信息)
- SELECT * FROM user;(获取id)
- SELECT * FROM account WHERE uid = #{id}(提供id)
- 立即加载:一次多表查询
User 实体类
- 将 账户类(Account) 的List集合 设置为变量
1 | public class User implements Serializable { |
Account 实体类
1 | public class Account implements Serializable { |
User 持久层接口
1 | /* 一对多查询 */ |
Account 持久层接口
- 返回值 对应 User类的List<Account>变量
1 | /* 一对多查询 */ |
User 映射配置文件
1 | <!-- 【主表:User】 --> |
Account 映射配置文件
1 | <!-- 单表查询 --> |
测试类
1 |
|
运行结果
![](10.延迟加载\延迟加载 一对多查询 控制台输出.png)