当前位置: 首页 > news >正文

MyBatis缓存

一、分 页

1.方式一 :limit  物理分页

// 方式一 limit  物理分页
@Select("select * from student limit #{param1},#{param2}")
public List<Student> findStudentPagelimit(int wz, int bc);

2.方式二:RowBounds 逻辑分页

// 方式二 RowBounds 逻辑分页
@Select("select * from student")
public List<Student> findStudentPageRowBounds(RowBounds rb);

3.方式三:第三方插件 PageHelper

 步骤:

3.1 导入jar包

3.2 配置插件
<!-- 思想:面向切面 --><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin></plugins>
3.3 调用方法
// 方式三 第三方插件 PageHelper@Select("select * from student")public List<Student> findStudentPageHelper();
package com.ztt.test;public class Test {public static void main(String[] args) {SqlSession sqlSession = DaoUtil.getSqlSession();StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);
//		List<Student> slist = stuMapper.findStudentPagelimit((1-1)*3, 3);//		RowBounds rb = new RowBounds((2-1)*3,3);
//		
//		List<Student> slist = stuMapper.findStudentPageRowBounds(rb);Page<Object> startPage = PageHelper.startPage(8, 2);List<Student> slist = stuMapper.findStudentPageHelper();//		PageInfo<Student> pageInfo = new PageInfo<Student>(slist);//		slist.forEach(System.out::println);//		System.out.println(startPage);
//		System.out.println(pageInfo);DaoUtil.closeResource(sqlSession);}}

二、延 迟 加 载 和 立 即 加 载

1.什么是立即加载

        立即加载是: 不管用不用信息,只要调用,马上发起查询并进行加载 

比如: 当我们查询学生信息时,就需要知道学生在哪个班级中,所以就需要立马去查询班级的信息

通常:当 一对一或者 多对一的时候需要立即加载

2.什么是延迟加载

        延迟加载是: 在真正使用数据时才发起查询,不用的时候不查询,按需加载(也叫懒加载)

比如: 在查询班级信息,每个班级都会有很多的学生(假如每个班有100个学生),如果我们只是查看 班级信息,但是学生对象也会加载到内存中,会造成浪费。 所以我门需要进行懒加载,当确实需要查看班级中的学生信息,我门在进行加载班级中的学生信息。

通常: 一对多,或者多对多的是需要使用延迟加载 

3.延迟加载的配置

<settings><setting name="lazyLoadingEnabled" value="true"/></settings>

如果设置 lazyLoadingEnabled = false,则禁用延迟加载,会级联加载所有关联对象的数据 如果设置 lazyLoadingEnabled = true,默认情况下mybatis 是按层级延时加载的。 aggressiveLazyLoading = true,mybatis 是按层级延时加载 aggressiveLazyLoading = false,mybatis 按需求加载。 

三、一级缓存

1.什么是缓存

        缓存(cache),数据交换的缓冲区,当应用程序需要读取数据时,先从数据库中将数据取出,放置在 缓冲区中,应用程序从缓冲区读取数据。 

1.1 特点:

        数据库取出的数据保存在内存中,具备快速读取和 使用。

1.2 限制:

        读取时无需再从数据库获取,数据可能不是最新的;

2.缓存的术语

针对 缓存数据命中 需要的数据在缓存中找到结果。
未命中需要的数据在缓存中未找到,重新获取

3.什么是 MyBatis 缓存

功能: 减少 Java Application 与数 据库的交互次数,从而提升程 序的运行效率;

方式: 通过配置和定制。 

4.缓存的适用性

适合使用缓存: 经常查询并且不经常改变的 数据的正确与否对最终结果影响不大的 比如:一个公司的介绍,新闻等

不适合使用缓存: 经常改变的数据 数据的正确与否对最终结果影响很大 比如商品的库存,股市的牌价等

5.MyBatis 缓存分类

  • 一级缓存 会话 session 级别的缓存,针对一 次会话操作内;
  • 二级缓存 映射器级别的缓存,针对不同 Namespace 的映射器;
  • 自定义缓存 根据各类不同的缓存机制,自定义 缓存的实现方式。 

6.一级缓存 SqlSession

        SqlSession 默认开启,一级缓存只是相对同一个 SqlSession 对象而言。

Student stu1 = sm.findStudentBysid(1);
student stu2 = sm.findStudentBysid(1);
system.out.println(stu1 == stu2);

输出结果为true 

student stu1 = sm.findStudentBysid( 1);sqlSession.close( );sqlSession = DBUtil.getsqlSession( );sm= sqlSession.getMapper( StudentMapper.class) ;
sqlSession.clearCache();|
student stu2 = sm.findStudentBysid(1);
system.out.print1n( stu1 == stu2);
DBUtil.sqlsessionClose(sqlSession) ;

输出结果为false 

关闭sqlsession 或者情况sqlsession缓存都可以实现

注意:当调用sqlsession的修改,添加,删除,commit(),close() 等方法是, 就会清空一级缓存

7.一级缓存失效情况

不同SqlSession对应不同的一级缓存

同一个SqlSession单查询条件不同

同一个SqlSession两次查询期间执行了任何一次增删改操作

同一个SqlSession两次查询期间手动清空了缓存 

四、二级缓存

 1.配置步骤:

1.1 在mybatis的mybatis-config.xml中配置

<settings><setting name="lazyLoadingEnabled" value="true"/>
</settings>

1.2 在mybatis的sqlmap中配置(mapper.xml中配置)

1.3 在使用的操作中配置(在select标签中配置)

 

2.二级缓存—注解

配置步骤:

2.1 在mybatis的sqlMapConfig.xml 中配置

2.2 在接口的定义上面直接使用@CacheNamespace 并将blocking设置为true,二级缓存就可以使用了 

 

2.3 二级缓存小结

  • Mybatis 的二级缓存相对于一级缓存来说, 实现了缓存数据的共享,可控性也更强;
  • 极大可能会出现错误数据,有设计上的缺陷,安全使用的条件比较苛刻;
  • 分布式环境下,必然会出现读取到错误 C 数据,所以不推荐使用。

五、自定义缓存

1.自定义缓存分类

  • 实现缓存接口 实现 org. apache. ibatis. cache. Cache 接口自定义缓存;
  • 引入第三方缓存 引入 Redis 等第三方内存库 作为 MyBatis 缓存。 

 

 

 

 

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • DataKit之OpenGauss数据迁移工具
  • 大数据技术基础编程、实验和案例----大数据课程综合实验案例
  • SpringBoot如何实现简单的跨域配置
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • 程序员修炼之路
  • vue3 动态加载组件
  • web文件上传与下载
  • 【附安装包】CentOS7(Linux)详细安装教程(手把手图文详解版)
  • Selenium 无法定位元素的几种解决方案
  • masscan 端口扫描——(Golang 简单使用总结)
  • playbooks 分布式部署 LNMP
  • 创新食堂管理:采购系统源码与供应链APP开发详解
  • 前后端demo-WarehouseManagement
  • 模板方法模式:Perl中定义算法骨架的艺术
  • 【致远互联FE协作办公平台 codeMoreWidget SQL注入】复现
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【Leetcode】104. 二叉树的最大深度
  • Android单元测试 - 几个重要问题
  • ERLANG 网工修炼笔记 ---- UDP
  • EventListener原理
  • Hibernate最全面试题
  • Java到底能干嘛?
  • Js基础知识(一) - 变量
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • nginx 配置多 域名 + 多 https
  • SAP云平台里Global Account和Sub Account的关系
  • 记一次用 NodeJs 实现模拟登录的思路
  • 使用API自动生成工具优化前端工作流
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 正则学习笔记
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 阿里云服务器如何修改远程端口?
  • #vue3 实现前端下载excel文件模板功能
  • #图像处理
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (二)windows配置JDK环境
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十三)Flask之特殊装饰器详解
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (一)为什么要选择C++
  • (转)jdk与jre的区别
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .net core + vue 搭建前后端分离的框架
  • .NET 中 GetProcess 相关方法的性能
  • .NET 中让 Task 支持带超时的异步等待
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .Net实现SCrypt Hash加密
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • @ComponentScan比较