mybatis分页、延迟加载、立即加载、一级缓存、二级缓存

mybatis分页、延迟加载、立即加载、一级缓存、二级缓存

    • 分页
    • 延迟加载和立即加载
    • 缓存
      • 一级缓存
      • 二级缓存

分页

分类

  1. 使用Limit,来进行分页;物理分页
  2. 使用RowBounds集合来保存分页需要数据,来进行分页;逻辑分页;本质是全查,只是显示部分
  3. 使用分页插件来进行分页;物理分页

方式一:

//limit分页
	@Select("select * from student limit #{arg0},#{arg1}")
	public List<Student> selectStudentLimit(int sp,int cp);

//获取数据
List<Student> slist = sm.selectStudentLimit((1-1)*3,3);

方式二:

//RowBounders
	public List<Student> selectStudentRB(RowBounds rb);

//获取数据
List<Student> slist = sm.selectStudentRB(new RowBounds(2,3));

方式三:

首先导入两个jar包:

在这里插入图片描述

配置插件:

<plugins>
		<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>

在这里插入图片描述

//分页
	@Select("select * from student")
	public List<Student> selectStudentPageHelper();

调用:

Page<Object> page = PageHelper.startPage(1, 3);
List<Student> list = mapper.selectStudentPageHelper();
list.forEach(System.out::println);

//page对象可以获取
System.out.println(page);
//详细分页对象
PageInfo<Studnet> pageinfo = new PageInfo<Student>(list,3);
System.out.println(pageinfo);

在这里插入图片描述

字段含义
pageNum当前页的页码
pageSize每页显示的条数
size当前页显示的真实条数
total总记录数
pages总页数
prePage上一页的页码
nextPage下一页的页码
isFirstPage / isLastPage是否为第一页/是否为最后一页
hasPrevivousPage / hasNextPage是否存在上一页/是否存在下一页
navigatePagesd导航分页的码数
navigatepageNumsd导航分页的页码,[1,2,3,4…]

延迟加载和立即加载

立即加载:不管用不用信息,只要调用,马上发起查询并进行加载;通常,当 一对一或者多对一的时候需要立即加载

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

延迟加载:在真正使用数据时才发起查询,不用的时候不查询,按需加载(也叫 懒加载);通常, 一对多,或者多对多的是需要使用延迟加载

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

延迟加载的配置

在这里插入图片描述

如果设置 lazyLoadingEnabled = false,则禁用延迟加载,会级联加载所有关联对象的数据

如果设置 lazyLoadingEnabled = true,默认情况下mybatis 是按层级延时加载的。

aggressiveLazyLoading = true,mybatis 是按层级延时加载

aggressiveLazyLoading = false,mybatis 按需求加载。

sqlmapper中:

在这里插入图片描述

注解方式开启

//开启二级缓存
@CacheNamespace(blocking = true)
public interface StudentMapper {
    ...
}

缓存

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

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

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

命中、未命中:需要的数据在缓存中找到结果为命中;需要的数据在缓存中未找到,重新获取为未命中。

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

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

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

数据的正确与否对最终结果影响很大

比如商品的库存,股市的牌价等

一级缓存

一级缓存会话 session 级别的缓存,针对一次会话操作内,默认开启

在这里插入图片描述

public static void main(String[] args) {
		
		SqlSession sqlSession = DaoUtil.getSqlSession();
		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);
   		Student s = stuMapper.findStudentBySid(1);
    
    	//SqlSession sqlSession2 = DaoUtil.getSqlSession();
		//StudentMapper stuMapper2 = sqlSession2.getMapper(StudentMapper.class);
		Student s2 = stuMapper2.findStudentBySid(1);

		System.out.println(s == s2);//true
		
		//		DaoUtil.closeResource(sqlSession);
		
		// 1. 不同的SqlSession
		SqlSession sqlSession2 = DaoUtil.getSqlSession();
		StudentMapper stuMapper2 = sqlSession2.getMapper(StudentMapper.class);		
		
		Student s2 = stuMapper2.findStudentBySid(1);
		System.out.println(s2);

		System.out.println(s == s2);//false
		DaoUtil.closeResource(sqlSession2);
		
		// 2. 在同一个sqlSession中进行增删改操作
		int ret = stuMapper.addStudent(new Student());
		System.out.println(ret);
		
		// 3. 主动的清空缓存
		sqlSession.clearCache();
		
		// 4. sql语句不同
		Student s2 = stuMapper.findStudentBySid(1);
		System.out.println(s2);
		
		System.out.println(s == s2);
		DaoUtil.closeResource(sqlSession);	
	}

