MyBatis分页机制深度解析

前言

在企业项目的数据库操作中,分页查询是一个常见需求,尤其当数据量庞大时。MyBatis 作为 我们Java 开发者的持久层框架,为分页提供了灵活的支持。

本篇文章我们将深入探讨 MyBatis 的分页机制,使我们在实际开发项目中运用自如。

在这里插入图片描述

MyBatis分页原理

在讲解mybatis的分页原理之前,我们先来看一下:内存分页 vs. 数据库分页

  • 内存分页:查询数据库获取全部数据,然后在内存中进行分页。这种方式简单但效率低下,当数据量巨大时可能导致内存溢出。
  • 数据库分页:利用数据库的分页功能(比如 MySQL 的 LIMIT 和 OFFSET),仅查询当前页的数据。这种方式效率高,但需要编写特定的 SQL。

现在我们再具体讲MyBatis 的分页方式。

MyBatis 支持两种分页方式:物理分页和内存分页。但是在实际应用中,博主比较推荐使用物理分页。

  • 物理分页:通过特定的 SQL 实现,依赖数据库的分页功能。
  • 内存分页:虽然 MyBatis 支持,但不推荐在大数据量场景下使用。

在这里插入图片描述

MyBatis 分页插件

为了实现物理分页,MyBatis 提供了分页插件,如 PageHelper。这些插件可以自动修改原始 SQL,添加分页相关的语句。

如何使用 MyBatis 分页插件

接下来我们讲解一下如何使用 MyBatis 分页插件 。

首先第一步肯定是引入依赖

先创建一个 Maven 项目,引入 PageHelper 依赖:

<dependency>  <groupId>com.github.pagehelper</groupId>  <artifactId>pagehelper-spring-boot-starter</artifactId>   
</dependency>

然后配置 PageHelper

在 MyBatis 的配置文件(如 mybatis-config.xml)中,添加插件配置:

<plugins>  <plugin interceptor="com.github.pagehelper.PageInterceptor">  <property name="dialect" value="mysql"/> <!-- 根据实际数据库选择方言 -->  <property name="reasonable" value="true"/> <!-- 支持接口参数中的 pageNum 和 pageSize 为 0 时使用默认值 -->  <property name="supportMethodsArguments" value="true"/> <!-- 支持通过 Mapper 接口参数来传递分页参数 -->  <property name="params" value="count(countSql)"/> <!-- count 查询的 SQL 参数 -->  </plugin>  
</plugins>

最后使用 PageHelper

在 Mapper 接口或 Service 层使用 PageHelper:

// 在查询之前设置分页参数  
PageHelper.startPage(pageNum, pageSize);  
List<User> users = userMapper.selectByExample(example);  
// 使用 PageInfo 包装查询结果,获取分页信息  
PageInfo<User> pageInfo = new PageInfo<>(users, pageSize);

以博主之前做过的课设项目为例:

我们手上现在有一个UserMapper接口,用来查询用户数据:

public interface UserMapper {  List<User> selectAllUsers();  
}

在Service层或Controller层中,我们这时候可以使用PageHelper来实现分页:

