Mybatis的分页,延迟加载和缓存

news2025/1/11 14:30:47

目录

分页:

 方式一:利用 limit 实现物理分页

利用limit的关键字分页

方式二:RowBounds集合逻辑分页

方式三:插件分页

延迟加载和立即加载:

什么是立即加载:

什么是延迟加载

延迟加载的配置

缓存:

什么是缓存:

特点:

限制:

缓存的术语:

什么是Mybatis缓存:

缓存的适用性:

Mybatis缓存的分类:

一级缓存:

一级缓存失效的情况:

二级缓存:

自定义缓存:


在Mybatis中,我们对于查询到的大量数据有不同的需求,那么在处理时,必然涉及到分页问题,拿去数据时,必然会涉及缓存问题。下面,我将对Mybatis中的分页和缓存作以详解

分页:

 方式一:利用 limit 实现物理分页

特点:此种方式,本身就会在数据库分好页,将所需的数据IO读取。

利用limit的关键字分页

例如:(以注解为例)

接口中:

@Select("select * from student  limit #{weizhi},#{bc}")
	public List<Student> findStudentlimit(
			@Param("weizhi")int  weizhi,
			@Param("bc")int bc);

测试:

public static void main(String[] args) {
		
		SqlSession sqlSession = DaoUtil.getSqlSession();
		
		StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        //位置是从0开始的,
        //此处为从第二条数据开始,取三条数据
        List<Student> list = mapper.findAllStudentlimit(1,3);
        
        list.forEach(System.out::println);
}

结果

方式二:RowBounds集合逻辑分页

特点:此种方式会将所有的数据先IO读取到内存,再分页。

此种方式需要创建一个RowBounds对象,内部有参构造表示,其实位置和步长

接口方法

	//方式er:RowBounds  逻辑分页
	@Select("select * from student")
	public List<Student> findAllStudent(RowBounds rs);

测试:

public static void main(String[] args) {
		
		SqlSession sqlSession = DaoUtil.getSqlSession();
		StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        //注意:内部有参构造
        //第一个:第几页
        //第二个:表示步长
        RowBounds rs  = new RowBounds(3,2);
		List<Student> list1 = mapper.findAllStudent(rs);
		list1.forEach(System.out::println);
}

结果:

方式三:插件分页

注意:此种方式可以获取page对象和pageInfo都西昂

page对象:内部包含了pageNum表示当前页码,pageSize表示每页显示的数据条数等

pageInfo对象:比page包含更加全面,涉及页码等,展示。

所需插件jar:

jsqlparser-3.2.jar

pagehelper-5.2.0.jar

地址:

链接: https://pan.baidu.com/s/1scBpuL4Pf3kt0MIu_qc6ig?pwd=1111 提取码: 1111

此种方式也需要先在主配置文件配置插件

接口

//方式三:第三方插件  PageHelper
	@Select("select * from student")
	public List<Student> findAllStudentPageHelper();

测试:

public static void main(String[] args) {
		
		SqlSession sqlSession = DaoUtil.getSqlSession();
		StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
		
		//参数一:页数
		//参数二:步长
		Page<Object> page = PageHelper.startPage(7,2);
		
		
		List<Student> list = mapper.findAllStudentPageHelper();
		
		PageInfo<Student> pageInfo = new PageInfo<Student>(list);
		list.forEach(System.out::println);
		
		System.out.println(page);
		
		System.out.println(pageInfo);
		DaoUtil.closeResouces(sqlSession);
		
	}

结果

延迟加载和立即加载:

什么是立即加载:

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

比如:
当我们查询学生信息时,就需要知道学生在哪个班级中,所以就需要立马去查询班级的信息
通常:当 一对一或者 多对一的时候需要立即加载
什么是延迟加载

        在真正使用数据时才发起查询,不用的时候不查询

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

全局配置

单个级联懒加载配置

        lazy=true:表明开启懒加载

 <!-- 用户对订单的一对多关联配置 -->
  <resultMap id="userOrderMap" type="com.example.model.User">
    <id property="id" column="user_id"/>
    <result property="username" column="username"/>
    <collection property="orders" ofType="com.example.model.Order" 
                select="selectOrdersByUser" column="user_id" lazy="true"/>
  </resultMap>

缓存:

什么是缓存:

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

特点:

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

限制:

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

缓存的术语:

        命中:需要的数据在缓存中找到结果

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

什么是Mybatis缓存:

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

        方式:配置和定制

缓存的适用性:

        适合缓存:

                经常查询,并且不经常改变的

                数据的正确与否对最终结果影戏不大的

                比如,一个公司的介绍,新闻等

        不适合缓存

                经常改变的数据

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

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

Mybatis缓存的分类:

        一级缓存:SqlSession级别的缓存,针对一次会话操作内

        二级缓存:映射器级别的缓存,针对factory级别的

        自定义缓存:自定义缓存实现,例如redis