一级缓存失效的四种情况

  1. 不同SqlSession对应不同的一级缓存
  2. 同一个SqlSession单查询条件不同
  3. 同一个SqlSession两次查询期间执行了任何一次增删改操作
  4. 同一个SqlSession两次查询期间手动清空了缓存

二级缓存

不会用的

在这里插入图片描述

在这里插入图片描述

特点:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/331930.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Air780E开发板开发环境搭建

开发板原理图 开发软件 下载网站 https://luatos.com/luatools/download/last 使用教程 烧录教程 - LuatOS 文档 开发流程 首先下载最新版本的Luatools 然后新建一个Luatools文件夹&#xff0c;将下载的exe文件放入其中后&#xff0c;再打开exe文件&#xff08;会生成目…

《WebKit 技术内幕》之四(2): 资源加载和网络栈

2.Chromium 多进程资源加载 2,1 多进程 资源的实际加载在各个WebKit移植中有不同的实现。Chromium采用的多进程的资源加载机制。 ResourceHandle 类之下的部分是不同移植对获取资源的不同实现&#xff0c;Chromium 中是 多进程资源加载 。主要是多个Renderer进程和Browser进程…

SystemVerilog验证测试平台

2.2定宽数组 相比于 Verilog1995中的一维定宽数组, System verilog提供了更加多样的数组类型,功能上也大大增强。 2.2.1定宽数组的声明和初始化 Verilog要求在声明中必须给出数组的上下界。因为几乎所有数组都使用0作为索引下界,所以 System verilog允许只给出数组宽度的便捷声…

华为DHCP配置

1. 全局地址池和接口地址池的应用场景有什么不同呢&#xff1f; 答&#xff1a;接口地址池适用于当前接口只给DHCP client分配与接口同一网段的IP地址的场景。 全局地址池可以给DHCP Client分配与接口同网段的IP地址&#xff0c;也可以分配不同网段的IP地址&#xff08;DHCP中…

Python爬虫 - 网易云音乐下载

爬取网易云音乐实战&#xff0c;仅供学习&#xff0c;不可商用&#xff0c;出现问题&#xff0c;概不负责&#xff01; 分为爬取网易云歌单和排行榜单两部分。 因为网页中&#xff0c;只能显示出歌单的前20首歌曲&#xff0c;所以仅支持下载前20首歌曲&#xff08;非VIP音乐&…

滑动窗口经典入门题-——长度最小子数组

文章目录 算法原理题目解析暴力枚举法的代码优化第一步初始化第二步right右移第三步left右移 滑动窗口法的代码 算法原理 滑动窗口是一种在序列&#xff08;例如数组或链表&#xff09;上解决问题的算法模式。它通常用于解决子数组或子字符串的问题&#xff0c;其中滑动窗口表示…

【Redis】Redis基础

Redis基础 初识Redis 认识NoSQL SQL&#xff1a;结构化查询语言 > 关系型数据库 NoSQL&#xff1a;非关系型数据库 SQL与NoSQL的差异&#xff1a; 数据结构 SQL结构化&#xff1a;表的信息依赖于表的结构NoSQL非结构化&#xff1a;存储的信息为KV形式 数据关联 SQL关联…

Android NDK Crash信息收集捕获和日志异常定位分析(addr2line)

Android NDK 闪退日志收集与分析 我们在开发过程中,Android JNI层Crash问题或者我们引用的第三方.so库文件报错,都是一个比较头疼的问题。相对Java层来说,由于c/c++造成的crash没有输出如同Java的Exception Strace堆栈信息,所以定位问题也是个比较艰难的事情。 Google Br…

Nomogram文献分析:提取数据

前言 今天教大家如何分析Nomogram类型的文章&#xff0c;并使用我们开发的系统零代码提取数据。 系统地址&#xff1a;https://clinicaldata.fun/ 要分析的文章&#xff1a;https://pubmed.ncbi.nlm.nih.gov/36504658/ 。这是一篇典型的mimic-iii数据分析的套路&#xff0c;…

