MyBatis 中如何使用分页

news/2024/7/5 2:35:56

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://lihuaxi.xjx100.cn/news/1330637.html

相关文章

mybatisplus常用小技巧

条件构造器select方法介绍 根据业务需求&#xff0c;有时候只需要返回特定的几个数据表字段&#xff0c;我们通过条件构造器的select方法可以指定&#xff1b; 还有一种情况&#xff0c;假如数据库字段很多的时候&#xff0c;我们要排除某几个字段&#xff0c;其他字段返回的…

AR 技术应用与管理:施工建造、机柜扫描、办公室导航

随着科技的不断革新和创新&#xff0c;越来越多的行业开始迎来数字化时代的变革。建筑行业作为人类历史上最重要的产业之一&#xff0c;在数字化转型方面同样也在不断推进。图扑软件结合 AR 技术的应用&#xff0c;为建筑行业带来了更加便捷高效的建筑施工过程管理。 传统的建…

Linux新建指定文件数量限额的目录

参考文章 https://blog.csdn.net/weixin_28848317/article/details/116647116?spm1001.2101.3001.6661.1&utm_mediumdistribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-116647116-blog-54933188.235%5Ev38%5Epc_relevant_default_base&depth_…

AI模型从训练到部署的源码示例

这里给出一个简单的AI模型从训练到部署的源码示例&#xff0c;以图像分类为例&#xff1a; 1. 数据收集和预处理 python import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers #…

大模型调用工具魔搭GPT——一键调用魔搭社区上百个AI模型的API

为了让模型开发变得更容易,阿里云在发布会现场推出了一款令开发者耳目一新的工具:ModelScopeGPT(魔搭GPT)。它能够通过担任“中枢模型”的大语言模型一键调用魔搭社区其他的AI模型,实现大模型和小模型协同完成复杂任务。 这类智能调用工具被业界普遍看好。ModelScopeGP…

码头控制柜无线控制行车折臂与电动葫芦限位器运作

随着我国海洋交通的快速发展&#xff0c;船舶信息化管理的建设&#xff0c;无线通信资源的配置&#xff0c;将先进的无线通信技术引入水上交通安全的监管业务中已是大势所趋。码头安装(设备和系统的安装) 船舶下水后常停靠于厂内舾装码头, 以安装船体设备, 机电设备&#xff0c…

OpenAI GPT-4 Code Interpreter测试

OpenAI GPT-4 Beta版本Code Interpreter功能分析 OpenAI最近在GPT-4中推出了Code Interpreter功能的Beta版本&#xff0c;它是ChatGPT的一个版本&#xff0c;可以编写和执行Python代码&#xff0c;并处理文件上传。以下是对其表现的基本分析。 主要功能 文件信息获取&#xf…

C++ | How C++ Linker works?

How C Linker works? 文章目录 How C Linker works?LinkingExample 1结论 Example 2CASE 1CASE 2CASE 3CASE 4常用解法 >>>>> 欢迎关注公众号【三戒纪元】 <<<<< Linking Linking 是C 源码到可执行二进制时的一个过程&#xff0c;主要工作是找…