缓存
声明:本文章属于学习笔记,根据狂神说的Mybatis编写
Mybatis在线文档:https://mybatis.org/mybatis-3/zh/index.html
一丶缓存介绍
我们都挺说过缓存,但是什么是缓存呢?
其实这个事情很好理解,我几个简单的例子:
假如我们在数据库中的查询一些数据,我们会使用sql语句,这时一次的查询结果就会就将他暂存到一个可以直接取到的地方。当我们查询的时候我们就会奔着缓存去,而不是去再次连接数据库。
2丶一级缓存
首先我们要看这样的一段代码:
接口:
UserMapper.xml文件:
<mapper namespace="com.kdy.dao.UserMapper">
<select id="queryById" resultType="com.kdy.pojo.User" parameterType="int">
select *
from user where id=#{id};
</select>
</mapper>
测试类测试:
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user1 = mapper.queryById(1);
System.out.println(user1);
System.out.println("==========");
User user2 = mapper.queryById(1);
System.out.println(user2);
System.out.println(user1==user2);
}
运行结果:
我们可以看到返回值为true,为什么返回的是true?因为我们的数据库连接还有一次,当我们再次查询的时候缓存还存在。这两个sql的地址引用是一个。
我们在中间加上更新的语句:
运行结果:
所以说当我们刷新的时候,缓存就是失效的。
二丶二级缓存
首先我们要配置UserMapper.XML文件:
我们先看着这样的一组测试:
当我们没有关闭资源的时候,我们可以看到:
很明显这是走了两次数据库,因为他并没有关闭资源,并没有满足二级缓存机制。
当我们查询完就关闭的时候:
运行结果:
很明显是一次数据库连接,对象只有一个,这也恰恰说明当我们创建数据库连接的时候,就开始了一级缓存,但是当我们关闭当前会话的资源后,就会将一级缓存给 < cache > ,所以还是一次数据库的连接。
三丶Mybatis缓存的原理:
其实就是一句话的原理:先看二级缓存中有没有,有就返回,没有就找一级缓存,再看一级缓存,有就返回,没有就找数据库。