MyBatis的一级缓存和二级缓存
一级缓存:MyBatis:SqlSession级别的缓存;默认存在
1)、只要之前查询过数据,mybatis就会保存在一个缓存中(Map);下次 获取直接从缓存中拿;
@Test
public void test01() {
SqlSession sqlSession = null;
try {
SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
sqlSession = sqlSessionFactory.openSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacherById(1);
System.out.println(teacher);
System.out.println("======================");
Teacher teacher1 = mapper.getTeacherById(1);
System.out.println(teacher1);
System.out.println(teacher == teacher1);//true
} catch (IOException e) {
e.printStackTrace();
} finally {
sqlSession.commit();
sqlSession.close();
}
}
一级缓存失效的几种情况
一级缓存是SqlSession级别的缓存
- 1、不同的sqlSession,使用不同的一级缓存;下次使用这个sqlSession查询会从缓存中拿
- 2、同一个方法,不同的参数,由于可能之前没有查过,所以还会发新的sql
- 3、在这个sqlSession期间执行任何一次的增删改操作,增删改操作会把缓存清空
- 4、手动清除缓存,清空sqlSession的一级缓存 sqlSession.clearCache();每次查询先去看一级缓存中有没有数据,如果没有就去发送新的sql;每一个sqlSession拥有自己的一级缓存
二级缓存:
mybatis开启二级缓存:
1、在sql映射文件中加上<cache></cache>
2、JavaBean实现Serializable接口
注意点:
- 1、不会出现一级缓存和二级缓存中有同一个数据
二级缓存中;一级缓存中关闭了就有了;
一级缓存中:二级缓存中没有此数据,就会看一级缓存,一级缓存也没有就去查数据库
数据库查询后的结果放在一级缓存中了 - 2、任何时候都是先看二级缓存、再看一级缓存,如果大家都没有就去查询数据库
顺序:二 ===-> 一 ==-> 数据库
mybatis还可以整合外部的缓存,只需要在sql映射文件中加上,里面的type是要整合的缓存的全路径名,不需要实现Serializable接口
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>