Mybatis是如何进行分页的?

大家好,我是锋哥。今天分享关于【Mybatis是如何进行分页的?】面试题。希望对大家有帮助;

Mybatis是如何进行分页的?

1000道 互联网大厂Java工程师 精选面试题-Java资源分享网

MyBatis 实现分页的方式有很多种,最常见的方法是通过 SQL 查询语句中的 LIMITOFFSET,或者通过使用分页插件来简化开发。以下是 MyBatis 中实现分页的几种常见方式:

1. 手动编写分页 SQL

在 MyBatis 中,最直接的分页方式是手动在查询的 SQL 语句中加入分页的 LIMITOFFSET(针对 MySQL)或 ROWNUM(针对 Oracle)等分页关键字。

示例:MySQL 分页

假设我们有一个用户表 users,可以通过如下 SQL 语句进行分页查询:

<select id="selectUsers" resultType="User">SELECT * FROM usersLIMIT #{offset}, #{limit}
</select>
  • #{offset} 表示查询的起始位置,通常是 (页数 - 1) * 每页记录数
  • #{limit} 表示每页的记录数。

调用时,传入分页参数,例如:

int offset = (pageNum - 1) * pageSize;
List<User> users = sqlSession.selectList("selectUsers", Map.of("offset", offset, "limit", pageSize));
示例:Oracle 分页

对于 Oracle 数据库,分页通常通过 ROWNUMROW_NUMBER() 来实现:

<select id="selectUsers" resultType="User">SELECT * FROM (SELECT a.*, ROWNUM rnum FROM users a WHERE ROWNUM <= #{end}) WHERE rnum > #{start}
</select>

调用时,传入分页参数,例如:

int start = (pageNum - 1) * pageSize;
int end = pageNum * pageSize;
List<User> users = sqlSession.selectList("selectUsers", Map.of("start", start, "end", end));

这种方法的缺点是每次都需要手动编写分页逻辑,且与数据库的分页语法紧密耦合。

2. 使用 MyBatis 分页插件

为了简化分页的实现,可以使用第三方分页插件。常见的 MyBatis 分页插件有 PageHelperMyBatis-Plus

使用 PageHelper 插件

PageHelper 是一个非常流行的 MyBatis 分页插件,它通过拦截 SQL 查询并动态生成分页 SQL 语句来实现分页功能。

  1. 添加依赖: 如果使用 Maven,可以在 pom.xml 文件中添加 PageHelper 依赖:

    <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.0</version>
    </dependency>
    

  2. 配置 PageHelper: 在 MyBatis 配置文件中配置 PageHelper 插件:

    <plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><property name="helperDialect" value="mysql" /><property name="reasonable" value="true" /></plugin>
    </plugins>
    

  3. 分页查询: 在调用分页查询时,直接使用 PageHelper.startPage() 方法来设置分页参数:

    PageHelper.startPage(pageNum, pageSize);
    List<User> users = userMapper.selectUsers(); // 这里的 selectUsers 是查询方法
    PageInfo<User> pageInfo = new PageInfo<>(users);
    

    PageHelper.startPage(pageNum, pageSize) 会在执行查询之前拦截 SQL 并修改其为分页查询,返回的结果会自动封装成 PageInfo 对象,里面包含了分页信息(总页数、总记录数等)。

使用 MyBatis-Plus 插件

MyBatis-Plus 是另一个流行的 MyBatis 扩展库,它也提供了简单易用的分页功能。

  1. 添加依赖: 如果使用 Maven,可以在 pom.xml 文件中添加 MyBatis-Plus 依赖:

    <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.0</version>
    </dependency>
    

  2. 分页查询: 使用 MyBatis-Plus 提供的 Page 类来进行分页查询:

    Page<User> page = new Page<>(pageNum, pageSize);
    IPage<User> usersPage = userMapper.selectPage(page, null); // 第二个参数为查询条件
    List<User> users = usersPage.getRecords(); // 获取分页结果
    long total = usersPage.getTotal(); // 获取总记录数
    

    MyBatis-Plus 会自动处理分页逻辑,不需要手动编写分页 SQL,且支持多种数据库。

总结

MyBatis 中分页通常有以下几种方式:

  1. 手动编写 SQL:适合简单场景,但需要针对不同的数据库写不同的 SQL。
  2. 使用分页插件(如 PageHelper 或 MyBatis-Plus):插件方式更简洁,能够自动处理分页逻辑,减少开发工作量。

通常情况下,使用分页插件会更加方便和高效,特别是当项目需求中涉及到多种数据库或复杂的查询逻辑时。

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

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

相关文章

四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用)

