MyBatis基于XML的详细使用——缓存1.介绍2.一级缓存的使用3.二级缓存1. 缓存的使用2. 缓存的属性3. 二级缓存的作用范围4. 整合第三方缓存

1、介绍

MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地 配置和定制。 为了使它更加强大而且易于配置,我们对 MyBatis 3 中的缓存实 现进行了许多改进。
默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据 进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:

1 <cache/>

当添加上该标签之后,会有如下效果:

  1. 映射语句文件中的所有 select 语句的结果将会被缓存。
  2. 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
  3. 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来 清除不需要的缓存。
  4. 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
  5. 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
  6. 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以 安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

在进行配置的时候还会分为一级缓存和二级缓存:
一级缓存:线程级别的缓存,是本地缓存,sqlSession级别的缓存
二级缓存:全局范围的缓存,不止局限于当前会话

2、一级缓存的使用

一级缓存是sqlsession级别的缓存,默认是存在的。在下面的案例 中,大家发现我发送了两个相同的请求,但是sql语句仅仅执行了一次,那么就 意味着第一次查询的时候已经将结果进行了缓存。

1 @Test
2 public void test01() {
3
4 SqlSession sqlSession = sqlSessionFactory.openSession();
5 try {
6 EmpDao mapper = sqlSession.getMapper(EmpDao.class);
7 List<Emp> list = mapper.selectAllEmp();
8 for (Emp emp : list) {
9 System.out.println(emp);
10 }
11 System.out.println("‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐");
12 List<Emp> list2 = mapper.selectAllEmp();
13 for (Emp emp : list2) {
14 System.out.println(emp);
15 }
16 } catch (Exception e) {
17 e.printStackTrace();
18 } finally {
19 sqlSession.close();
20 }
21 }

在大部分的情况下一级缓存是可以的,但是有几种特殊的情况会造成 一级缓存失效:

  1. 一级缓存是sqlSession级别的缓存,如果在应用程序中只有开启了多个 sqlsession,那么会造成缓存失效
1 @Test
2 public void test02(){
3 SqlSession sqlSession = sqlSessionFactory.openSession();
4 EmpDao mapper = sqlSession.getMapper(EmpDao.class);
5 List<Emp> list = mapper.selectAllEmp();
6 for (Emp emp : list) {7 System.out.println(emp);
8 }
9 System.out.println("================================");
10 SqlSession sqlSession2 = sqlSessionFactory.openSession();
11 EmpDao mapper2 = sqlSession2.getMapper(EmpDao.class);
12 List<Emp> list2 = mapper2.selectAllEmp();
13 for (Emp emp : list2) {
14 System.out.println(emp);
15 }
16 sqlSession.close();
17 sqlSession2.close();
18 }
  1. 在编写查询的sql语句的时候,一定要注意传递的参数,如果参数不一致,那 么也不会缓存结果
  2. 如果在发送过程中发生了数据的修改,那么结果就不会缓存
1 @Test
2 public void test03(){
3 SqlSession sqlSession = sqlSessionFactory.openSession();
4 EmpDao mapper = sqlSession.getMapper(EmpDao.class);
5 Emp empByEmpno = mapper.findEmpByEmpno(1111);
6 System.out.println(empByEmpno);
7 System.out.println("================================");
8 empByEmpno.setEname("zhangsan");
9 int i = mapper.updateEmp(empByEmpno);
10 System.out.println(i);
11 System.out.println("================================");
12 Emp empByEmpno1 = mapper.findEmpByEmpno(1111);
13 System.out.println(empByEmpno1);
14 sqlSession.close();
15 }
  1. 在两次查询期间,手动去清空缓存,也会让缓存失效
1 @Test
2 public void test03(){
3 SqlSession sqlSession = sqlSessionFactory.openSession();
4 EmpDao mapper = sqlSession.getMapper(EmpDao.class);
5 Emp empByEmpno = mapper.findEmpByEmpno(1111);
6 System.out.println(empByEmpno);
7 System.out.println("================================");
8 System.out.println("手动清空缓存");9 sqlSession.clearCache();
10 System.out.println("================================");
11 Emp empByEmpno1 = mapper.findEmpByEmpno(1111);
12 System.out.println(empByEmpno1);
13 sqlSession.close();
14 }

今天就分享到这里了,文章后续及更多java学习资料,关注我,免费领取

