在B站学习Mybatis框架时关于一级缓存和二级缓存的个人理解与总结
为什么要用缓存?
比如我们想要查询数据库的某表,第一次调用之后,如果有缓存的话,第二次想再次使用该结果集时就不用再做连接数据库等一系列操作,可以从缓存中直接拿来用
一级缓存:
它指的是Mybatis中SqlSession对象的缓存。
当我们执行查询之后,查询结果会同时存入到SqlSession为我们提供一块区域中。
该区域的结构是一个Map。当我们再次查询同样的数据,mybatis会先去sqlsession中查询是否有,有的话直接拿来用。
当SqlSession对象消失的时候,mybatis的一级缓存也就消失了。
当我们用同一个SqlSession创建用户对象时
执行结果为true,这就体现了Mybatis中的一级缓存。
如:
调用close()方法:
清空缓存sqlSession.clearCache();
调用更新方法:
以上过程的结果都为false
二级缓存:
它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
sqlsession1,2,3共享缓存内容。
但当我们用同一个SqlSessionFactory创建的两个sqlsession对象执行时
发现结果为false
原因是此时还没二级缓存的概念,二级缓存没使用
二级缓存的使用步骤:
第一步:让Mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)
第二步:让当前的映射文件支持二级缓存(例:在IUserDao.xml中配置)
第三步:让当前的操作支持二级缓存(例:在select标签中配置)
一、
二、三
配置完之后我们再次执行发现,与第一次不同的是第二次是从缓存中获取:
但是结果仍为false:
原因为:存的是如黑色区域的数据,当第一次使用后该数据不变,第二次使用时会创建一个新的用户对象,并把数据存放到新的用户对象里面去,因为会创建一个新的用户对象,所以地址就不是同一个了。如下图所示