四.3 Redis 五大数据类型/结构的详细说明/详细使用&#xff08; hash 哈希表数据类型详解和使用&#xff09; 文章目录 四.3 Redis 五大数据类型/结构的详细说明/详细使用&#xff08; hash 哈希表数据类型详解和使用&#xff09;2.hash 哈希表常用指令(详细讲解说明)2.1 hset …

编译dpdk19.08.2中example时一系列报错解决

dpdk19.08编译过程全解 dpdk 介绍问题描述编译过程执行Step 1报错一解决方式 报错二解决方式 继续执行Step 248的时候报错 49没有修改成功输入60退出 使用过程执行make报错一解决方式 继续make报错二解决方式 继续make执行生成文件helloworld报错三解决方式 执行make 完成参考链…

openeuler 22.03 lts sp4 使用 cri-o 和 静态 pod 的方式部署 k8s-v1.32.0 高可用集群

前情提要 整篇文章会非常的长…可以选择性阅读,另外,这篇文章是自己学习使用的,用于生产,还请三思和斟酌 静态 pod 的部署方式和二进制部署的方式是差不多的,区别在于 master 组件的管理方式是 kubectl 还是 systemctl有 kubeadm 工具,为什么还要用静态 pod 的方式部署?…

渗透测试之WAF规则触发绕过规则之规则库绕过方式

目录 Waf触发规则的绕过 特殊字符替换空格 实例 特殊字符拼接绕过waf Mysql 内置得方法 注释包含关键字 实例 Waf触发规则的绕过 特殊字符替换空格 用一些特殊字符代替空格&#xff0c;比如在mysql中%0a是换行&#xff0c;可以代替空格 这个方法也可以部分绕过最新版本的…

C# dataGridView1获取选中行的名字

在视觉项目中编写的框架需要能够选择产品或复制产品等方便后续换型&#xff0c;视觉调试仅需调试相机图像、调试视觉相关参数、标定&#xff0c;再试跑调试优化参数。 C# dataGridView1 鼠标点击某一行能够计算出是那一行 使用CellMouseClick事件 首先&#xff0c;在Form的构造…

Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat

目录 ?编辑 一、Ubuntu22.04介绍 二、Ubuntu与Centos的区别 三、基于VMware安装Ubuntu Server 22.04 下载 VMware安装 1.创建新的虚拟机 2.选择类型配置 3.虚拟机硬件兼容性 4.安装客户机操作系统 5.选择客户机操作系统 6.命名虚拟机 7.处理器配置 8.虚拟机内存…

Linux基础指令

基本文件操作 补充&#xff1a; “cd -” 可以前往刚才所在目录 “ls 文件路径” 列举指定路径的文件 “ls -a”列出隐藏文件 “ls -l”可以缩写为“ll” 周边概念 读取操作 “cat 文件名”阅读文本文件内容&#xff0c;可以使用Tab键补全文件…

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)

目录 1 -> 生命周期 1.1 -> 应用生命周期 1.2 -> 页面生命周期 2 -> 资源限定与访问 2.1 -> 资源限定词 2.2 -> 资源限定词的命名要求 2.3 -> 限定词与设备状态的匹配规则 2.4 -> 引用JS模块内resources资源 3 -> 多语言支持 3.1 -> 定…

【JavaWeb06】Tomcat基础入门:架构理解与基本配置指南

文章目录 &#x1f30d;一. WEB 开发❄️1. 介绍 ❄️2. BS 与 CS 开发介绍 ❄️3. JavaWeb 服务软件 &#x1f30d;二. Tomcat❄️1. Tomcat 下载和安装 ❄️2. Tomcat 启动 ❄️3. Tomcat 启动故障排除 ❄️4. Tomcat 服务中部署 WEB 应用 ❄️5. 浏览器访问 Web 服务过程详…

C语言练习(29)

