1.一级缓存
指的是mybatis中sqlSession对象的缓存,当我们执行查询后,查询的结果会同时存入到SqlSession为我们提供的一块区域中,
该区域的结构是一个map,当我们再次查询同样的数据,mybatis会先去SqlSession中查询是否存在,有的话直接拿来用。当
SqlSession对象消失时,myBatis的缓存也就消失了。
一级缓存是SqlSession范围的缓存,当调用SqlSession的修改、添加、删除等方法时,会清空一级缓存。
例:
@Test
public void testFindAll(){
List<User> users = userDao.findAll();
//sqlSession.clearCache();或者
sqlSession.close();
sqlSession=factory.openSession();
userDao = sqlSession.getMapper(IUserDao.class);
List<User> users2 = userDao.findAll();
if(users2.equals(users)){
System.out.println(true);
}else {
System.out.println(false);
}
}
2.二级缓存
指的是mybatis的sqlSessionFactory对象的缓存。由同一个sqlSessionFactory对象创建的session共享其缓存。
二级缓存的使用步骤:
(1)让mybatis框架支持其缓存(SqlMapconfig.xml配置)
<setting name="cacheEnabled" value="true"></setting>
(2)让当前的映射文件支持二级缓存(IuserDao中配置)
<cache/>
(3)让当前的操作支持二级缓存(在select 标签中配置)
<select id="findById" parameterType="INT" resultType="user" useCache="true">
select * from user where id = #{uid}
</select>
测试代码:
@Test
public void testFindAll() {
SqlSession sqlSession1 = factory.openSession(true);
IUserDao mapper1 = sqlSession1.getMapper(IUserDao.class);
User user1 = mapper1.findById(41);
System.out.println(user1);
SqlSession sqlSession2 = factory.openSession(true);
IUserDao mapper2 = sqlSession2.getMapper(IUserDao.class);
User user2=mapper2.findById(41);
System.out.println(user2);
System.out.println(user1==user2);
}