一级缓存:

任何一次增删改操作都会清空缓存

测试:

一级缓存的工作流程:

        1.对于某个select statement,根据该statement生成key

        2.判断 Loca Cache中,该key是否对应的数据存在

        3.如果命中,则跳过查询数据库,继续往下走

缓存命中

缓存未命中:

        4.如果未命中,去数据库中查询数据,得到查询结果

         5.将key 和查询到的结果作为key和value,放入Local Cache中

        6.将查询结果返回

        7.判断缓存级别是否为Statement级别,如果是,清空本地缓存

一级缓存失效的情况:

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

        2.同一个SqlSession但查询条件不同

        3.一个SqlSession 两次查询期间完成了任何一次增删改操作

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

二级缓存:

配置二级缓存:

注解式配置

二级缓存小结(现在不用了):

        Mybatis的二级缓存相对于一级缓存来说,实现了缓存数据的共享,可控性也更强

        极大可能会数据出多,有设计缺陷,安全使用的条件苛刻

        分布式环境下,必然会出现读取到错误数据,不推荐使用

自定义缓存:

实现缓存接口:实现 org. apache. ibatis. cache. Cache 接口自定义缓存;

引入第三方缓存:引入 Redis 等第三方内存库 作为 MyBatis 缓存。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XSS漏洞洞讲解

目录 一、XSS漏洞的定义 1.什么是XSS漏洞&#xff1f; 二、XSS漏洞的类型 1.反射型 XSS 2.DOM型 XSS 3.存储型 XSS 三、实战案例演练 第1关 Ma Spaghet 第2关 Jefff 第3关 Ugandan Knuckles 第4关 Ricardo Milos 第5关 Ah Thats Hawt 第6关 Ligma ​第7关 Mafia …

c++ 使用Tesseract5.0 识别图片文字示例

Tesseract5.0相对于旧版本的程序&#xff0c;识别精准度会提升不少&#xff0c;如下&#xff1a; 1、示例1&#xff1a; 图片&#xff1a; 结果&#xff1a; 2、示例2&#xff1a; 图片&#xff1a; 结果&#xff1a; c代码如下&#xff1a; #include <iostream> #in…

C++ 设计模式——建造者模式

建造者模式 建造者模式组成部分建造者模式使用步骤1. 定义产品类2. 创建具体产品类3. 创建建造者接口4. 实现具体建造者5. 创建指挥者类6. 客户端代码 建造者模式 UML 图建造者模式 UML 图解析建造者模式的优缺点建造者模式的适用场景完整代码 建造者模式 建造者模式&#xff…

Hogan 阻抗控制的理解

机器人阻抗控制是一种基于力的控制方法,它通过调节机器人在受到外部力作用时所表现出的抵抗能力(即阻抗),来实现与环境的良好交互。以下是对机器人阻抗控制的详细理解: 一、阻抗控制的基本原理 阻抗控制的核心思想是通过模拟物体的力学特性(如刚度、阻尼和质量),使机…

定时器处理按键抖动

一、按键的抖动 1.按键的定义和原因 按键抖动是由于‌机械按键在闭合和断开时&#xff0c;由于触点的弹性作用&#xff0c;会产生一系列的抖动现象。这种抖动对于人类来说几乎感觉不到&#xff0c;但对‌单片机来说&#xff0c;却是一个可以感应到的过程&#xff0c;且处理时…

SQL - 设计数据库

数据建模 数据建模就是为要存储在数据库中的数据创建模型的过程 步骤 1.理解和分析业务需求 (收集信息) 收集需求&#xff0c;明确业务流程&#xff0c;定义数据需求&#xff0c;分析业务规则 2.构建业务的概念模型 (识别和表示业务中实体、事务或概念以及它们之间的关系) 识别…

APP支付宝授权获取code uniapp

1.点击使用plus.runtime跳转打开支付宝 //打开支付宝授权&#xff0c;在支付宝APP中授权后会在支付宝中跳转到你填写的h5地址//urls是授权地址可以后端拼接也可以前端写死 //以下是一个拼接示例&#xff0c;需修改app_id的值和redirect_uri的值即可 //app_id是商户的APPID&…

WorkPlus-为用户提供IM即时通讯和实时音视频通信本地化服务

WorkPlus作为一家领先的企业级通讯解决方案提供商&#xff0c;为用户提供了本地化服务&#xff0c;以满足IM即时通讯和实时音视频通信的需求。本文将深入探讨WorkPlus本地化服务的重要性以及其为用户提供的IM即时通讯和实时音视频通信的解决方案。 一、本地化服务的意义 低延迟…

【动态规划、dp】[CSP-J 2022] 上升点列 题解

