原文:https://blog.csdn.net/qq_38274974/article/details/100898145
mybatis的缓存分为一级缓存、二级缓存
那么,我们为什么要使用缓存呢?
对于经常查询的并且不经常改变的数据,如果每次查询都要与数据库进行交互,这样就大大降低了效率,所以这里就引入了缓存,将一些对结果影响不大且经常查询的数据存放在内存中,从而减少与数据库的交互来提高效率,这就是缓存的优势。
一级缓存
一级缓存是SqlSession级别的缓存(默认是支持一级缓存,不需要再配置文件中配置一级缓存),在操作数据库时,每个SqlSession类的实例对象中有一个数据结构(HashMap)可以用来存储缓存数据,不同的SqlSession类的实例对象缓存的数据区域(HashMap)是互不影响的。当在同一个SqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据写到内存中,第二次查询不执行sql直接从内存中获取。
public class MyBatisTest { //mybatis的一级缓存,是SqlSession级别的缓存,只有一个SqlSession对象。 @Test public void test1(){ SqlSessionFactory ssf=MyBatisUtil.getFactory(); SqlSession session=ssf.openSession(); UserMapper um1=session.getMapper(UserMapper.class); User user1=um1.selectbyid(1); System.out.println(user1.getUsername()); //session.clearCache();//清理缓存 //session.commit();//模拟增删改 UserMapper um2=session.getMapper(UserMapper.class); User user2=um2.selectbyid(1); System.out.println(user2.getUsername()); session.close(); } }
结果:
由此可见,因为缓存,只发生了一次与数据库的交互
如何清理缓存?
方法一:模拟增删改
session.commit();
方法二:调用clearCache()方法
session.clearCache();
而清理缓存后:
二级缓存
二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。对于访问多的查询请求且用户对查询结果实时性要求不高,此时便可采用mybatis的二级缓存。
1.启动
在核心配置文件mybatis-config.xml中加入
<settings> <setting name="cacheEnabled" value="true"/> </settings>
2.调用实体类实现序列化接口
实现序列化接口的目的:
·为了将数据取出执行反序列化操作
·标记接口,打个标记,表示具有一些功能,可以被其它功能对象调用
·序列号有方法,可以将对象序列化成二进制文件,也可以将二进制文件反序列化成对象
3.在对应的mapper.xml中加入cache标签
4.测试
@Test public void test2(){ //mybatis的二级缓存,是mapper级别的缓存,有多个SqlSession对象。 SqlSessionFactory ssf=MyBatisUtil.getFactory(); SqlSession session1=ssf.openSession(); SqlSession session2=ssf.openSession(); SqlSession session3=ssf.openSession(); UserMapper um1=session1.getMapper(UserMapper.class); User user1=um1.selectbyid(1); System.out.println(user1.getUsername()); session1.close(); UserMapper um2=session2.getMapper(UserMapper.class); User user2=um2.selectbyid(1); System.out.println(user2.getUsername()); session2.close(); UserMapper um3=session3.getMapper(UserMapper.class); User user3=um3.selectbyid(1); System.out.println(user3.getUsername()); session3.close(); }
运行结果: