MyBatis(7)MyBatis 是如何进行分页

MyBatis 本身没有内置的分页处理,但它提供了使用分页插件或通过手动编写分页SQL语句的机制来实现分页功能。分页插件如 PageHelper 是常用来与 MyBatis 配合进行分页的工具。

手动分页

在不使用分页插件的情况下,可以通过编写特定的分页SQL语句来手动实现分页。以MySQL数据库为例,通常会使用 LIMIT 子句来实现分页。

SELECT * FROM some_table
LIMIT #{offset}, #{pageSize}

在 MyBatis 的映射文件中或使用注解方式,你可以这样写:

<select id="selectPaged" resultType="com.example.MyObject">SELECT * FROM some_tableLIMIT #{offset}, #{pageSize}
</select>

或者使用注解:

@Select("SELECT * FROM some_table LIMIT #{offset}, #{pageSize}")
List<MyObject> selectPaged(@Param("offset") int offset, @Param("pageSize") int pageSize);

在执行查询时,你需要计算 offset(偏移量)和 pageSize(每页数量)的值。

int pageSize = 10;
int pageNumber = 1;
int offset = (pageNumber - 1) * pageSize;
List<MyObject> pagedList = mapper.selectPaged(offset, pageSize);
使用 PageHelper 分页

PageHelper 是一个第三方的 MyBatis 分页插件。它通过拦截 MyBatis 的查询操作来自动添加分页语句。使用 PageHelper 的基本步骤如下:

  1. 在项目中包含 PageHelper 依赖。

  2. 配置 MyBatis 插件来使用 PageHelper。

  3. 在代码中使用 PageHelper 的静态方法来设置分页参数。

  4. 执行查询。

在 MyBatis 配置文件中配置 PageHelper:

<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><property name="helperDialect" value="mysql"/><!-- 其他配置 --></plugin>
</plugins>

使用 PageHelper 进行分页:

// 设置分页参数
PageHelper.startPage(pageNumber, pageSize);
// 执行查询
List<MyObject> pagedList = mapper.selectSome();
// 获取分页信息
PageInfo<MyObject> pageInfo = new PageInfo<>(pagedList);
PageHelper 源码分析

PageHelper 使用了 MyBatis 提供的插件接口(Interceptor)来实现其功能。通过拦截 Executor.query() 方法,PageHelper 在执行查询之前修改 SQL 语句,添加上分页的相关信息。

public Object intercept(Invocation invocation) throws Throwable {// 中间省略部分代码MappedStatement ms = (MappedStatement) invocation.getArgs()[0];Object parameter = invocation.getArgs()[1];RowBounds rowBounds = (RowBounds) invocation.getArgs()[2];// 省略部分判断逻辑// 获取分页参数Page page = PageHelper.getLocalPage();// ... 对 SQL 进行处理,添加分页参数// 省略具体实现// 执行原查询Object result = invocation.proceed();// 设置分页信息page.addAll((List) result);// ...return result;
}

PageHelper 会根据方言(如 MySQL、Oracle 等)来生成相应的分页 SQL。在执行查询方法前,PageHelper.startPage() 方法会设置本地线程变量,其中包含分页参数。当查询方法执行时,插件拦截并识别这些参数,然后改写 SQL 语句,最终执行的是已经添加了分页子句的 SQL 语句。

细节和最佳实践
  1. 在手动编写分页SQL时,应优先选择使用数据库的分页特性,如 MySQL 的 LIMIT

  2. PageHelper 是一个非侵入式的分页插件,可以很容易地集成到现有的 MyBatis 应用中。

  3. 使用 PageHelper 可以避免写大量的分页代码,提高开发效率。

  4. 应优先使用 startPage 方法进行分页,它比使用 RowBounds 更高效,因为 RowBounds 是通过在内存中进行分页处理,而 startPage 生成的 SQL 会直接在数据库层面上限制结果集大小。

  5. 在分布式环境下,考虑分页查询的性能和数据一致性问题。如果数据量大,考虑使用更高效的数据分页策略。

总之,MyBatis 分页可以通过手动编写SQL或使用分页插件来实现。在实际应用中,选用 PageHelper 这种分页插件通常能够提供更简单、更高效的分页实现。

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

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

相关文章

【论文速读】|MEDFUZZ:探索大语言模型在医学问题回答中的鲁棒性

本次分享论文&#xff1a;MEDFUZZ: EXPLORING THE ROBUSTNESS OF LARGE LANGUAGE MODELS IN MEDICAL QUESTION ANSWERING 基本信息 原文作者&#xff1a;Robert Osazuwa Ness, Katie Matton, Hayden Helm, Sheng Zhang, Junaid Bajwa, Carey E. Priebe, Eric Horvitz 作者单…

Lua博客网站支持搜索、评论、登录注册

该简易博客示例用于学习网站的基础知识与MySQL数据库。 简述&#xff1a;开源Lua网站开发服务(FastWeb)支持&#xff1a;注册、登录、文章分页、评论分页、简易权限管理和搜索功能。发帖功能支持Markdown(支持记忆功能)图示&#xff1a;

Java之线程相关应用实现

后台线程 一个进程中只有后台进程运行&#xff0c;该进程将会结束。 新创建的线程默认为前台线程&#xff0c;Java中只要有一个前台线程运行&#xff0c;就不会结束程序&#xff0c;如果只有后台线程运行&#xff0c;程序就会结束&#xff0c;可以在线程对象启动前执行setDae…

【js + ckeditor】插入base64格式的图片

一、需求说明 直接把图片转成base64插入到富文本 二、需求分析 1、富文本图片格式处理位置 在ckeidtor的目录下有个plugins文件夹&#xff0c;在plugins下新建一个文件夹&#xff08;自己命名&#xff0c;如simpleupload&#xff09;&#xff0c;进入simpleupload文件夹&…

《Windows API每日一练》6.3 非客户区鼠标消息

上一节我们讨论客户区的鼠标消息&#xff0c;本节我们讨论非客户区鼠标消息。如果鼠标位于窗口内部除客户区外的其他区域&#xff0c;Windows就会向窗口过程发送一个“非客户区”鼠标消息。窗口的非客户区包括标题栏、菜单和窗口滚动条。 本节必须掌握的知识点&#xff1a; 非…

微服务和kafka

一、微服务简介 1.单体架构 分布式--微服务--云原生 传统架构&#xff08;单机系统&#xff09;&#xff0c;一个项目一个工程&#xff1a;比如商品、订单、支付、库存、登录、注册等等&#xff0c;统一部署&#xff0c;一个进程 all in one的架构方式&#xff0c;把所有的…

深入探讨C++的高级反射机制(2):写个能用的反射库

在现代软件开发中&#xff0c;反射是一种强大的特性&#xff0c;它可以支持程序在运行时查询和调用对象的属性和方法。 但是在C中&#xff0c;没有内置的反射机制。我们可以通过一些巧妙的技术模拟反射的部分功能。 上一篇文章写了个简单的反射功能&#xff0c;这回完善一下&a…

Vue3实现记住密码功能

1.首先安装 js-cookie、jsencrypt npm i js-cookie // 使用Cookie来实现记住密码功能 npm i jsencrypt //使用jsencrypt进行加密解密 2.完整代码 注:在此我使用了ant-design-vue组件库 若使用源码请自行配置ant-design-vue <template><h2 :style"{margin…

3.PyQt6常用基本控件

目录 常用控件 1.文本类控件 1.QLable标签控件 1.设置标签文本 2.设置标签文本和对齐方式 3.换行显示 4.添加超链接 5.为标签设置图片 6.获取标签文本 2.QLineEdit单行文本控件 3.QTextEdit多行富文本控件 4.QPlainTextEdit纯文本控件 5.QSpinBox整数数字选择控件 …

开发板以电脑为跳板连接互联网

标题 开发板以电脑为跳板连接互联网网络共享方式桥接方式 开发板以电脑为跳板连接互联网 分享下用网线直连电脑的开发板如何以电脑为跳板连接互联网的两个方法。 网络共享方式桥接方式 补充下&#xff0c;我的电脑连接的是无线网络&#xff0c;开发板和电脑是用网线进行连接的…

