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

12. 如何在MyBatis中进行分页查询?常见的分页实现方式有哪些?

在MyBatis中,分页查询是一种常见的需求,尤其是在处理大数据量的情况下。MyBatis本身不直接提供分页功能,但可以通过以下几种常见的实现方式来实现分页查询。

1. 手动分页

这是最基本的分页方式,直接在SQL语句中添加分页参数。不同的数据库分页语法不同,以下是一些常见数据库的分页实现。

1.1 MySQL中的分页

<select id="findUsersByPage" resultType="User">SELECT * FROM usersLIMIT #{offset}, #{pageSize}
</select>
  • LIMIT #{offset}, #{pageSize}offset表示起始行偏移量,pageSize表示每页的记录数。

1.2 Oracle中的分页

<select id="findUsersByPage" resultType="User">SELECT * FROM (SELECT A.*, ROWNUM AS RNFROM (SELECT * FROM users ORDER BY id) AWHERE ROWNUM <= #{endRow})WHERE RN > #{startRow}
</select>
  • Oracle使用ROWNUM来实现分页,其中startRowendRow分别表示分页的起始和结束行号。

1.3 SQL Server中的分页

<select id="findUsersByPage" resultType="User">SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNum, *FROM users) AS resultWHERE RowNum BETWEEN #{startRow} AND #{endRow}
</select>
  • SQL Server中,使用ROW_NUMBER()函数进行分页,并结合BETWEEN语句来筛选行号范围。

2. 使用RowBounds对象进行分页

MyBatis提供了RowBounds对象用于内存分页。它会将查询结果集限制在指定的行数内。这种方式不依赖于数据库的分页语法,而是通过Java内存进行分页。

2.1 使用RowBounds分页

List<User> findUsers(RowBounds rowBounds);
java复制代码RowBounds rowBounds = new RowBounds(offset, pageSize);
List<User> users = userMapper.findUsers(rowBounds);
  • RowBounds通过offsetlimit进行分页。

2.2 注意事项

  • RowBounds会将查询的所有结果集加载到内存中,然后进行分页处理,这对大数据量查询效率较低,适合小数据量分页场景。

3. 使用分页插件

分页插件是一种更为高效和方便的方式,特别是在大型项目中。分页插件会自动拦截查询SQL,并在其基础上增加分页逻辑。

3.1 MyBatis-PageHelper插件

PageHelper是MyBatis的一个常用分页插件,它通过拦截SQL语句并追加分页语句来实现分页查询。

  • Maven依赖

    <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.0</version>
    </dependency>
  • 配置方式

    @Configuration
    public class MyBatisConfig {@Beanpublic PageHelper pageHelper() {PageHelper pageHelper = new PageHelper();Properties properties = new Properties();properties.setProperty("helperDialect", "mysql");properties.setProperty("reasonable", "true");properties.setProperty("supportMethodsArguments", "true");pageHelper.setProperties(properties);return pageHelper;}
    }
  • 使用方式

    PageHelper.startPage(pageNum, pageSize);
    List<User> users = userMapper.findAll();
    PageInfo<User> pageInfo = new PageInfo<>(users);
    • PageHelper.startPage(pageNum, pageSize):设置分页参数,pageNum表示当前页码,pageSize表示每页显示的记录数。

    • PageInfo<User>PageInfo是一个分页结果对象,包含了分页后的信息,如总页数、总记录数等。

3.2 MyBatis-Plus中的分页插件

MyBatis-Plus也提供了分页插件,使用方式类似于PageHelper。

  • Maven依赖

    <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3.4</version>
    </dependency>
  • 配置方式

    @Configuration
    public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
    }
  • 使用方式

    Page<User> page = new Page<>(pageNum, pageSize);
    IPage<User> userPage = userMapper.selectPage(page, null);
    • Page<>(pageNum, pageSize):构建分页参数对象。

    • IPage<User>:MyBatis-Plus中的分页结果对象,包含分页后的数据和分页信息。

4. 数据库支持的分页查询

有些数据库(如MySQL、PostgreSQL)天生支持分页查询,可以直接在SQL语句中使用LIMITOFFSET等关键字进行分页,而其他数据库(如Oracle)则需要使用子查询或窗口函数来实现分页。

总结

在MyBatis中实现分页查询的方式主要有以下几种:

  1. 手动分页:直接在SQL中编写分页语句,适合于需要控制分页SQL的场景,但需要根据不同数据库编写不同的分页SQL。

  2. RowBounds分页:MyBatis提供的内存分页方法,适合小数据量分页,但不推荐大数据量使用。

  3. 分页插件:如PageHelper、MyBatis-Plus分页插件,通过拦截器方式实现分页,自动生成分页SQL,适合大多数场景,性能较好。

