Mybatis中使用缓存的概念
- 缓存:存在于内存中的临时数据。
- 使用缓存的原因:减少和数据库的交互次数,提高执行效率。
- 使用场所:
-
- 适用于缓存:经常查询并且不经常改变的。数据的正确与否对最终结果影响不大的。
- 不适用于缓存:经常改变数据,数据的正确与否对最终结果影响很大的。
Mybatis中的一级缓存和二级缓存
一级缓存:
- 指的是Mybatis中SqlSession对象的缓存。当我们执行查询之后,查询的结果会同时存入到SQLSession提供的一片区域中。
- 该区域的结构是一个Map,当我们再次查询统一的数据时,就会查询是否有,有的话,就会直接拿出来使用。
- 当SqlSession对象消失的时候,一级缓存也会没有。
- 以下为测试用例和结果。
@Test public void testFirstLevelCache(){ User user1=userDao.findById(41); System.out.println(user1); session.clearCache();//清空一级缓存 User user2=userDao.findById(41); System.out.println(user2); System.out.println(user1==user2); }
- 以上就是一级缓存的验证测试用例。当SqlSession进行添加、修改、删除、commit、close、clearCahe等操作时,就会触发清空一级缓存的操作。
二级缓存
- 指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的、SqlSession共享的区域
- 使用二级缓存的步骤:
-
- 第一步:让Mybatis框架支持二级缓存(在Config文件中)
<settings> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> <setting name="cacheEnabled" value="true"/> </settings>
-
- 第二步:让当前的映射文件支持二级缓存(在对应的接口类配置文件中操作)在mapper标签下进行添加工作。
<!--开启二级缓存--> <cache/>
-
- 让当前操作支持二级缓存(在select语句中进行配置)
<select id="findById" parameterType="java.lang.Integer" resultType="com.mybatis.User" useCache="true"> select * from user where id=#{uid} </select>
- 测试用例及结果
@Test public void testSecondLevelCache(){ SqlSession sqlSession1= factory.openSession(); UserDao userDao1=sqlSession1.getMapper(UserDao.class); User user1=userDao1.findById(41); System.out.println(user1); sqlSession1.close();//一级缓存消失 SqlSession sqlSession2= factory.openSession(); UserDao userDao2=sqlSession2.getMapper(UserDao.class); User user2=userDao2.findById(41); System.out.println(user2); sqlSession2.close();//一级缓存消失 System.out.println(user1==user2); }
- 这个截图就可以反映出已经进行了二级缓存,但是最后的结果还是false,原因就是:二级缓存中数据的存储不是以对象的形式,是以类似json的格式进行缓存的。当需要的时候,就会把需要的数据重写入新的对象中,导致这一现象的发生。