原文: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();
System.out.println(user1.getUsername());
//session.clearCache();//清理缓存
//session.commit();//模拟增删改
UserMapper um2=session.getMapper(UserMapper.class);
User user2=um2.selectbyid();
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();
System.out.println(user1.getUsername());
session1.close(); UserMapper um2=session2.getMapper(UserMapper.class);
User user2=um2.selectbyid();
System.out.println(user2.getUsername());
session2.close(); UserMapper um3=session3.getMapper(UserMapper.class);
User user3=um3.selectbyid();
System.out.println(user3.getUsername());
session3.close();
}

运行结果:

最新文章

  1. Lua 学习笔记(八)错误(error)
  2. SDWebImage笔记
  3. Js之DOM(一)
  4. JavaScript 兼容 Array.prototype.slice.call
  5. 注册宝第五期beta2插件模块下载及说明
  6. linux之SQL语句简明教程---CREATE INDEX
  7. Best jQuery Plugins of the Month – May 2014
  8. asp.net mvc ActionResult
  9. iOS 主动抛出异常
  10. jQuery删除DOM节点
  11. Day5 模块及Python常用模块
  12. Tomcat【介绍Tomcat、结构目录、虚拟目录、临时域名、虚拟主机、体系结构】
  13. SPRING BOOT跨域访问处理
  14. [NOI 2005]聪聪和可可
  15. 面试题int和Integer
  16. 关于shared_ptr与weak_ptr的使用(good)
  17. Springboot+Mybatis+MySQL实例练习时踩坑记录
  18. 洛谷P3233 世界树
  19. linux修改网卡名为eth0
  20. 使用PowerShell替代WinDbg在高分辨率笔记本下调试、排错

热门文章

  1. POJ3436
  2. .Net基础之1——学前入门
  3. Golang源码学习:调度逻辑(一)初始化
  4. Multisim-74LS08\74LS02\74LS86逻辑功能仿真实验
  5. iOS开发判断手机号及其运营商
  6. 【java】关键字volatile
  7. Java——参数传递
  8. 3.key的操作
  9. Python数据分析:pandas玩转Excel (二)
  10. Spring_配置Bean &amp; 属性配置细节