【第3章】MyBatis-Plus持久层接口之Service Interface(上)

文章目录 前言一、save1. 示例&#xff08;save&#xff09;2. 示例&#xff08;saveBatch&#xff09;3. 示例&#xff08;saveBatch 指定批次大小&#xff09; 二、saveOrUpdate1.示例&#xff08;saveOrUpdate&#xff09;2.示例&#xff08;saveOrUpdateBatch&#xff09;3…

Python 高级编程:文件操作与错误处理

在前几篇文章中&#xff0c;我们介绍了Python的基本语法、函数和模块以及面向对象编程。这些知识对于大部分日常编程问题已经足够&#xff0c;但对于需要分析大数据的人来说&#xff0c;这些还不够。本章将介绍Python的文件操作以及错误处理与调试。 目录 文件操作读文件写文…

GPTs与Assistant API:哪一个更适合您?

梗概 主要讲解了OpenAI推出的两种不同的人工智能工具——GPTs和Assistant API&#xff0c;并比较了它们各自的特点和适用场景&#xff0c;帮助用户选择最适合自己需求的工具。 GPTs&#xff08;生成预训练变换模型&#xff09; 核心特点&#xff1a; 生成能力&#xff1a;GPTs…

C语言单链表的算法之插入节点

一&#xff1a;访问各个节点中的数据 &#xff08;1&#xff09;访问链表中的各个节点的有效数据&#xff0c;这个访问必须注意不能使用p、p1、p2&#xff0c;而只能使用phead &#xff08;2&#xff09;只能用头指针不能用各个节点自己的指针。因为在实际当中我们保存链表的时…

【嵌入式Linux】i.MX6ULL GPIO 中断服务函数注册与编写

文章目录 1 外部中断初始化与中断服务函数1.2 外部中断初始化函数 exti_init1.2.1 GPIO引脚配置1.2.2 中断使能与注册1.2.3 GIC_EnableIRQ()函数的分析 1.3 中断服务函数 gpio1_io20_irqhandler1.3.1 消抖处理1.3.2 中断事件处理1.3.3 清除中断标志 2 BUG处理2.1 问题描述2.2 解…

网易Filmly网盘影片播放器安卓TV版

我们在观看网盘内的影视时&#xff0c;想要高清/原画质观看视频&#xff0c;甚至倍速功能往往都需要开通网盘会员才可以&#xff0c;否则你只能使用”马赛克”画质观看。 最近网易上线了一款播放器&#xff1a;Filmly &#xff0c;它支持直连网盘影视资源&#xff0c;可以高速…

Optional避免判空嵌套过多,优雅解决空指针异常

背景 最近在处理json文件反序列化为实体类的时候&#xff0c;抛出空指针异常&#xff0c;发现很多地方没有判空逻辑。 增加判空逻辑后&#xff0c;嵌套太多导致代码很臃肿&#xff0c;因此学习用Optional来进行优化代码&#xff0c;增加可读性。 Optional使用场景 1. map自动…

深入理解计算机系统 CSAPP 家庭作业7.12

A:refptr (unsigned)(ADDR(r.symbol) r.addend - refaddr) 0x4004f8 (-4) - 0x4004ea 0xa B:refaddr 0x4004d0 0xa 0x4004da refptr 0x400500 (-4) - 0x4004da 0x22 ​​​​​​​

Python24 机器学习之决策树

1.什么是机器学习&#xff1f; 机器学习是人工智能&#xff08;AI&#xff09;的一个分支&#xff0c;它使计算机系统能够从经验中学习并根据这些学习的数据做出决策或预测&#xff0c;而无需进行明确的编程。简而言之&#xff0c;机器学习涉及算法和统计模型的使用&#xff0…

Hugo Barra对Apple Vision Pro 硬件和软件的详细评述

原文&#xff1a;hugo.blog/2024/03/11/vision-pro 这篇文章的作者是Hugo Barra。Hugo Barra曾是Meta公司&#xff08;前身为Facebook&#xff09;旗下Oculus VR/AR团队的负责人。他在2017年至2020年期间领导了Oculus的团队&#xff0c;参与了多个VR头显的开发和发布。Hugo Bar…