Mybatis-06【MyBatis基于XML的详细使用——缓存】
MyBatis基于XML的详细使用——缓存1.介绍2.一级缓存的使用3.二级缓存1. 缓存的使用2. 缓存的属性3. 二级缓存的作用范围4. 整合第三方缓存
1、介绍
MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地 配置和定制。 为了使它更加强大而且易于配置,我们对 MyBatis 3 中的缓存实 现进行了许多改进。
默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据 进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:
1 <cache/>
当添加上该标签之后,会有如下效果:
- 映射语句文件中的所有 select 语句的结果将会被缓存。
- 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
- 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来 清除不需要的缓存。
- 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
- 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
- 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以 安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
在进行配置的时候还会分为一级缓存和二级缓存:
一级缓存:线程级别的缓存,是本地缓存,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 }
在大部分的情况下一级缓存是可以的,但是有几种特殊的情况会造成 一级缓存失效:
- 一级缓存是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 }
- 在编写查询的sql语句的时候,一定要注意传递的参数,如果参数不一致,那 么也不会缓存结果
- 如果在发送过程中发生了数据的修改,那么结果就不会缓存
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 @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的详细使用——缓存】相关推荐
- MyBatis基于XML的详细使用——缓存
目录 介绍 一级缓存的使用 特性 二级缓存 缓存的使用 缓存的属性 二级缓存的作用范围: 特性 介绍 MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制. 为了使它更加强大 ...
- [JAVAEE]实验06:基于XML和基于注解的声明式事务管理方式模拟银行转账程序
一.实验目的: 熟练掌握声明式事务管理. 二.实验内容: 编写一个模拟银行转账的程序,要求在转账时通过Spring对事务进行控制. 三.实验要求: 分别使用基于XML和基于注解的声明式事务管理方式来实 ...
- mybatis笔记-04【MyBatis基于XML的详细使用——高级结果映射】
1.联合查询 emp.java 1 package cn.tulingxueyuan.pojo; 2 3 import java.time.LocalDate; 4 5 /*** 6 * @Autho ...
- mybatis入门配置——基于xml配置
1.下载mybatis配置文件,以及数据库驱动文件,最好配置日志文件log4j可以方便测试查看日志: mybatis配置文件以及log4j日志配置下载链接: http://download.csdn. ...
- Mybatis基于XML配置SQL映射器(一)
Durid和Mybatis开发环境搭建 SpringBoot搭建基于Spring+SpringMvc+Mybatis的REST服务(http://www.cnblogs.com/nbfujx/p/76 ...
- MyBatis框架基于XML配置文件开发
MyBatis框架基于XML配置文件开发 本文内容涉及MyBatis框架开发的传参,多表查询,结果封装: 说明: 当前使用的是mysql数据库, 测试在maven工程下: 数据库表: book表: k ...
- 【MyBatis】MyBatis是什么?能干什么?一篇学习MyBatis,知识点详细解释,实例演示
文章目录 MyBatis 1.简介 1.1 什么是MyBatis? 1.2 如何获得MyBatis? 1.3 持久化? 1.4 持久层? 1.5 为什么需要Mybatis? 2.第一个MyBatis程 ...
- spring和mybatis整合:使用xml方式
文章目录 spring和mybatis整合:使用xml方式 1. 创建数据库 2. 创建工程,pom.xml文件如下: 3. 依赖下载地址如下: 4. 配置mybatis的全局配置,在resource ...
- Mybatis的CRUD之XML方式以及动态SQL
MyBatis 接口代理方式实现 Dao 层 传统方式实现 Dao 层,我们既要写接口,还要写实现类.而 MyBatis 框架可以帮助我们省略编写 Dao 层接口实现类的步骤.程序员只需要编写接口,由 ...
最新文章
- Laravel 单设备登录
- 关于虚函数(多态)与继承的一道搜狗笔试题
- 在C#中调用windows API函数
- 中断技术之中断的定义,中断服务程序的设计方法,中断处理的过程以及中断向量表的建立
- Android 点击应用外的Url拉起应用
- 分页和条件查询接口开发
- abnf java实现_详细讲解如何利用Java实现组合式解析器?
- 博士当中学老师是“人才浪费”?
- python语法基础知识第四关第二题_【python基础语法】第4天作业练习题
- fir.im Weekly - 技术人也要苦练“七十二变”
- 唯品会收购第三方支付牌照正式落槌 浙江贝付完成更名
- 多彩三角活动策划方案PPT模板
- 使用sikuli测试web网页实例
- 关于使用火车采集器采集分页URL不变化网站
- supersu二进制更新安装失败_SuperSU更新二进制文件原因底层分析--内附官方文档...
- html文本框的文字间距,word文本框中2行文字的间距为什么那么大
- Windows10 电源选项中没有 唤醒时需要密码
- 王兴:8年时间,我对商业的思考
- 爬了3000万QQ用户数据,挖出了花千骨赵丽颖的QQ号
- krait和kryo_回归四核的自主Kryo架构_手机_手机评测-中关村在线