我们都知道,mybatis有一级缓存(自动)和二级缓存(需要手动配置),一级缓存在BaseExecutor中默认实现,那在哪些场景中我们的一级缓存才会命中呢,大致分为如下几点:
- sql参数是相同的(参数不一样不走缓存)
- 必须是相同的statementId,也就是sql语句的id要一样(语句不一样不走缓存,本来也不是同个东西)
- sqlSession必须一样,也就是要在相同的会话内。(如果新产生了个会话则缓存失效)
- rowBounds 分页返回的范围必须相同(分页条件不一致导致结果集不一致所以不走缓存)
- 没有进行手动清空缓存(没有手动调用session.clearCache()方法情况缓存)
- 没有调用加了注解flushCache=true的查询方法(在mapper方法中没有加上@Options(flushCache =
Options.FlushCachePolicy.TRUE) - 没有执行update语句方法(在会话内每执行一次update的操作,都会去刷新缓存,避免数据不一致)
- 缓存的作用域不是STATEMENT(可在配置文件中setting配置localCacheScope=STATEMENT),如果配置成了STATEMENT,缓存只会在改statement里面的嵌套查询中生效