本地二级缓存:
一级缓存:单个Session共享内容
二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存。
本地二级缓存图解:

注意:
1)commit操作(执行插入、更新、删除)可清空二级缓存(同时清空所有的一级缓存)。也就是刷新缓存。
2)这个仅能在单台服务器上共享
拓展 :
分布式二级缓存。
修改DB必须手动同步缓存

开发注意:
1,核心配置开启二级缓存
在 settings 里面加入 <setting name="cacheEnabled" value="true"/>
2,Mapper.xml中开启二级缓存<cache/> 哪个实体需要二级缓存 就在哪个实体Mapper 里面加入<cache/> 标签

3,POJO序列化:BookInfo implements Serializable
需求:把一个对象的数据,存储到本地记事本?这种场景下的对象必须做序列化。
对象流java.io.ObjectOutputStream

二级缓存数据存储介质多,将缓存数据取出执行反序列化操作。
注意:在sqlSession执行close()后,才将数据写入二级缓存中。否则第二次还是从DB查询。
开发步骤:
第一步:核心配置文件开启二级缓存

第二步:Mapper映射文件开启二级缓存

第三步:需要对实体类做序列化

第四步:核心代码与测试
每次都是一个新的 SqlSession。
测试代码如下 : 解释已经注释了 观察 每一段的注释 ,
@Test
public void testTwoCache(){
SqlSession sqlSession2 = SqlSessionFactoryUtilSingleE.getSqlSession();
SqlSession sqlSession = SqlSessionFactoryUtilSingleE.getSqlSession();
SqlSession sqlSession1 = SqlSessionFactoryUtilSingleE.getSqlSession();
/**
* 使用第一个sqlSession 进行查询数据
* 需要注意的地方是 sqlSession.close(); 绝对不能少 。
*/
BookInfoMapper mapper = sqlSession.getMapper(BookInfoMapper.class);
BookInfo bookInfo = mapper.selectByPrimaryKey(1l);
sqlSession.close();
Log.debug(bookInfo);
/**
* 使用sqlSession1查询数据 发现这个时候并没有打印Sql 语句 这就说明新的 sqlSession1 是从二级缓存得到的数据
*/
BookInfoMapper mapper1 = sqlSession1.getMapper(BookInfoMapper.class);
BookInfo bookInfo1 = mapper1.selectByPrimaryKey(1l);
Log.debug(bookInfo1);
/**
* 新的 sqlSession2 进行更新数据 并且 commit 观察输出 打印sql 并更新数据库
*/
BookInfoMapper mapper2 = sqlSession2.getMapper(BookInfoMapper.class);
bookInfo1.setBookName("balbala");
mapper2.updateByPrimaryKeySelective(bookInfo1);
sqlSession2.commit();
/**
* 使用之前使用的 sqlSession 进行数据查询 发现一个问题 查询打印出来了 SQL 语句
* 这就说明并没有从二级缓存查询数据 而是从新从数据库查询数据
*/
BookInfo bookInfo2 = mapper1.selectByPrimaryKey(1l);
Log.debug(bookInfo2);
}
控制台输出结果如下所示:
