Mybatis提供了两种缓存,它们分别为:一级缓存和二级缓存。 - 一级缓存:指的是SqlSession对象级别的缓存。当我们执行查询后,查询的结果会同时存入到SqlSession为我们提供的一块区域中,该区域的结构是一个HashMap,**不同的SqlSession的缓存区域是互相不受影响的**。当我们再次查询同样的数据,Mybatis会先去SqlSession的缓存区域中查询是否有,有的话直接拿出来用,没有则去数据库查询。当SqlSession对象消失后(被flush或close),Mybatis的一级缓存也就消失了。(一级缓存默认是启动的,而且是一直存在的) - 二级缓存:指的是Mapper对象(Namspace)级别的缓存(也可以说是SqlSessionFactory对象级别的缓存,由同一个SqlSessionFactory对象创建的SqlSession共享其缓存)。多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。(二级缓存Mybatis默认是关闭的,需要自己去手动配置开启或可以自己选择用哪个厂家的缓存来作为二级缓存) # 一级缓存 一级缓存是SqlSession对象级别的缓存,Mybatis会在SqlSession内部维护一个HashMap用于存储,缓存Key为hashcode+sqlid+sql,value则为查询的结果集,当执行查询时会先从缓存区域查找,如果存在则直接返回数据,否则从数据库查询,并将结果集写入缓存区。 ## 一级缓存的清空 以下的两个操作会导致一级缓存的清空: 1. 执行了insert、update、delete的sql语句,又或者只执行了commit操作,都会导致一级缓存失效。 添加、修改,删除操作不管有没有成功,只要你执行了增删改的SQL,缓存都会清空,即使没有通过commit方法提交,而二级缓存必须通过commit方法提交,才能清空缓存,因为二级缓存必须要在sqlSession关闭或者提交(commit)才能生效。 ![[1745215-20201120153019722-1747791924.png]] 2. 手动清空,通过sqlSession.clearCache ## 一级缓存的问题 必须通过sqlSession进行更新,如果手动执行sql的话,mybatis无法感知,因此一般没人用mybatis缓存。