Mybatis-06【MyBatis基于XML的详细使用——缓存】相关推荐

  1. MyBatis基于XML的详细使用——缓存

    目录 介绍 一级缓存的使用 特性 二级缓存 缓存的使用 缓存的属性 二级缓存的作用范围: 特性 介绍 MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制. 为了使它更加强大 ...

  2. [JAVAEE]实验06:基于XML和基于注解的声明式事务管理方式模拟银行转账程序

    一.实验目的: 熟练掌握声明式事务管理. 二.实验内容: 编写一个模拟银行转账的程序,要求在转账时通过Spring对事务进行控制. 三.实验要求: 分别使用基于XML和基于注解的声明式事务管理方式来实 ...

  3. mybatis笔记-04【MyBatis基于XML的详细使用——高级结果映射】

    1.联合查询 emp.java 1 package cn.tulingxueyuan.pojo; 2 3 import java.time.LocalDate; 4 5 /*** 6 * @Autho ...

  4. mybatis入门配置——基于xml配置

    1.下载mybatis配置文件,以及数据库驱动文件,最好配置日志文件log4j可以方便测试查看日志: mybatis配置文件以及log4j日志配置下载链接: http://download.csdn. ...

  5. Mybatis基于XML配置SQL映射器(一)

    Durid和Mybatis开发环境搭建 SpringBoot搭建基于Spring+SpringMvc+Mybatis的REST服务(http://www.cnblogs.com/nbfujx/p/76 ...

  6. MyBatis框架基于XML配置文件开发

    MyBatis框架基于XML配置文件开发 本文内容涉及MyBatis框架开发的传参,多表查询,结果封装: 说明: 当前使用的是mysql数据库, 测试在maven工程下: 数据库表: book表: k ...

  7. 【MyBatis】MyBatis是什么?能干什么?一篇学习MyBatis,知识点详细解释,实例演示

    文章目录 MyBatis 1.简介 1.1 什么是MyBatis? 1.2 如何获得MyBatis? 1.3 持久化? 1.4 持久层? 1.5 为什么需要Mybatis? 2.第一个MyBatis程 ...

  8. spring和mybatis整合:使用xml方式

    文章目录 spring和mybatis整合:使用xml方式 1. 创建数据库 2. 创建工程,pom.xml文件如下: 3. 依赖下载地址如下: 4. 配置mybatis的全局配置,在resource ...

  9. Mybatis的CRUD之XML方式以及动态SQL

    MyBatis 接口代理方式实现 Dao 层 传统方式实现 Dao 层,我们既要写接口,还要写实现类.而 MyBatis 框架可以帮助我们省略编写 Dao 层接口实现类的步骤.程序员只需要编写接口,由 ...

最新文章

  1. Laravel 单设备登录
  2. 关于虚函数(多态)与继承的一道搜狗笔试题
  3. 在C#中调用windows API函数
  4. 中断技术之中断的定义,中断服务程序的设计方法,中断处理的过程以及中断向量表的建立
  5. Android 点击应用外的Url拉起应用
  6. 分页和条件查询接口开发
  7. abnf java实现_详细讲解如何利用Java实现组合式解析器?
  8. 博士当中学老师是“人才浪费”?
  9. python语法基础知识第四关第二题_【python基础语法】第4天作业练习题
  10. fir.im Weekly - 技术人也要苦练“七十二变”
  11. 唯品会收购第三方支付牌照正式落槌 浙江贝付完成更名
  12. 多彩三角活动策划方案PPT模板
  13. 使用sikuli测试web网页实例
  14. 关于使用火车采集器采集分页URL不变化网站
  15. supersu二进制更新安装失败_SuperSU更新二进制文件原因底层分析--内附官方文档...
  16. html文本框的文字间距,word文本框中2行文字的间距为什么那么大
  17. Windows10 电源选项中没有 唤醒时需要密码
  18. 王兴:8年时间,我对商业的思考
  19. 爬了3000万QQ用户数据,挖出了花千骨赵丽颖的QQ号
  20. krait和kryo_回归四核的自主Kryo架构_手机_手机评测-中关村在线

热门文章

  1. 嵌入式linux简介
  2. C语言system函数
  3. img标签禁止图片拖动
  4. Maven+SSM框架项目实例
  5. 山寨机山寨文化的前世今生
  6. 有哪些流量明星走红让你觉得无法理解?
  7. SmartGit 合并分支
  8. 【Haskell】列表
  9. 如果你想要提升自己,这6款APP不该被忘却!
  10. 常数变易法的原理解释