Mybatis延迟加载, 一级缓存、二级缓存
延迟加载
概念:MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟规则推迟对关联对象的select查询。延迟加载可以有效的减少数据库压力。
(注意:MyBatis的延迟加载只是对关联对象的查询有延迟设置,对于主加载对象都是直接执行查询语句的。)
加载时机
直接加载:执行完对主加载对象的select语句,马上执行对关联对象的select查询。
侵入式延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情时,就会马上执行关联对象的select查询。即对关联对象的查询执行,侵入到了主加载对象的详情访问中。也可以这样理解:将关联对象的详情侵入到了主加载对象的详情中,即将关联对象的详情作为主加载对象的详情的一部分出现了。
深度加载:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的select查询。
侵入式延迟加载配置方法:
修改主配置文件的,将延迟加载开关lazyLoadingEnabled开启(置为true),将侵入式延迟加载开关aggressiveLazyLoading也开启(置为true,默认为true)。 <setting name="lazyLoadingEnabled" value="true"/> <!--配置侵入式延迟加载 默认为false 侵入式:默认只会执行主加载SQL,那么当访问主加载对象的详细信息时才会执行关联对象的SQL查询 深度延迟:默认只执行主加载SQL,那么当调用到主加载对象中关联对象的信息时才会执行关联对象的SQL查询 --> <setting name="aggressivelazyLoading" value="true"/>
深度延迟加载:
修改主配置文件的,将延迟加载开关lazyLoadingEnabled开启(置为true),将侵入式延迟加载开关aggressiveLazyLoading关闭(置为false)。 <setting name="lazyLoadingEnabled" value="true"/> <!--配置侵入式延迟加载 默认为false 侵入式:默认只会执行主加载SQL,那么当访问主加载对象的详细信息时才会执行关联对象的SQL查询 深度延迟:默认只执行主加载SQL,那么当调用到主加载对象中关联对象的信息时才会执行关联对象的SQL查询 --> <setting name="aggressivelazyLoading" value="false"/>
(注意:该延迟策略也是一种延迟加载,需要在延迟加载开关lazyLoadingEnabled开启时才会起作用。若lazyLoadingEnabled为false,则aggressiveLazyLoading无论取何值,均不起作用。)
一级缓存
结论:
Mybatis框架天然集成一级缓存
一级缓存查询依据为SQLID+SQL语句
增删改会清空一级缓存
二级缓存
配置二级缓存
增删改对二级缓存的影响
增删改同样会清空二级缓存
结论:
二 级缓存不比一级缓存,要在configuration.xml中手动开启。
二级缓存是全局应用级别的缓存,即使关闭了session 仍能使用。
如果一个select标签想要局部关闭二级缓存, 需要设置useCache=false
二级缓存不能使用注解方法配置
如果在执行增删改操作的过程中不刷新缓存, 须设置flushCache=false
着重点