Java第三十七天,Mybatis框架系列,缓存 一、什么是缓存 二、Mybatis 中的缓存的优点 三、缓存的适用情况 四、一级缓存 五、二级缓存

Java第三十七天,Mybatis框架系列,缓存
一、什么是缓存
二、Mybatis 中的缓存的优点
三、缓存的适用情况
四、一级缓存
五、二级缓存

存在于内存中的临时数据

二、Mybatis 中的缓存的优点

通过缓存策略来减少数据库的查询次数,从而提高性能。Mybatis 中缓存分为一级缓存、二级缓存

Java第三十七天,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共享其缓存

Java第三十七天,Mybatis框架系列,缓存
一、什么是缓存
二、Mybatis 中的缓存的优点
三、缓存的适用情况
四、一级缓存
五、二级缓存

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 >
    select * from ...... where ......
</select>


注意
1.将 UserDao.xml 映射文件中的<select>标签中设置 useCache=”true”代表当前这个 statement 要使用
二级缓存,如果不使用二级缓存可以设置为 false
2.针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁用二级缓存。

4.二级缓存注意事项

  • 当我们在使用二级缓存时,所缓存的类一定要实现 java.io.Serializable 接口,这种就可以使用序列化方式来保存对象
  • 二级缓存存储的数据,而不是对象