MyBatis 是dao层的框架
缓存是为了提高查询效率
每次查询会先从缓存区域找,如果找不到从数据库查询,查询到数据将数据写入缓存。
Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句,value为从查询出来映射生成的java对象。
一级缓存
作用域是同一个SqlSession
线程安全的 默认开启 无法关闭
Mybatis 执行增删改会先清空缓存。这样做的目的为了让缓存中存储的是最新的信息,避免脏读。
脏读:缓存数据与数据库数据不一致 所以mybatis先清缓存 再查询数据库中的信息。
一级缓存在一个sqlSession会话里面的所有查询操作都会保存到缓存中
二级缓存
作用域是mapper的同一个namespace
基于sqlSessionFactory的缓存 全局共享
开启二级缓存
在实际开发中使用第三方缓存组件 Ehchache Redis
1.在核心配置文件mybatis-config.xml中加入
<setting name="cacheEnabled" value="true"/>
2.只有某个mapper文件开启二级缓存
<cache />
3. 实体类要实现序列化
二级缓存需要查询结果映射的pojo对象实现java.io.Serializable接口实现序列化和反序列化操作.
public class User implements Serializable
禁用二级缓存
在statement中设置useCache=false
面试题简答:说一下Mybatis的一级缓存和二级缓存
关键点:
1. 一级缓存是session级别的缓存,默认开启,当查询一次数据库时,对查询结果进行缓存,如果之后的查询在一级缓存中存在,则无需再访问数据库;
2. 二级缓存是sessionFactory级别的缓存,需要配置才会开启。当进行sql语句查询时,先查看二级缓存,如果不存在,访问一级缓存,降低数据库访问压力。