Mybatis提供了缓存功能,在查询的时候会将结果存入缓存,当以后查询的时候会先从缓存里面去找,找不到再到数据库里面找,这样就提高了查询的效率。
Mybatis对缓存分成了一二级缓存,效果是一样的,只是两个的作用域不同。
1.一级缓存:mybatis的默认启动项,作用域为同一个SqlSession对象,当一个SqlSession对象多次查询数据库的时候会先从缓存里面找。但是有一个前提:SqlSession不能被close,因为一旦被close之后,该SqlSession回话就失效了,也就没用了。还有一点,SqlSession对象执行了增删改操作的时候会刷新缓存,也就是以前的缓存就没了。
示例代码:一个SqlSession对同一条件查询两次,然后输出两个对象的hashcode值。
public User_Info selectByPrimaryKey(Integer id) {
String statement = "cn.wzy.dao.User_InfoMapper.selectByPrimaryKey";
SqlSession sqlSession = factory.openSession();
System.out.println((sqlSession.selectOne(statement, id)).hashCode());
return sqlSession.selectOne(statement, id);
}
测试代码:@Test public void selectByPrimaryKey() { User_Info user1 = dao.selectByPrimaryKey(1); System.out.println(user1.hashCode()); }
控制台输出:
hashcode值一样(hashcode值的规则未修改的情况哦),说明两个的结果是同一个。
2.二级缓存:作用域为所有的SqlSession对象,即所有的SqlSession查询过的数据都会存入二级缓存,但是必须SqlSession要提交事务,数据才会存入二级缓存,二级缓存为所有的SqlSession公用,即使一个SqlSession对象close了,它所加入的缓存也会依然存在。
示例代码:
public
User_Info selectByPrimaryKey(Integer id) {
String statement =
"cn.wzy.dao.User_InfoMapper.selectByPrimaryKey"
;
SqlSession sqlSession = factory.openSession();
System.out.println((sqlSession.selectOne(statement, id)).hashCode());
sqlSession.commit();
sqlSession.close();
SqlSession sqlSession1 = factory.openSession();
System.out.println((sqlSession1.selectOne(statement, id)).hashCode());
return
sqlSession1.selectOne(statement, id);
}
结果