存在联表查询中;联表查询必须是多表单独查询
概念:将查询的时机推迟
单表查询:不存在延迟查询
联表查询:
多表一次查询:不存在延迟查询
多表单独查询:会执行多条sql语句,才会存在延迟查询。
目的:只立马执行需要的数据的sql语句
比如:用户和地址数据
两条sql语句
select * from tuser where id = ? 需要立马执行的
select * from taddress where aid = ? 可以延迟执行,在获取用户的地址的时候才执行
好处:减小数据库的压力
Mybatis的延迟加载方式:
直接加载
执行完主对象的sql语句之后,立马执行关联对象的sql语句
配置
配置Mybatis的主配置文件:
主配置文件中在proerties标签和typeAliaes标签之间可以配置settings的标签,用来配置全局配置的。
开启延迟加载的属性:
lazyLoadingEnabled:全局性设置懒加载。如果设为‘false’,则所有相关联的sql都会立即执行。默认为false
aggressiveLazyLoading:当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。默认为true
侵入式延迟加载
执行完主对象的sql语句之后,不会立即执行关联对象的sql语句,当访问主对象中的数据时才会执行关联对象的sql语句。
User{id,name,money,birthday,Address address}
User u = userDao.listById(11);
u.getId()的时候立马执行关联sql语句的查询,查询address的数据
配置
运行结果
当没有取获取主对象的属性的值的时候,关联对象的sql语句不执行
当调用对象的属性的值的时候,才执行关联对象的sql语句
深度延迟加载
User{id,name,money,birthday,Address address}
User u = userDao.listById(11);
u.getId()
当执行u.getId()的时候还是不会执行关联对象的sql语句
当执行u.getAddress() ()当获取关联对象里面数据的时候才执行关联对象的sql语句
配置
运行结果
总结
直接加载:
lazyLoadingEnabled:false
aggressiveLazyLoading:false
侵入式延迟加载:
lazyLoadingEnabled:true
aggressiveLazyLoading:true
深度延迟加载
lazyLoadingEnabled:true
aggressiveLazyLoading:false