参考博客:https://blog.csdn.net/luanlouis/article/details/41280959 https://blog.csdn.net/luanlouis/article/details/41408341
一 一级缓存机制
1 没执行一个sql操作,mybatis会创建一个sqlSession表示一个数据库会话(如果是一个事务里面只会创建一个sqlSession),sqlSession会交由Executor执行sql,返回的结果会被放到Execuor的Cache中,Cache使用HashMap存储。如果下次查询mybatis判断为同一个查询,则直接返回结果。
2 sqlSession的生命周期:每次查询的时候去TransactionSynchronizationManager的ThreadLocal找,如果找不到就创建,也就是说sqlSession的生命周期和线程的生命周期相同
3 如何判断两次查询相同?
(1)对于JDBC而言只需要sql和传入的参数一样即可
(2)对于Cache来说两次相同的查询要4个条件判断:statementId + rowBounds + 传递给JDBC的SQL + 传递给JDBC的参数值
二 二级缓存
1 二级缓存的粒度控制在每一条语句上,在Mapper.xml文件的<select>中配置useCache = "true"
2 Mapper的Cache可以在Mapper中配置<cache>,有3中方式:
(1)mybatis自己的缓存
(2)用户自定义缓存(实现Cache接口)
(3)第三方库继承