mybatis 缓存
mybatis缓存有两种 一级缓存和二级缓存
一级缓存:sqlSession级别缓存
二级缓存:namesoace级别缓存
一级缓存
是始终存在的
@Test
public void cacheTest(){
SqlSession sqlSession = MybatisUtils.getSession();
DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
Dept dept1 = mapper.selectDeptById(10);
System.out.println(dept1.getDeptno()+"----"+dept1.getDname());
sqlSession.close();
//session 关闭以后一级缓存就失效了
sqlSession = MybatisUtils.getSession();
mapper = sqlSession.getMapper(DeptMapper.class);
Dept dept2 = mapper.selectDeptById(10);
System.out.println(dept2.getDeptno()+"----"+dept2.getDname());
System.out.println(dept1==dept2);//一级缓存生效为true
}
如果session关闭 则一级缓存失效
执行更新操作后缓存失效 这种情况称为缓存同步
@Test
public void cacheTest2(){
SqlSession sqlSession = MybatisUtils.getSession();
DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
Dept dept1 = mapper.selectDeptById(10);
System.out.println(dept1.getDeptno()+"----"+dept1.getDname());
dept1.setLoc("太原");
mapper.updateDept(dept1);
// 一级缓存失效 关闭session 执行更新操作
DeptMapper mapper2 = sqlSession.getMapper(DeptMapper.class);
Dept dept2 = mapper2.selectDeptById(10);
System.out.println(dept2.getDeptno()+"----"+dept2.getDname());
}
二级缓存
默认 是关闭的
要想使用二级缓存需要配置文件的settings中设置
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"></setting>
还需要再mapper文件中设置
<!-- 使用二级缓存-->
<cache/>
同时对于使用二级缓存的pojo对象必须实现序列化 实现Serializable接口
还可以针对单条sql语句来设置缓存
缓存的主要作用 : 提升查询效率