选择哪种分页方式应根据项目的实际需求、数据量大小以及开发的复杂性进行权衡。对于大多数场景,使用分页插件是一个简单高效的选择。

相关文章:

12. 如何在MyBatis中进行分页查询?常见的分页实现方式有哪些?

在MyBatis中&#xff0c;分页查询是一种常见的需求&#xff0c;尤其是在处理大数据量的情况下。MyBatis本身不直接提供分页功能&#xff0c;但可以通过以下几种常见的实现方式来实现分页查询。 1. 手动分页 这是最基本的分页方式&#xff0c;直接在SQL语句中添加分页参数。不同…...

@[TOC](力扣题目-滑动窗口-qsort排序-二分法查找)

通信 LCR 009. 乘积小于 K 的子数组268. 丢失的数字287. 寻找重复数 LCR 009. 乘积小于 K 的子数组 已解答 滑动窗口 给定一个正整数数组 nums和整数 k &#xff0c;请找出该数组内乘积小于 k 的连续的子数组的个数。 示例 1: 输入: nums [10,5,2,6], k 100 输出: 8 解释…...

Docker容器相关命令

Docker是一种容器化技术&#xff0c;可以帮助用户更轻松地创建、部署和管理容器。下面是一些常见的Docker容器管理任务&#xff1a; 创建容器&#xff1a;使用Docker镜像创建一个新的容器。 docker run image_name列出容器&#xff1a;查看当前运行的容器列表。 docker ps启动容…...

【老课推荐】基于LangChain和知识图谱的大模型医疗问答机器人项目

在当今数据驱动和人工智能主导的时代&#xff0c;大模型和知识图谱的结合是一个重要的研究和应用方向。大模型实战课程通过48课时&#xff0c;分为六个主要章节&#xff0c;涵盖了从基本概念到高级应用的多方面内容。学员将通过本课程学习如何使用LangChain和OpenAI进行开发&am…...

Adobe Sensei——自动化视频编辑、特效应用和素材增强,通过AI技术快速优化视频内容,自动修复视频质量、自动添加背景音乐或字幕

一、Adobe Sensei介绍 Adobe Sensei 是 Adobe 公司开发的一款基于人工智能和机器学习技术的平台&#xff0c;旨在增强其各种创意、文档和体验管理工具。Adobe Sensei 通过深度学习、计算机视觉、自然语言处理&#xff08;NLP&#xff09;等先进技术&#xff0c;帮助用户在 Ado…...

【AIGC数字人】EchoMimic:基于可编辑关键点条件的类人音频驱动肖像动画

GitHub&#xff1a;https://github.com/BadToBest/EchoMimic 论文&#xff1a; https://arxiv.org/pdf/2407.08136 comfyui&#xff1a; https://github.com/smthemex/ComfyUI_EchoMimic 相关工作 Wav2Lip Wav2Lip是一个开创性的工作 &#xff0c;但输出会出现面部模糊或扭…...

变量数据类型 Day3

1. 变量 1.1 变量的概念 变量是计算机内存中的一块存储单元&#xff0c;是存储数据的基本单元变量的组成包括&#xff1a;数据类型、变量名、值&#xff0c;后文会具体描述变量的本质作用就是去记录数据的&#xff0c;比如说记录一个人的身高、体重、年龄&#xff0c;就需要去…...

SpringBoot2:请求处理原理分析-RESTFUL风格接口

一、RESTFUL简介 Rest风格支持&#xff08;使用HTTP请求方式&#xff0c;动词来表示对资源的操作&#xff09; 以前&#xff1a;/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在&#xff1a; /user GET-获取用户 DELETE-删除用户 PUT-修改…...

[Linux][配置]Linux修改history存储的最大记录数

Linux修改History最大记录为20000行 sed -i s/^HISTSIZE1000/HISTSIZE20000/ /etc/profile source /etc/profile 在 Linux 系统中&#xff0c;HISTSIZE 环境变量用于定义历史记录的大小&#xff0c;即在终端中可以回溯的命令数量。默认情况下&#xff0c;这个值通常是 1000&…...

代码随想录 刷题记录-28 图论 (5)最短路径

一、dijkstra&#xff08;朴素版&#xff09;精讲 47. 参加科学大会 思路 本题就是求最短路&#xff0c;最短路是图论中的经典问题即&#xff1a;给出一个有向图&#xff0c;一个起点&#xff0c;一个终点&#xff0c;问起点到终点的最短路径。 接下来讲解最短路算法中的 d…...

大数据-124 - Flink State 01篇 状态原理和原理剖析:状态类型 执行分析

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...

C++复习day04

一、函数重载 1.什么是函数重载&#xff1f; 自然语言中&#xff0c;一个词可以有多重含义&#xff0c;人们可以通过上下文来判断该词真实的含义&#xff0c;即该词被重 载了。 比如&#xff1a;以前有一个笑话&#xff0c;国有两个体育项目大家根本不用看&#xff0c;也不用…...

[苍穹外卖]-04菜品管理接口开发

效果预览 新增菜品 需求分析 查看产品原型分析需求, 包括用到哪些接口, 业务的限制规则 业务规则 菜品名称必须是唯一的菜品必须属于某个分类下, 不能单独存在新增菜品时可以根据情况选择菜品的口味每个菜品必须对应一张图片 接口设计 根据类型查询分类接口 文件上传接口 …...

gitlab 启动/关闭/启用开机启动/禁用开机启动

文章目录 启动 gitlab关闭 gitlab查看 gitlab 运行状态启用 gitlab 开机启动禁用 gitlab 开机启动GitlabGit启动 gitlab hxstrive@localhost:~$ sudo gitlab-ctl start ok: run: alertmanager: (pid 65953) 0s ok: run: gitaly: (pid 65965) 0s ok: run: gitlab-exporter: (pi…...

中间件解析漏洞(附环境搭建教程)

⼀&#xff1a;IIS解析漏洞 环境资源&#xff1a; https://download.csdn.net/download/Nai_zui_jiang/89717504 环境安装 windows2003iis6 1.创建新的虚拟机 2.在下⼀步中选择我们的iso⽂件镜像 vm已主动识别到windows2003 3.产品密钥⽹上搜⼀个 密码自己设置一个简单的&…...

matlab实现kaiser窗+时域采样序列(不管原信号拉伸成什么样子)是一样的,变到频谱后再采样就是一样的频域序列。

下图窗2的频谱在周期化的时候应该是2&#xff08;w-k*pi/T&#xff09;我直接对2w减得写错了 可见这两个kaiser窗频谱不一样&#xff0c;采样间隔为2T的窗&#xff0c;频谱压缩2倍&#xff0c;且以原采样频率的一半周期化。 但是这两个不同的kaiser窗在频域采样点的值使完全一…...

git为不同的项目设置不同的提交作者

方法1&#xff1a;找到项目的.git文件夹打开 打开config在下面添加自己作者信息 [user]name 作者名email 邮箱方法2&#xff1a;直接在.git文件夹设置作者名&#xff08;不使用–global参数&#xff09; git config user.name "xxxxx"如果想要修改之前提交的…...

防爆定位信标与防爆定位基站有什么区别?

新锐科技 https://baijiahao.baidu.com/s?id1804974957959442238&wfrspider&forpc http://www.xinruikc.cn/biaoqian/52.html http://www.xinruikc.cn/xinbiao/...

QT 编译报错:C3861: ‘tr‘ identifier not found

问题&#xff1a; QT 编译报错&#xff1a;C3861&#xff1a; ‘tr’ identifier not found 原因 使用tr的地方所在的类没有继承自 QObject 类 或者在不在某一类中&#xff0c; 解决方案 就直接用类名引用 &#xff1a;QObject::tr( )...

谈谈ES搜索引擎

一 ES的定义 ES 它的全称是 Elasticsearch&#xff0c;是一个建立在全文搜索引擎库Lucene基础上的一个开源搜索和分析引擎。ES 它本身具备分布式存储&#xff0c;检索速度快的特性&#xff0c;所以我们经常用它来实现全文检索功能。目前在 Elastic 官网对 ES 的定义&#xff0c…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

【51单片机】4. 模块化编程与LCD1602Debug

1. 什么是模块化编程 传统编程会将所有函数放在main.c中&#xff0c;如果使用的模块多&#xff0c;一个文件内会有很多代码&#xff0c;不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里&#xff0c;在.h文件里提供外部可调用函数声明&#xff0c;其他.c文…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)

目录 &#x1f50d; 若用递归计算每一项&#xff0c;会发生什么&#xff1f; Horners Rule&#xff08;霍纳法则&#xff09; 第一步&#xff1a;我们从最原始的泰勒公式出发 第二步&#xff1a;从形式上重新观察展开式 &#x1f31f; 第三步&#xff1a;引出霍纳法则&…...