框架|Mybatis的一级缓存和二级缓存

【框架|Mybatis的一级缓存和二级缓存】由于在最近的面试中,多次被问到Mybatis的一级缓存和二级缓存,因此在此进行总结,文章中的代码截图和最后的缓存执行顺序图摘抄自B站up主“狂神说”的Mybatis视频讲解,以下附上视频链接:https://www.bilibili.com/video/BV1NE411Q7Nx?p=26
【一】Mybatis的一级缓存和二级缓存

  1. 一级缓存: SqlSession级别,也叫本地缓存,默认开启,只要在同一个SqlSession中,执行相同的查询语句,并且查的是同一个mapper.xml文件,那么会走一级缓存,SqlSession会话关闭的话,一级缓存就失效了
    框架|Mybatis的一级缓存和二级缓存
    文章图片
上面的例子中,由于查询的都是id为1的用户,执行的sql语句也是一模一样的,并且是在同一个SqlSession中执行的,那么会走缓存
框架|Mybatis的一级缓存和二级缓存
文章图片

上面的例子中,第二次查询id为1的用户是不走缓存的,因为增删改操作都会导致缓存失效,即使改的数据跟我们查的数据无关
一级缓存失效的情况:
  • 查询不同的东西(sql语句必须一模一样才会走缓存)
  • 增删改操作
  • 查询不同的Mapper.xml
  • 手动清理缓存(sqlsession.clearCache())
  • SqlSession会话连接关闭
  1. 二级缓存: 由于一级缓存作用域太低了,所以诞生了二级缓存,二级缓存是基于namespace级别的缓存,也就是一个命名空间,或者叫一个mapper.xml文件,对应一个二级缓存;开启二级缓存只需要在对应的mapper.xml文件声明一个 标签
    框架|Mybatis的一级缓存和二级缓存
    文章图片

    上面这个例子应该是不走缓存的,虽然我们开启了二级缓存,但是由于二级缓存的工作机制是:SqlSession关闭时,一级缓存失效,才会将一级缓存中的东西放到二级缓存中,上面的例子由于sqlSession2执行查询的时候,sqlSession还未关闭,所以二级缓存中没有对应的缓存信息
    框架|Mybatis的一级缓存和二级缓存
    文章图片

    如果是这个执行顺序的话,那么就会走缓存了
二级缓存小结: 只要开启了二级缓存,在同一个Mapper.xml文件下就能生效;所有的数据都会先放在一级缓存中,只有当会话提交,或者会话关闭的时候,才会提交到二级缓存中
  1. 缓存的执行顺序
    框架|Mybatis的一级缓存和二级缓存
    文章图片

    推荐阅读