Mybatis缓存
1.缓存的概念
-
什么是缓存
存在于内存中的临时数据。
-
为什么使用缓存
减少和数据库的交互次数,提高执行效率
-
适用情况:
经常查询且不经常改变
数据正确与否对最终结果影响不大的
不适用情况:
经常改变的数据
数据的正确与否对最终结果影响很大的
如:商品库存、银行汇率、股市牌价
二、一级缓存
概念:
存在于Mybatis中SqlSession对象中的缓存
执行查询后,查询结果会同时存入到SqlSession提供的一块区域中
该区域结构是一个map。每次查询时先取sqlsession是否存在查询的缓存,如果有直接拿出来用。
一级缓存的生命周期伴随创建的session对象,创建而存在,消失而消失。
当调用SqlSession的修改、添加、删除,commit()、close()等方法时就会清空缓存
部分验证代码:
@Test
public void testCache(){
User user1 = new userDao.findById(1);
System.out.println(user1);//查看查询结果
user1.setId(2);
userDao.updateUser(user1);//更改数据
sqlSession.clearCache();//清除缓存
//sqlSession.close();//关闭Session
System.out.println(user1);//查看处理缓存后的结果
}
三、二级缓存
概念:
它是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存
它存的是散装数据,不是对象。
如: {”id“:“1”,“username”:“lili”}
使用步骤:
- 让Mybatis框架支持二级缓存(SqlMapConfig.xml中设置)
- 让当前映射文件支持二级缓存(IUserDao.xml中配置)
- 让当前操作支持二级缓存(在select标签中配置)
部分代码:
SqlMapConfig.xml
<settings>
<setting name="cacheEnabled" value="true">
</setting>
</settings>
IUserDao.xml
<cache/>
<select id="findById" parameter="int" resultType="user" useCache="true">
select * from user where id=#{id}
</select>
测试代码
@Test
public void testSecondLevelCache(){
SeqSession sqlSession1 = factory.openSession();
IUserDao dao1 = sqlSession1.getMapper(IUserDao.class);
User user1 = dao1.findById(1);
System.out.println(user1);
sqlSession.close();//一级缓存消失
SeqSession sqlSession2 = factory.openSession();
IUserDao dao2 = sqlSession2.getMapper(IUserDao.class);
User user2 = dao1.findById(2);
System.out.println(user2);
sqlSession.close();//一级缓存消失
System.out.println(user1==user2);
}
其结果可观察到没有发起两次查询,但是返回值为false,说明不是相同对象,验证二级缓存