MyBatis缓存

1、为什么使用缓存
对于一些我们经常查询的并且不经常改变的数据,如果每次查询都要与数据库进行交互,那么大大降低 了效率,因为我们使用缓存,将一些对结果影响不大且经常查询的数据存放在内存中,从而减少与数据 库的交互来提高效率,这就是缓存的优势。
2、MyBatis缓存的分类:
(1)、一级缓存:同一个 SqlSession 对象, 在参数和 SQL 完全一样的情况下, 只执行一次 SQL 语句 (前提缓存没有过期)
(2)、二级缓存:Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个namespace下 的mapper映射文件内容,多个SqlSession共享。

一、一级缓存
同一个SqlSession 对象, 在参数和 SQL 完全一样的情况下, 只执行一次 SQL 语句(前提缓存 没有过期)
(1)、同一个SqlSession
MyBatis缓存_第1张图片

运行结果为:
MyBatis缓存_第2张图片

在日志和输出中: 第一次查询发送了 SQL 语句, 后返回了结果; 第二次查询没有发送 SQL 语句, 直接从缓存中获取了结果。 第一次的对象和第二次的对象是相同的。
(2)、不同的SqlSession
MyBatis缓存_第3张图片

运行结果为:
MyBatis缓存_第4张图片

两次查询都从数据库中取出了数据。 虽然结果相同, 但是是两个不同的对象。
(3)、清空缓存
刷新缓存是清空这个 SqlSession 的所有缓存, 不单单是某个键。
MyBatis缓存_第5张图片

运行结果为:
MyBatis缓存_第6张图片

两次都发送了 SQL 语句, 同时两个对象不相同。
Mapper.xml配置方式:
在SysUserMapper.xml的selectByCondition方法上添加 flushCache=“true” 属性
MyBatis缓存_第7张图片

一级缓存的总结:
1、同一个 SqlSession 中, Mybatis 会把执行的方法和参数通过算法生成缓存的键值,将键值和结果存放在一个 Map 中,如果后续的键值一样,则直接从 Map 中获取数据;
2、不同的 SqlSession 之间的缓存是相互隔离的;
3、用一个 SqlSession , 可以通过代码或配置在查询前清空缓存;
4、insert、update、delete 语句会清空缓存。

二、二级缓存
二级缓存指的是 mybatis中SqlSessionFactory对象的缓存 ,由同一个SqlSessionFactory对象 创 建的SqlSession共享缓存。
配置步骤:
1、在配置文件 mybatis-conf.xml 中配置,让mybatis支持二级缓存 。
MyBatis缓存_第8张图片

2、在映射配置文件Mapper.xml中 开启支持二级缓存
在这里插入图片描述
MyBatis缓存_第9张图片

3、让当前操作支持二级缓存,在select标签 加上 useCache=“true”
MyBatis缓存_第10张图片

三、缓存使用注意事项
1、由于在更新时会刷新缓存, 因此需要注意使用场合:查询频率很高,更新频率很低时使用,即经常使用 select, 相对较少使用insert, update,delete。
2、缓存是以 namespace 为单位的,不同 namespace 下的操作互不影响。但刷新缓存是刷新整个 namespace 的缓存,也就是你 insert, update,delete 了一个, 则整个缓存都刷新了。
3、最好在 「只有单表操作」 的表的 namespace 使用缓存, 而且对该表的操作都在这个 namespace 中。 否则可能会出现数据不一致的情况。

你可能感兴趣的:(缓存,java,redis,mybatis)