13个人围成一圈&#xff0c;从第1个人开始顺序报号1、2、3。凡报到“3”者退出圈子&#xff0c;找出最后留在圈子中的人原来的序号。本题要求用链表实现。 #include <stdio.h> #include <stdlib.h>// 定义链表节点结构体 typedef struct Node {int num;struct Nod…

简要介绍C语言和c++的共有变量,以及c++特有的变量

在C语言和C中&#xff0c;变量是用来存储数据的内存位置&#xff0c;它们的使用方式和特性在两种语言中既有相似之处&#xff0c;也有不同之处。以下分别介绍C语言和C的共有变量以及C特有的变量。 C语言和C的共有变量 C语言和C都支持以下类型的变量&#xff0c;它们在语法和基…

【UE插件】Sphinx关键词语音识别

视频教程&#xff1a; Unreal Engine - Speech Recognition - Free Pluginhttps://www.youtube.com/watch?vKBcXNnSdWog&t622s 官方教程&#xff1a; Sphinx: Speech Recognition Plugin | Unreal Engine Community Wikihttps://unrealcommunity.wiki/speech-recognition…

图漾相机——C++语言属性设置

文章目录 前言1.SDK API功能介绍1.1 Device组件下的API测试1.1.1 相机工作模式设置&#xff08;TY_TRIGGER_PARAM_EX&#xff09;1.1.2 TY_INT_FRAME_PER_TRIGGER1.1.3 TY_INT_PACKET_DELAY1.1.4 TY_INT_PACKET_SIZE1.1.5 TY_BOOL_GVSP_RESEND1.1.6 TY_BOOL_TRIGGER_OUT_IO1.1.…

Spring AI 在微服务中的应用:支持分布式 AI 推理

1. 引言 在现代企业中&#xff0c;微服务架构 已成为开发复杂系统的主流方式&#xff0c;而 AI 模型推理 也越来越多地被集成到业务流程中。如何在分布式微服务架构下高效地集成 Spring AI&#xff0c;使多个服务可以协同完成 AI 任务&#xff0c;并支持分布式 AI 推理&#x…

研发的立足之本到底是啥?

0 你的问题&#xff0c;我知道&#xff01; 本文深入T型图“竖线”的立足之本&#xff1a;专业技术 技术赋能业务能力。研发在学习投入精力最多&#xff0c;也误区最多。 某粉丝感发展遇到瓶颈&#xff0c;项目都会做&#xff0c;但觉无提升&#xff0c;想跳槽。于是&#x…

HarmonyOS DevEco Studio模拟器点击运行没有反应的解决方法

HarmonyOS DevEco Studio模拟器点击运行没有反应的解决方法 翻遍了CSDN&#xff0c;试了所有办法都没办法&#xff0c;最后偶然间竟然解决了 解决方法其实很简单&#xff1a;本地模拟器下载路径下面不能有中文。。。。。 切换正确路径以后&#xff0c;成功运行&#xff0c;哦…

升级到Mac15.1后pod install报错

升级Mac后&#xff0c;Flutter项目里的ios项目运行 pod install报错&#xff0c; 遇到这种问题&#xff0c;不要着急去百度&#xff0c;大概看一下报错信息&#xff0c;每个人遇到的问题都不一样。 别人的解决方法并不一定适合你&#xff1b; 下面是报错信息&#xff1a; #…

C++入门(1)

1.第一个C程序 1.1基础程序 #include"iostream" //头文件 using namespace std; //使用std的名字空间int main() //main函数 {cout<<"Hello world"<<endl; //输出return 0; } 1.2main函数 main函数是程序的入口&#xff0c;C的程…

c++:vector

1.使用 1.1构造函数 常见的三种构造方式&#xff1a;空构造&#xff0c;拷贝构造&#xff0c;指定元素构造 1.2iterator begin和end也分为正向和反向。 注意&#xff1a;反向迭代器可以反向遍历是因为在定义rbegin和rend函数的时候把尾地址给到了rbegin&#xff0c;而不是说改…

1.27补题 回训练营

E 智乃的小球 题目描述 在一条无限长的水平直线上&#xff0c;有 n 个小球&#xff0c;每个小球的质量相同&#xff0c;体积可以忽略不计。这些小球初始时位于直线上的不同位置&#xff0c;并且每个小球有一个初始速度&#xff0c;速度为 -1 m/s 或 1 m/s。速度为 -1 m/s 表示…