@Service  
public class UserService {  @Autowired  private UserMapper userMapper;  public PageInfo<User> getUsers(int pageNum, int pageSize) {  PageHelper.startPage(pageNum, pageSize);  // 启动分页  List<User> users = userMapper.selectAllUsers();  // 查询用户数据  return new PageInfo<>(users);  // 使用PageInfo包装查询结果,获取分页信息  }  
}

当调用getUsers方法时,PageHelper会自动为selectAllUsers方法中的SQL添加分页语句,从而只查询当前页的数据。

前端可以根据返回的PageInfo对象获取当前页的数据、总页数、总记录数等信息,并进行相应的展示。

文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx解决跨域问题过程

学习Nginx解决跨域问题 结果 server {listen 22222;server_name localhost;location / {if ($request_method OPTIONS) {add_header Access-Control-Allow-Origin http://localhost:8080;add_header Access-Control-Allow-Headers *;add_header Access-Control-Allo…

【索引的数据结构】第2章节:InooDB和MyISAM索引结构对比

目录结构 之前整篇文章太长&#xff0c;阅读体验不好&#xff0c;将其拆分为几个子篇章。 本篇章讲解 InnoDB 和 MyISAM 索引结构对比。 InnoDB 的 BTree 索引注意事项 根页面位置万年不变 上述我们在索引迭代的过程中&#xff0c;为了更佳形象的描述&#xff0c;所以将顺序…

【图像拼接】源码精读:Seam-guided local alignment and stitching for large parallax images

第一次来请先看这篇文章&#xff1a;【图像拼接&#xff08;Image Stitching&#xff09;】关于【图像拼接论文源码精读】专栏的相关说明&#xff0c;包含专栏内文章结构说明、源码阅读顺序、培养代码能力、如何创新等&#xff08;不定期更新&#xff09; 【图像拼接论文源码精…

openGauss Summit 2023 GBase 8c多模多态、向量加持

2023年12月28日&#xff0c;以“汇聚数据库创新力量&#xff0c;打造千行万业数据基石”为主题的openGauss Summit 2023峰会于北京望京凯悦酒店顺利落幕。GBASE南大通用携重大升级的GBase 8c数据库产品及行业解决方案亮相本届大会。 关于openGauss summit峰会 openGauss Summi…

python实现Ethernet/IP协议的客户端(三)

Ethernet/IP是一种工业自动化领域中常用的网络通信协议&#xff0c;它是基于标准以太网技术的应用层协议。作为工业领域的通信协议之一&#xff0c;Ethernet/IP 提供了一种在工业自动化设备之间实现通信和数据交换的标准化方法。python要实现Ethernet/IP的客户端&#xff0c;可…

Android 13 - Media框架(29)- MediaCodec(四)

上一节我们了解了如何通过 onInputBufferAvailable 和 getInputBuffer 获取到 input buffer index&#xff0c;接下来我们一起学习上层如何拿到buffer并且向下写数据的。 1、获取 input Buffer 获取 MediaCodec 中的 buffer 有两种方式&#xff0c;一种是调用 getInputBuffers…

JavaWeb——前端之HTMLCSS

学习视频链接&#xff1a;https://www.bilibili.com/video/BV1m84y1w7Tb/?spm_id_from333.999.0.0 一、Web开发 1. 概述 能通过浏览器访问的网站 2. Web网站的开发模式——主流是前后端分离 二、前端Web开发 1. 初识 前端编写的代码通过浏览器进行解析和渲染得到我们看到…

JMeter之测试WebService接口

JMeter之测试WebService接口 1 背景2 目的3 介绍4 具体操作4.1 soapUI调用4.2 JMeter工具调用4.3 操作步骤流程4.3 重点 1 背景 WebService应用的范围是非常广&#xff0c;任何需要跨平台、跨系统进行数据交换和功能调用的场景都可以用此来实现&#xff0c;在实际的工作中也常常…

C#上位机与欧姆龙PLC的通信08----开发自己的通讯库读写数据

1、介绍 前面已经完成了7项工作&#xff1a; C#上位机与欧姆龙PLC的通信01----项目背景-CSDN博客 C#上位机与欧姆龙PLC的通信02----搭建仿真环境-CSDN博客 C#上位机与欧姆龙PLC的通信03----创建项目工程-CSDN博客 C#上位机与欧姆龙PLC的通信04---- 欧姆龙plc的存储区 C#上…

如何用 100 行 Shell 脚本实现一个 Docker?

本文主要介绍使用 shell 实现一个简易的 Docker。 一、目的 在初接触Docker的时候&#xff0c;我们必须要了解的几个概念就是Cgroup、Namespace、RootFs&#xff0c;如果本身对虚拟化的发展没有深入的了解&#xff0c;那么很难对这几个概念有深入的理解。 本文的目的就是通过…

Pix2Pix如何工作?

一、说明 在本指南中&#xff0c;我们将重点介绍 Pix2Pix [1]&#xff0c;它是用于配对图像翻译的著名且成功的深度学习模型之一。在地理空间科学中&#xff0c;这种方法可以帮助传统上不可能的广泛应用&#xff0c;在这些应用中&#xff0c;我们可能希望从一个图像域转到另一个…

大创项目推荐 深度学习乳腺癌分类

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…