一、什么是缓存
存在于内存中的临时数据
二、Mybatis 中的缓存的优点
通过缓存策略来减少数据库的查询次数,从而提高性能。Mybatis 中缓存分为一级缓存、二级缓存
三、缓存的适用情况
1.适用:
- 经常查询且不经常改变的数据
- 数据的正确与否对最终结果影响不大的数据
2.不适用:
- 经常改变的数据
- 关键结果严重依赖缓存准确性的数据
四、一级缓存
一级缓存是 SqlSession 级别的缓存,只要 SqlSession 没有 flush 或 close,它就存在
User user1 = userDao.findById(1);
User user2 = userDao.findById(1);
System.out.println(user1);
System.out.println(user2);
System.out.println(user1 == user2); ===> true
程序说明mybatis 运用了缓存技术
User user1 = userDao.findById(1);
System.out.println(user1);
// 清空缓存方法一
sqlSession.close();
// 清空缓存方法二
sqlSession = factory.openSession();
// 清空缓存方法三
sqlSession.clearCache();
// 执行数据库的更新语句
update ......
注意:
一级缓存是 SqlSession 范围的缓存,当调用 SqlSession 的修改,添加,删除, commit(), close()等方法时,就会清空一级缓存
User user2 = userDao.findById(1);
System.out.println(user2);
System.out.println(user1 == user2); ===> false
五、二级缓存
1.定义
二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的
2.本质
二级缓存指的是 Mvbatis中sqlSessionFactorv对象的缓存。由同一个 SqlSessionFactory对象创建的 Sqlsession共享其缓存
3.适用二级缓存的步骤
第一步:在 SqlMapConfig.xml 文件开启二级缓存
<settings>
<!-- 开启二级缓存的支持 -->
<setting name="cacheEnabled" value="true"/>
</settings>
第二步:配置相关的 Mapper 映射文件
<cache>标签表示当前这个 mapper 映射将使用二级缓存,区分的标准就看 mapper 的 namespace 值。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.dao.IUserDao">
<!-- 开启二级缓存的支持 -->
<cache></cache>
</mapper>
第三步: 配置 statement 上面的 useCache 属性
<!-- 根据 id 查询 -->
<select id="" resultType="" parameterType="" useCache="true">
select * from ...... where ......
</select>
注意
1.将 UserDao.xml 映射文件中的<select>标签中设置 useCache=”true”代表当前这个 statement 要使用
二级缓存,如果不使用二级缓存可以设置为 false
2.针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁用二级缓存。
4.二级缓存注意事项
- 当我们在使用二级缓存时,所缓存的类一定要实现 java.io.Serializable 接口,这种就可以使用序列化方式来保存对象
- 二级缓存存储的数据,而不是对象