智能小程序开发项目步骤流程

快速开始 在开发小程序之前&#xff0c;请确保电脑上已经安装node运行环境。可前往Node.js官网(opens in a new tab)下载安装。智能小程序环境搭建和面板小程序一致&#xff0c;请参考面板小程序搭建环境指南。 开发小程序的流程&#xff1a; 使用涂鸦开发者 IoT 账号登录 T…

c语言-结构体内存对齐

文章目录 前言一、结构体内存对齐总结 前言 本篇文章介绍结构体内存对齐。 一、结构体内存对齐 定义两个结构体&#xff1a; struct S1 {char c1;int i;char c2; };struct S2 {char c1;char c2;int i; }; //输出结构体大小 int main() {printf("%u\n", sizeof(st…

未来能源转型之路:2023年第十三届中国国际储能大会启示录

在2023年第十三届中国国际储能大会上&#xff0c;全球各地的能源专家、学者和企业代表齐聚一堂&#xff0c;共同探讨了储能技术在推动能源转型中的重要作用。对于我们普通人来说&#xff0c;从这场大会中可以学到什么呢&#xff1f; 一、储能技术是未来能源发展的关键 随着可再…

李沐《动手学深度学习》线性神经网络 softmax回归

系列文章 李沐《动手学深度学习》预备知识 张量操作及数据处理 李沐《动手学深度学习》预备知识 线性代数及微积分 李沐《动手学深度学习》线性神经网络 线性回归 目录 系列文章一、softmax回归&#xff08;一&#xff09;问题背景&#xff08;二&#xff09;网络架构&#xf…

win11启动docker desktop报错 docker desktop unexpected wsl error

win11启动docker desktop报错 docker desktop unexpected wsl error 解决方式&#xff0c; 第一步&#xff1a;控制面板-启动或关闭windows功能窗口勾选下面两个框框 第二步&#xff1a;执行我下面这些命令&#xff0c;不需要重启电脑

Linux:shell脚本:基础使用(7)《exit和break》

exit是结束脚本&#xff0c;不论在脚本任何地方使用&#xff0c;这个脚本就会立马结束&#xff0c;不会继续执行后面的所有命令 break 是结束循环&#xff0c;break只能在循环中使用&#xff0c;并且只对距离自己最近的循环生效&#xff0c;如果循环嵌套循环那么break在哪个循环…

js菜单隐藏显示

1、树状结构对应的表: 2、生成menulist的SQL语句 select {"id":"MenuID","parent":"ParentID","FirstLvMenu":"FirstLvMenu", "text":"MenuName","url":"MenuUrl",&quo…

Linux基础命令和文件操作理解

1.基础命令 快捷键 ctrl alt t 打开终端 ctrl e 跳转终端输入的末尾 ctrl u 清除一行的命令数据 ctrl a 跳转到终端命令开头 ctrl l 清除整个屏幕&#xff0c;不包括当前行 ctrl r 搜索命令 开启历史模式 寻找最近记录的命令&#xff1a;↑ ↓ 移动光标位置 &#xff1a;← →…

游戏《泰坦陨落2》msvcr120.dll丢失的多种解决方法分享

在Windows 11操作系统环境下&#xff0c;众多玩家在体验《泰坦陨落2》这款备受瞩目的射击游戏时&#xff0c;遭遇了一个令人困扰的技术问题&#xff1a;系统提示缺失msvcr120.dll文件。这一关键的动态链接库文件对于游戏的正常运行至关重要&#xff0c;它的缺失直接导致了《泰坦…

拿出最少数目的魔法豆

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 请你从每个袋子中 拿出 一些豆子&#xff08;也可以 不拿出&#xff09;&#xff0c;使得剩…

基于Python+django影片数据爬取与数据分析设计与实现

目录 一、 前言介绍&#xff1a; 二 、功能设计&#xff1a; 三、功能实现&#xff1a; 系统登录实现 管理员实现 用户模块实现 四、库表设计&#xff1a; 五、关键代码&#xff1a; 六、论文参考&#xff1a; 七、其他案例&#xff1a; 八、源码获取&#xff1a; 一…