作为一个优秀的开源orm框架,要学习的东西有很多,今天来聊下它的缓存;
一般分为一级缓存和二级缓存;
一级缓存是默认开启的,无法关闭,是sqlsession级别的; 啥意思呢? 就是说当你将mybatis集成进来的时候就有这个缓存了,如何证明他的存在呢?
当在一个service 中的一个方法,开启两次相同查询, 然后开启mybatis的日志.查看控制台打印,就能发现,一级缓存的存在;现象如下;
@Test public void test1(){
//根据 sqlSessionFactory 产生 session
SqlSession sqlSession = sessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//第一次查询,发出sql语句,并将查询出来的结果放进缓存中
User u1 = userMapper.selectUserByUserId(1);
System.out.println(u1);
//第二次查询,由于是同一个sqlSession,会在缓存中查询结果
//如果有,则直接从缓存中取出来,不和数据库进行交互
User u2 = userMapper.selectUserByUserId(1);
System.out.println(u2); sqlSession.close();
}
第二次查询不会有日志打印,第一次有数据库查询打印的mybaits日志; 其实这里有个隐含信息,也就是其实每开启一个sqlsession的第一次查询,在返回查询结果的时候,其实都缓存了结果,然后才返回数据的;
yiji
那么这个一级缓存何时失效呢?
1 当此sqlsession关闭后,那么它就会清空这个缓存
2 对于当前sqlsession做了dml操作 事务提交后(也就是有了数据改变并落盘),那么也会清空当前的sqlsession的缓存;
二级缓存;是mapper级别的,sqlsession直接可以共有的一个缓存;