缓存,就是在内存中开辟的一块内存区,暂时的存取数据,提高效率。在mybatis中,将查询到的数据暂时的放到缓存中,这样下次使用时就可以直接使用缓存中的数据,不用再查询数据库。
一级缓存
在mybatis中,一级缓存是默认开启的,它只存在一次sqlsession会话中,会话关闭时,一级缓存也就关闭了,举例说明:
为了方便查看,配置mybatis的日志文件,在控制台打印日志文件
上面方法执行结果:
以及缓存的内容只在当前这个sqlSession中有效,当这个sqlSession会话关闭时,缓存就没有了,也可以通过清空缓存操作来清空缓存:
结果如下:
可以看出,清空缓存后,缓存中没有数据,所以查询了两次数据库,跟上面的作比较的话,就可以发现,上面的第二次查询是查询了缓存中的数据,而下面的因为清空了缓存,所以两次都是查询的数据库。
二级缓存
一级缓存是默认开启的,二级缓存开启需要在mybatis的配置文件中,配置允许二级缓存,同时还要再mapper文件中,开启二级缓存:
在mapper中开启二级缓存:
只需要这样就行了,它采用了默认的配置,也可以进行设置配置:
在之前了解到一级缓存只存在一次会话中,会话结束,缓存就清空了, 二级缓存是面向全局的,每一个mapper文件都对应一个缓存, 它可以被别的会话调用
开启不同的会话,查询结果如下:
可以看出,仍是只查询了一次数据库,第二次虽然不是一次会话,但是二级缓存,可以被不同的会话调用。
需要注意的是:
1.使用二级缓存需要序列化实体,即实体需要实现Serializable,如图:
2.二级缓存是事务性的。这意味着,当 SqlSession 完成并提交时,或是完成并回滚,但没有执行 flflushCache=true 的insert/delete/update 语句时,缓存会获得更新
自定义缓存:
自定义缓存需要在mapper文件的cache标签中添加type,如图:
但是要自己定义一个缓存类同时必须实现cache接口: