MyBatis 中如何使用分页

news2024/11/25 22:56:45

MyBatis 中如何使用分页

在实际的项目开发中,我们经常需要对数据库中的数据进行分页查询,以提高数据查询的效率和用户体验。MyBatis 是一种流行的 Java 持久层框架,它提供了多种分页查询的方式,本文将介绍其中常用的两种方式:基于 ROW_NUMBER() 函数和基于 LIMIT 和 OFFSET 关键字。

在这里插入图片描述

基于 ROW_NUMBER() 函数的分页查询

ROW_NUMBER() 函数是一种用于生成行号的窗口函数,它可以在查询结果中为每一行生成一个递增的行号。基于 ROW_NUMBER() 函数的分页查询可以通过以下步骤实现:

  1. 编写 SQL 语句,使用 ROW_NUMBER() 函数为每一行数据生成一个行号,并根据行号进行排序。
SELECT * FROM (
  SELECT ROW_NUMBER() OVER (ORDER BY id ASC) AS row_num, *
  FROM user
) AS temp
WHERE row_num BETWEEN #{start} AND #{end}

在上面的 SQL 语句中,我们使用 ROW_NUMBER() 函数为 user 表中的每一行数据生成一个行号,并按照 id 升序排列。然后,我们将这个 SQL 语句作为一个子查询,将其结果作为临时的表格,并在外部的查询中使用 WHERE 子句筛选出指定的行号范围。

  1. 在 Mapper 接口中定义一个方法,使用 @Select 注解将 SQL 语句与方法绑定,并使用 @Param 注解指定方法参数的名称。
public interface UserMapper {
  @Select("SELECT * FROM ( " +
          "SELECT ROW_NUMBER() OVER (ORDER BY id ASC) AS row_num, * " +
          "FROM user " +
          ") AS temp " +
          "WHERE row_num BETWEEN #{start} AND #{end}")
  List<User> selectUserByRowNum(@Param("start") int start, @Param("end") int end);
}

在上面的代码中,我们使用 @Select 注解将 SQL 语句与 selectUserByRowNum() 方法绑定,并使用 @Param 注解指定方法参数的名称。注意,这里的方法参数名必须与 SQL 语句中的参数名一致。

  1. 在 Service 层中调用 Mapper 接口中定义的方法,并传入分页查询所需的参数。
int pageSize = 10;
int pageNum = 1;

List<User> users = userMapper.selectUserByRowNum((pageNum - 1) * pageSize + 1, pageNum * pageSize);

在上面的代码中,我们定义了每页显示的数据条数和当前页码,并根据这些参数计算出分页查询所需的起始行和结束行。然后,我们调用 Mapper 接口中定义的 selectUserByRowNum() 方法,并传入计算出的起始行和结束行作为方法参数。最后,我们将查询结果保存在一个 List 中。

基于 LIMIT 和 OFFSET 关键字的分页查询

MySQL 和 PostgreSQL 数据库都支持使用 LIMIT 和 OFFSET 关键字进行分页查询。基于 LIMIT 和 OFFSET 关键字的分页查询可以通过以下步骤实现:

  1. 编写 SQL 语句,使用 LIMIT 和 OFFSET 关键字指定查询结果的起始行和数据条数。
SELECT * FROM user LIMIT #{pageSize} OFFSET #{offset}

在上面的 SQL 语句中,我们使用 LIMIT 关键字指定查询结果的数据条数,使用 OFFSET 关键字指定查询结果的起始行。

  1. 在 Mapper 接口中定义一个方法,使用 @Select 注解将 SQL 语句与方法绑定,并使用 @Param 注解指定方法参数的名称。
public interface UserMapper {
  @Select("SELECT * FROM user LIMIT #{pageSize} OFFSET #{offset}")
  List<User> selectUserByLimitAndOffset(@Param("pageSize") int pageSize, @Param("offset") int offset);
}

在上面的代码中,我们使用 @Select 注解将 SQL 语句与 selectUserByLimitAndOffset() 方法绑定,并使用 @Param 注解指定方法参数的名称。注意,这里的方法参数名必须与 SQL 语句中的参数名一致。

  1. 在 Service 层中调用 Mapper 接口中定义的方法,并传入分页查询所需的参数。
int pageSize = 10;
int pageNum = 1;

int offset = (pageNum - 1) * pageSize;
List<User> users = userMapper.selectUserByLimitAndOffset(pageSize, offset);

在上面的代码中,我们定义了每页显示的数据条数和当前页码,并根据这些参数计算出分页查询所需的偏移量。然后,我们调用 Mapper 接口中定义的 selectUserByLimitAndOffset() 方法,并传入计算出的每页显示的数据条数和偏移量作为方法参数。最后,我们将查询结果保存在一个 List 中。

MyBatis 使用分页插件

MyBatis 还提供了一种方便的方式实现分页查询,即使用分页插件。分页插件可以在运行时自动拦截需要进行分页查询的 SQL 语句,并根据指定的分页参数对查询结果进行分页处理。

使用 MyBatis 分页插件可以通过以下步骤实现:

  1. 在 pom.xml 文件中添加 MyBatis 分页插件的依赖。
<dependency>
  <groupId>com.github.pagehelper</groupId>
  <artifactId>pagehelper</artifactId>
  <version>5.2.1</version>
</dependency>
  1. 在 MyBatis 的配置文件中配置分页插件。
<plugins>
  <plugin interceptor="com.github.pagehelper.PageInterceptor">
    <property name="helperDialect" value="mysql"/>
  </plugin>
</plugins>

在上面的配置中,我们使用 PageInterceptor 插件作为分页拦截器,并指定了数据库类型为 MySQL。

  1. 在 Mapper 接口中定义一个方法,使用 @Select 注解将 SQL 语句与方法绑定,并使用 PageHelper.startPage() 方法指定分页参数。
public interface UserMapper {
  @Select("SELECT * FROM user")
  List<User> selectAllUsers();
}

在上面的代码中,我们定义了一个 selectAllUsers() 方法,使用 @Select 注解将 SQL 语句与方法绑定。注意,这里没有指定分页参数。

  1. 在 Service 层中调用 Mapper 接口中定义的方法,并使用 PageHelper.startPage() 方法指定分页参数。
int pageSize = 10;
int pageNum = 1;

PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.selectAllUsers();

在上面的代码中,我们使用 PageHelper.startPage() 方法指定分页参数,并调用 Mapper 接口中定义的 selectAllUsers() 方法。PageHelper.startPage() 方法会自动拦截后续的 SQL 语句,并根据指定的分页参数进行分页处理。最后,我们将查询结果保存在一个 List 中。

总结

本文介绍了 MyBatis 中两种常用的分页查询方式:基于 ROW_NUMBER() 函数和基于 LIMIT 和 OFFSET 关键字。此外,还介绍了使用 MyBatis 分页插件实现分页查询的方法。无论使用哪种方式,都需要注意 SQL 语句的正确性和性能问题,并及时释放资源,以避免出现内存泄漏和资源浪费等问题。

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

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

相关文章

MySQL数据库详解

文章目录 引言1. SQL1.1 SQL通用语法1.2 SQL分类1.3 DDL1.3.1 数据库操作1.3.2 表操作1.3.2.1 表操作-查询创建1.3.2.2 表操作-数据类型1.3.2.3 表操作-修改1.3.2.3 表操作-删除 1.4 DML1.4.1 添加数据1.4.2 修改数据1.4.3 删除数据 1.5 DQL1.5.1 基本语法1.5.2 基础查询1.5.3 …

车载以太网之SOME/IP-SD专题篇

前言 首先,请问大家几个小小问题,你清楚: 你知道什么是SOME/IP SD吗?SOME/IP-SD报文是如何发送与接收的呢?SOME/IP-SD 存在哪几种Entry Type呢?SOME/IP-SD内部状态机转换又是如何?今天,我们就来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲: 目录…

Sentinel 规则详解

Sentinel 规则 流控规则 flow1、QPS流控2、并发线程数流控3、流控模式4、流控效果 熔断&#xff08;降级&#xff09;规则 degrade1、慢调用比例2、异常比例3、异常数 热点规则 param-flow授权规则 authority1、应用场景2、自定义来源3、授权规则配置 系统规则 前言&#xff1a…

代码随想录day1 | 704.二分查找 27.移除元素

一、二分 1、二分易错点 1、循环变量 while(left < right) 还是while(left <right)2、判断条件 if(num[mid] > tar) mid right 还是 mid right -12、循环不变量 [left, right] [left, right) (left, right]3、左闭右闭写法 当时左闭右闭时&#xff0c;while循…

2、基于kubeadm搭建K8S环境

目录 一、环境说明 二、初始化所有节点 三、修改三台服务器主机名&#xff0c;并写入host文件 四、调整内核参数 五、所有节点安装Docker 六、所有节点配置K8S源 七、所有节点安装kubeadm&#xff0c;kubelet和kubectl 八、部署 kubernetes Master 节点 九、k8s-node …

基于docker的keepalived+MySQL主从实现MySQL高可用

因生产需要对MySQL做高可用&#xff0c;同时&#xff0c;资源有限&#xff0c;因此采用双节点主从keepalived方式实现高勇。另外因需要大批量部署MySQL集群&#xff0c;需要采用模板化部署&#xff0c;本方案采用将MySQL容器化&#xff0c;实现MySQL模板化配置部署。 部署环境及…

SpringMVC学习笔记--上篇

SpringMVC学习笔记 1、SpringMVC 1.1、什么是SpringMVC Spring MVC是Spring Framework的一部分&#xff0c;是基于Java实现MVC的轻量级Web框架。 1.2、SpringMVC的特点 Spring MVC的特点&#xff1a; 轻量级&#xff0c;简单易学高效 , 基于请求响应的MVC框架与Spring兼容…

Python深度学习-有向图合并、排序、最长路径计算

一、有向图方向、权重表示方法 Python通常使用有向图中边的起点和终点来表示边的方向。例如&#xff0c;如果有一条从节点A到节点B的边&#xff0c;则可以使用以下方式表示该有向边&#xff1a; graph {A: {B: 1} }在这个例子中&#xff0c;节点A和节点B之间存在一条权重为1…

谷歌插件下载Redux DevTools管理Redux数据

我们在做 react-redux开发时 很多时候可能无法确定自己的数据有没有成功导进来 这里就有个不错的谷歌插件推荐给大家 大家可以下载我的资源 谷歌插件Redux DevTools 这里 我们打开 Google Chrome浏览器 然后 直接在谷歌浏览器上访问 chrome://extensions/ 如果你的第一次进入 …

【网络安全】学过编程就是黑客?

我们不可否认的是黑客为我们带来了巨大的财产损失于危机&#xff0c;即使其最初的思想是正确的。 个人主页&#xff1a;【&#x1f60a;许思王】 文章目录 前言黑客 &#x1f4bb;起源&#x1f697;发展&#x1f463;黑客守则&#xff08;真的假的&#x1f914;&#xff09;黑…

合并cyclonedx格式的bom文件

1.工具下载 https://github.com/CycloneDX/cyclonedx-cli/releases 2.操作记录 Usage: cyclonedx [options] [command] Options: --version Show version information -?, -h, --help Show help and usage information Commands: add Add information to a BOM (currently…

【图像处理】:相机对焦的原理和实现方法

相机对焦的原理和实现方法 1 原理介绍&#xff1a;1.1点扩散函数“原理:1.2 测距原理:对焦的本质是测距&#xff1a;1.3.相位检测只原理: 2.实现方法2 1 原理介绍&#xff1a; 对焦有三种思路: 1.1点扩散函数“原理: 也就是观测画面中线条边缘的对比度&#xff0c;对比度最高…

微信小程序代码审核,提示需要添加文娱-其他视频类目

这个解决办法有三个 一个是按照指引去申请资质 第二个是通过后端写一个鉴权接口&#xff0c;审核时候去通过接口返回的布尔值去隐藏掉视频模块&#xff0c;通过后再显示出来 第三个是服务除视频内容外还存在其他形式的情况可以通过引入第三方视频插件来解决&#xff0c;但是…

初识Golang,集简洁与性能与一体的语言

文章目录 一、Go语言介绍二、Go语言特性三、Go语言用途四、开发环境搭建五、建立工作区并创建Go程序六、入口文件基本代码介绍七、go命令介绍7.1 基本命令7.2 build 与 run命令7.3 install命令介绍 八、命名规范8.1 变量规范定义8.2 关键字8.3 保留字8.4 需要注意的问题 道阻且…

AIGC 爆火,浪潮信息要做大模型的数据存储大底座

AIGC 在 2023 年爆火&#xff0c;各类大模型层出不穷&#xff0c;参数动辄达到千亿数量级。这些背后&#xff0c;数据的类型和形式也走向复杂多样。例如大模型会采用到我们真实物理世界中的文字、视觉、音频、3D、雷达、多谱等复杂多样的不同模态信号和数据&#xff0c;数据则又…

【Android复习笔记】系统进程(一)

Android 系统进程有哪些 先来一个整体结构图从宏观上理解Android系统的进程结构布局: 这里我们简单总结一下: 系统的第一个进程其实是0号进程(又叫swapper进程/Idle进程) 0号进程fork出了1号进程(init进程)和2号进程(kthreadd进程) 1号进程是所有普通用户进程的祖先,2号进程…

利用Adobe Acrobat DC实现图片和PDF互相转换

一、图片转PDF 可以实现多张或者单张图片转PDF! 这个需要使用到Adobe Acrobat DC的文件合并功能&#xff0c;因为Adobe Acrobat DC的文件合并&#xff0c;不仅可以合并多个pdf文件&#xff0c;也支持合并图片文件。 如图&#xff0c;直接选中多张图片合成即可&#xff1a; 添…

微服务系列文章之 Redisson实现分布式锁(3)

一、概述 1、技术架构 项目总体技术选型 SpringBoot2.4.5 Maven3.5.4 Redisson3.5.4 lombok(插件)2、加锁方式 该项目支持 自定义注解加锁 和 常规加锁 两种模式 自定义注解加锁 DistributedLock(value"goods", leaseTime5)public String lockDecreaseStock(…

84. 求1+2+…+n

链接&#xff1a; 链接 题目&#xff1a; 求 12…n12…n&#xff0c;要求不能使用乘除法、forfor、whilewhile、ifif、elseelse、switchswitch、casecase 等关键字及条件判断语句 (A?B:C)(A?B:C)。 数据范围 1≤n≤500001≤n≤50000。 样例 输入&#xff1a;10输出&#xff1…