延迟加载和缓存(终极)
延迟:
MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询的时候
按照设置延迟加载规则推迟对关联对象的select检索
延迟加载可以有效的减少数据库 的压力。
MyBatis的延迟加载只是对关联对象的查询有延迟设置,对于主加载对象都是直接执行查询语句的(两条select语句)
注意:
延迟加载的应用要求:关联对象的查询与主加载对象的查询必须是分别进行的select语句,不能是使用多表连接所进行的select查询
三种延迟:
直接加载:即执行对象的select语句,完成对主加载马上执行对关联对象的select查询
侵入式延迟加载:执行对主加载对象查询时,不会执行关联对象的查询,若访问主加载对象详情时立即执行关联对象的查询
深度式延迟加载:执行对主加载对象查询时,不会执行关联对象的查询,若访问关联对象详情时立即执行关联对象的查询
侵入式延迟加载案例:
深度式延迟加载案例
缓存:
好处:
使用缓存可以使应用更快地获取数据,避免和数据库的频繁地交互
尤其是在查询越多、缓存命中率越高的情况下,使用缓存的作用也就越明显。
MyBatis查询缓存机制:
根据缓存区的作用域与生命周期,可划分两种
一级缓存
二级缓存
MyBatis缓存的作用域
根据映射文件的namespace去划分的,相同的namespace的mapper查询放在同一个缓存区域。不同的namespace下的数据互不干扰。
生命周期:
但是SqlSession对象一旦关闭,SqlSession对象就不存在了,即一级缓存就不存在了
二级缓存的生命周期与整个应用同步
一级缓存测试:
增删改对一级缓存的影响
总结:
一级缓存在增删改的情况下,无论是否提交事务,都会重新发送SQL,并清除缓存
一级缓存真实存在,无需配置
一级缓存的依据是SQLid+SQL语句
二级缓存测试:
.xml文件
entity
增删改对一级缓存的影响
总结:
二级缓存需要手动开启
二级缓存即使关闭了SqlSession也能使用
如果一个select标签想要局部关闭二级缓存,需要设置useCache=false
如果在执行增删改操作的过程中不刷新缓存,须设置flushCache=false