题目描述 在一个二维平面内&#xff0c;给定 n n n 个整数点 ( x i , y i ) (x_i, y_i) (xi​,yi​)&#xff0c;此外你还可以自由添加 k k k 个整数点。 你在自由添加 k k k 个点后&#xff0c;还需要从 n k n k nk 个点中选出若干个整数点并组成一个序列&#xff0c…

从0开始搭建vue + flask 旅游景点数据分析系统(十三)vue + flask 图片上传、用户头像更改

项目是基于我的博文&#xff1a;vue flask 旅游景点数据分析系统 基础上做的&#xff0c;可以参考之前的博客文章。 1 前端修改 主要是修改Profile.vue <!-- 头像上传 --><el-form-item label"头像"><el-uploadclass""action"/api/…

使用 Fyne 构建 GUI 应用:设置标签文本和自增计数器

引言 Fyne 是一个用 Go 语言编写的跨平台 GUI 框架&#xff0c;它提供了一套丰富的组件来帮助开发者快速构建出漂亮的用户界面。在本文中&#xff0c;我们将通过一个简单的案例来演示如何使用 Fyne 创建 GUI 应用程序&#xff0c;该程序包含设置标签文本和自增计数器的功能。 …

按钮(Buttons)-Qt-思维导图-学习笔记

按钮(Buttons) 按钮在 Qt 中的重要性 按钮是 Qt 中最常用的控件之一 通过点击按钮&#xff0c;可以响应事件&#xff0c;实现人机交互效果 按钮在嵌入式系统和 PC 端的界面交互中都是不可或缺的 Qt 内置的六种按钮部件 QPushButton&#xff1a;下压按钮 用法示例 项目创建与…

指针详解(三)

目录 1. 数组名 2. 使用指针访问数组 3. 一维数组传参的本质 4. 冒泡排序 5. 二级指针 6. 指针数组 7. 指针数组模拟二维数组 1. 数组名 在使用指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];/…

CV党福音:YOLOv8实现实例分割(二)之训练过程

在上一篇博客中&#xff0c;我们已经了解了YOLOv8实例分割的基本流程&#xff0c;本章则是对数据集、以及训练过程等进行进一步的学习。 文章目录 训练整体流程语义分割与实例分割数据集开启训练训练Debug数据封装损失函数初始化前向传播 总结 训练整体流程 训练模型的整体流…

洗衣机洗衣服一些知识

01智能:按衣物多少自动调节合适水位的标准洗涤程序 (需要30分钟时间) 02:大物:较大,较厚的衣服洗涤 03:轻柔:毛织品或内衣洗涤 04:快速:少量清污衣服洗涤 (13分钟) 05:浸泡:先浸泡一段时间再洗涤 06:单洗:只洗衣不脱水 07:单脱:只脱水不洗衣 08:洁桶:清洁洗衣桶 准备工作: (1)…

XSS反射型和DOM型+DOM破坏

目录 第一关 源码分析 payload 第二关 源码分析 payload 第三关 源码分析 payload 第四关 源码分析 payload 第五关 源码分析 payload 第六关 源码分析 第七关 源码分析 方法一&#xff1a;构造函数 方法二&#xff1a;parseInt 方法三&#xff1a;locat…

龙门吊(天车)防撞方案

防撞雷达设备&#xff0c;是一款基于无线微波技术自主研发的应答式高精度无线防撞产品&#xff0c;该产品具有测距精度高&#xff08;最高可到10厘米&#xff09;&#xff0c;测距稳定&#xff0c;无累计误差&#xff0c;粉尘、水汽不影响测距精度&#xff0c;抗电磁干扰等特点…

oracle数据库目录及文件

oracle数据库目录及文件 oracle安装后所有根目录 1、admin 目录 里边有不同文件夹&#xff0c;代表一个实例&#xff0c;记录 Oracle 实例的配置&#xff0c;运行日志等文件。每个实例一个目录。 SID&#xff1a;System IDentifier 的缩写&#xff0c;是 Oracle 实例的唯一标记…

IT服务标准化知识体系攻略(至简)

标准是为了在一定范围内获得最佳秩序 &#xff0c;经协商一致制定并由公开机构批准共同使用和重复使用的和中规范性文件。标准是标准化活动的主要成果之一。国家标准的制定有一套正常程序&#xff0c;分为预阶段、立项阶段、起草阶段、征求意见阶段、审查阶段、批准阶段、出版阶…

【区块链+金融服务】第一创业证券开发银行间报价 Dapp | FISCO BCOS应用案例

在银行间市场现券交易的过程中&#xff0c;通过银保监会发牌的代理机构进行报价交易&#xff0c;已解决无代理阶段存在的许多问题。 但是由于业务需要&#xff0c;使用以前模式进行报价交易的仍占有一定比例。 针对这一现状&#xff0c;第一创业证券基于 FISCO BCOS 区块链底层…