当前位置: 首页 > news >正文

【MyBatis】| MyBatis分页插件PageHelper

目录

一:MyBatis使⽤PageHelper

1. limit分⻚

2. PageHelper插件


一:MyBatis使⽤PageHelper

1. limit分⻚

(1)概念:

①页码:pageNum(用户会发送请求,携带页码pageNum给服务器)

②每页显示的记录条数:pageSize,例如:百度默认的是每页展示10条记录

③实际上每一次在进行分页请求发送的时候,都是要发送两个数据:pageNum和pageSize给服务器

④实际上前端提交表单的数据格式应如下:uri?pageNum=1&pageSize=10,后端调用request.getParameter方法获取到对应的页码和每页显示的记录条数      

(2)mysql当中的分页SQL应该怎么写?

①使用limit关键字,语法格式:limit startIndex,pageSize

②第⼀个数字:startIndex(起始下标,下标从0开始)

③第⼆个数字:pageSize(每⻚显示的记录条数)

④假设已知⻚码pageNum,还有每⻚显示的记录条数pageSize,那么第⼀个数字是可以动态的获取的:startIndex = (pageNum - 1) * pageSize

(3)标准通⽤的mysql分⻚SQL:

select * 
from tableName ...... 
limit (pageNum - 1) * pageSize, pageSize

 (4)使用limit关键字编写代码进行分页

三兄弟之一:CarMapper接口,编写方法

package com.bjpowernode.mybatis.mapper;import com.bjpowernode.mybatis.pojo.Car;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface CarMapper {/*** 分页查询* @param startIndex 起始下标* @param pageSize  每页显示的记录条数* @return*/List<Car> selectAllByPage(@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);
}

三兄弟之二:CarMapper.xml文件,编写sql语句

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.bjpowernode.mybatis.mapper.CarMapper"><select id="selectAllByPage" resultType="Car" >select * from t_car limit #{startInde},#{pageSize}</select>
</mapper>

三兄弟之三:CarMappeTest类,用来编写测试类

package com.bjpowernode.mybatis.test;import com.bjpowernode.mybatis.mapper.CarMapper;
import com.bjpowernode.mybatis.pojo.Car;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.List;public class CarMapperTest {@Testpublic void testSelectAllByPage(){// 应该是从前端获取到页码int pageNum = 2;// 应该是从前端获取到每页显示的条数int pageSize = 2;// 起始下标int startIndex = (pageNum-1)*pageSize;SqlSession sqlSession = SqlSessionUtil.openSession();CarMapper mapper = sqlSession.getMapper(CarMapper.class);List<Car> cars = mapper.selectAllByPage(startIndex, pageSize);cars.forEach(car -> System.out.println(car));sqlSession.close();}}

执行结果:

对应的是数据库表中:起始下标为2开始的后两条数据(下标从0开始)

 (5)其实获取数据并不难,难的是获取分⻚相关的数据⽐较难(例如:总记录条数、是否有上/下一页、分页的导航显示多少个);这些可以借助mybatis的PageHelper插件。

2. PageHelper插件

使⽤PageHelper插件进⾏分⻚,更加的便捷!

第一步:pom.xml中引入依赖

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

第二步:在mybatis-config.xml⽂件中配置插件

<!--mybatis分页的拦截器-->
<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

第三步:编写Java代码

三兄弟之一:CarMapper接口,编写方法

package com.bjpowernode.mybatis.mapper;import com.bjpowernode.mybatis.pojo.Car;
import org.apache.ibatis.annotations.Param;
import java.util.List;public interface CarMapper {/*** 查询所有的Car,通过分页查询插件PageHelper完成* @return*/List<Car> selectAll();
}

三兄弟之二:CarMapper.xml文件,编写sql语句

使用了分页插件PageHelper就不需要使用limit关键字了,直接正常查询即可!

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.bjpowernode.mybatis.mapper.CarMapper"> <select id="selectAll" resultType="Car">select * from t_car</select>
</mapper>

三兄弟之三:CarMappeTest类,用来编写测试类

注:在执行DQL语句之前,开启分页功能!

调用PageHelper的startPage(pageNum,pageSize)方法:

①第一个参数是页码pageNum

②第二个参数还是每页显示的记录条数pageSize

package com.bjpowernode.mybatis.test;import com.bjpowernode.mybatis.mapper.CarMapper;
import com.bjpowernode.mybatis.pojo.Car;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.List;public class CarMapperTest {@Testpublic void testSelectAll(){SqlSession sqlSession = SqlSessionUtil.openSession();CarMapper mapper = sqlSession.getMapper(CarMapper.class);// 在执行DQL语句之前,开启分页int pageNum = 2; // 第二页int pageSize = 3; // 每页显示的条数PageHelper.startPage(pageNum,pageSize);List<Car> cars = mapper.selectAll();cars.forEach(car -> System.out.println(car));sqlSession.close();}
}

执行结果:实际上PageHelper是在SQL语句后面自动加上了limit关键字

第2页,每页显示的条数是3,对应的数据库表中的数据就是:

 第四步:获取PageInfo对象

关键点:

①在查询语句之前,开启分⻚功能。

②在查询语句之后,封装PageInfo对象(PageInfo对象将来会存储到request域当中。在⻚⾯上展示)

package com.bjpowernode.mybatis.test;import com.bjpowernode.mybatis.mapper.CarMapper;
import com.bjpowernode.mybatis.pojo.Car;
import com.bjpowernode.mybatis.utils.SqlSessionUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.List;public class CarMapperTest {@Testpublic void testSelectAll(){SqlSession sqlSession = SqlSessionUtil.openSession();CarMapper mapper = sqlSession.getMapper(CarMapper.class);// 1. 在执行DQL语句之前,开启分页int pageNum = 1; // 第一页int pageSize = 3; // 每页显示的条数PageHelper.startPage(pageNum,pageSize);// 2. 执行SQL语句List<Car> cars = mapper.selectAll();// 3. 执行DQL之后,封装PageInfo对象,new PageInfo对象// 第二个参数就是分页导航的卡片个数PageInfo<Car> carPageInfo = new PageInfo<>(cars, 3);System.out.println(carPageInfo);sqlSession.close();}
}

执行结果:

列举几个常用的属性:

①pageNum-页码, pageSize-每页显示的记录, size=3, startRow-从第几条数据开始, endRow-从第几条数据结束, total-总记录条数, pages-页数,

②prePage-上一页的页码, nextPage-下一页的页码, isFirstPage-,是否是第一页 isLastPage-是否是最后一页, hasPreviousPage-有没有上一页, hasNextPage-有没有下一页

③navigatePages-导航页码, navigateFirstPage-导航第一页是几, navigateLastPage-导航最后一页是几, navigatepageNums-存在数据的导航页

 怎么用?

在javaweb当中,代用request.setAttribute("pageInfo",carPageInfo)方法,把数据放到request域当中;然后从request域当中取出分页的信息,在前端进行展示!

相关文章:

【MyBatis】| MyBatis分页插件PageHelper

目录 一&#xff1a;MyBatis使⽤PageHelper 1. limit分⻚ 2. PageHelper插件 一&#xff1a;MyBatis使⽤PageHelper 1. limit分⻚ &#xff08;1&#xff09;概念&#xff1a; ①页码&#xff1a;pageNum&#xff08;用户会发送请求&#xff0c;携带页码pageNum给服务器&am…...

Java枚举类详解

一、定义格式 public enum s { 枚举项1,枚举项2,枚举项3; } // 定义一个枚举类&#xff0c;用来表示春&#xff0c;夏&#xff0c;秋&#xff0c;冬这四个固定值 public enum Season {SPRING,SUMMER,AUTUMN,WINTER; } 二、枚举的特点 1、所有枚举类都是Enum的子类 2、我们可以通…...

C语言数组

一.数组定义 数组由数据类型相同的一系列元素组成 如 int main(){ float candy[365]; char code[12]; int states[50]; … } cnady是包含了365个float元素的数组。code是包含了12个char类型的数组。states包含了50个int类型的数组。 二.数组初始化和取值 我们使用花括号包含值&…...

Scala 入门(第一章Scala 环境搭建、插件的安装)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 第 1 章 Scala 入门1.1 概述1.1.1 为什么学习 Scala1.1.2 Scala 发展历史1.1.3 Scala 和 Java 关系1.1.4 Scala 语言特点1.2 Scala 环境搭建1.3 Scala 插件安装1.4 HelloWorl…...

math@多项式@求和式乘法@代数学基本定理

文章目录多项式求和式乘法应用代数学基本定理相关证明高次方程其他关于多项式的参考多项式求和式乘法 S∏j1(∑k1ajk)⁣ ⁣ ⁣j∏j1m(∑k1njajk)⁣ ⁣ ⁣jS\prod_{j1}\left(\sum\limits_{k1}a_{jk}\right)_{\!\!\!j} \\\prod_{j1}^{m}\left(\sum\limits_{k1}^{n_j}a_{jk}\r…...

Kafka系列之:基于SCRAM和Ranger机制完成动态新增kafka读写账号、赋予账号对指定Topic的读写权限

Kafka系列之:基于SCRAM和Ranger机制完成动态新增kafka读写账号、赋予账号对指定Topic的读写权限 一、需求背景二、添加写用户三、查看用户是否添加到zookeeper中四、查看用户五、赋予用户topic写权限六、生产者配置文件七、ranger给用户权限八、往Topic写数据九、删除添加的用…...

第五十三章 DFS进阶(一)——剪枝优化

第五十四章 DFS进阶&#xff08;一&#xff09;——剪枝优化一、什么是剪枝&#xff1f;二、剪枝优化的策略1、优化搜索顺序2、排除等效冗余3、可行性剪枝4、最优性剪枝5、记忆化搜索三、例题1、AcWing 165. 小猫爬山&#xff08;DFS 剪枝优化&#xff09;2、AcWing 167. 木棒…...

Java字节码深度知多少?

文章目录1、字节码结构1.1、基本结构1.2、实际观测2、内存表示3、方法调用指令4、invokedynamicEND结语Java真的是长盛不衰&#xff0c;拥有顽强的生命力。其中&#xff0c;字节码机制功不可没。字节码&#xff0c;就像是 Linux 的 ELF。有了它&#xff0c;JVM直接摇身一变&…...

【C++】智能指针(万字详解)

&#x1f308;欢迎来到C专栏~~智能指针 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&…...

使用docker配置mysql主从复制

1.新建主服务器容器实例&#xff1a; docker run -p 3307:3306 --name mysql \ -v /docker/mysql/data:/var/lib/mysql \ -v /docker/mysql/conf:/etc/mysql/conf \ -v /docker/mysql/log:/var/log/mysql \ -e MYSQL_ROOT_PASSWORDroot \ -d mysql:5.7 设置容器卷之后&#xf…...

v3 异步组件及分包使用

1 app.vue <template> <!-- vue3异步组件必须使用suspense --> <Suspense> <template #default> <!-- 异步组件 --> <SyncVue></SyncVue> </template> <template v-slot:fallback> <!-- 优先显示骨架屏 --> <…...

实用调试技巧【上篇】

&#x1f534;本文章是在 Visual Studio 2022&#xff08;VS2022&#xff09;编译环境下进行操作讲解 文章目录&#x1f973;1. 什么是bug&#xff1f;&#x1f973;2.调试有多重要&#xff1f;2.1. 我们是如何写代码的&#xff1f;2.2.调试是什么&#xff1f;2.3.调试的基本步…...

JavaScript 教程

手册简介JavaScript 是世界上最流行的脚本语言。 JavaScript 是属于 web 的语言&#xff0c;它适用于 PC、笔记本电脑、平板电脑和移动电话。 JavaScript 被设计为向 HTML 页面增加交互性。 许多 HTML 开发者都不是程序员&#xff0c;但是 JavaScript 却拥有非常简单的语法。几…...

在SpringBoot里面使用原生的Servlet

在SpringBoot里面使用Servlet 首先在主程序中添加注解主程序添加ServletComponentScan // 加上这个注解之后就可以使用原生的组件了 HttpServlet 继承HttpServlet 重写方法 添加WebServlet 第一种方式使用注解 WebServlet(value "/helsk") public class HelloSe…...

商标被驳回,先别慌!挽回商标有办法

商标注册是一个漫长的等待过程&#xff0c;提交了注册申请之后不代表就能得心应手。商标局在接收到申请后&#xff0c;便会开始各阶段审查&#xff0c;面对不符合条件的商标会予以商标驳回。商标局基于什么原因而驳回注册申请呢?驳回后还有必要进行商标驳回复审吗?今天心周企…...

VMware安装Linux虚拟机后忘记root密码处理方法

OS版本&#xff1a;Red Hat 7.7 问题说明&#xff1a; 之前用VMWare安装了一台Linux虚机&#xff0c;由于长期没使用&#xff0c;导致忘记了root密码。所以需要修改root密码。 Root密码修改 现将修改root密码的操作步骤记录如下。 1.启动虚拟机&#xff0c;出现启动倒计时…...

Centos安装OpenResty

文章目录一. OpenResty是什么二. OpenResty的安装1. 安装开发库2. 安装OpenResty仓库3. 安装OpenResty4. 安装opm工具5. 目录结构6. 配置nginx的环境变量7. 启动和运行8. 配置文件修改三. 小案例1. 案例说明2. OpenResty监听请求3. 编写业务代码4. 获取请求参数一. OpenResty是…...

阿里云部署SpringBoot项目

目录 步骤1&#xff1a;购买服务器(新用户免费试用一个月) 步骤2&#xff1a;查看服务器相关信息 ​编辑 步骤3&#xff1a;设置安全组 步骤4&#xff1a;远程连接 步骤5&#xff1a;使用FinalShell连接阿里云服务器 步骤6&#xff1a;阿里云服务器上安装JDK ​编辑 步骤7…...

EdgeCOM嵌入式边缘计算机的参数配置

EdgeCOM嵌入式边缘计算机的参数配置&#xff1a; 下面以 eth0 为例进行命令说明。 在 Linux 系统下&#xff0c;使用 ifconfig 命令可以显示或配置网络设备&#xff0c;使用 ethtool 查询及 设置网卡参数。 设置 IP 地址&#xff0c;查看当前网卡详情&#xff1a; rootfl-imx6u…...

字节软件测试岗:惨不忍睹的三面,幸好做足了准备,月薪15k,拿到offer

我今年25岁&#xff0c;专业是电子信息工程本科&#xff0c;19年年末的时候去面试&#xff0c;统一投了测试的岗位&#xff0c;软件硬件都有&#xff0c;那时候面试的两家公司都是做培训的&#xff0c;当初没啥钱&#xff0c;他们以面试为谎言再推荐去培训这点让我特别难受。 …...

别再死记硬背了!用一次完整的网页访问,帮你彻底搞懂HCIA/HCIP里的TCP/IP和OSI模型

从输入网址到页面加载&#xff1a;用真实场景拆解TCP/IP与OSI模型 想象一下这个场景&#xff1a;你在浏览器地址栏输入"www.baidu.com"&#xff0c;按下回车键&#xff0c;不到一秒就看到了熟悉的搜索页面。这看似简单的操作背后&#xff0c;隐藏着一场精密的网络协议…...

OpenClaw+百川2-13B办公自动化:会议纪要生成与邮件发送全流程

OpenClaw百川2-13B办公自动化&#xff1a;会议纪要生成与邮件发送全流程 1. 为什么需要自动化会议纪要处理 上周三的部门例会让我彻底崩溃了——2小时的会议录音&#xff0c;手动整理成纪要花了整整3小时。更糟的是&#xff0c;当我终于把邮件发出去时&#xff0c;发现漏掉了…...

【北约】认知雷达信号处理 Cognitive Radar Signal Processing

本文仅供学习使用如有侵权&#xff0c;请联系本人删除 This article is for educational purposes only. If there is any copyright infringement, please contact me to have it removed....

若依分离版集成Activiti7:从零构建企业级流程中心

1. 环境准备与版本兼容性检查 在开始整合之前&#xff0c;我们需要先确认几个关键点。若依分离版是基于SpringBoot的前后端分离架构&#xff0c;而Activiti7作为新一代工作流引擎&#xff0c;两者整合最需要注意的就是版本兼容性。我去年在金融项目里就遇到过因为版本不匹配导致…...

从.proto文件到gRPC服务:手把手教你用Protobuf 3.21.11构建跨语言API

从.proto文件到gRPC服务&#xff1a;Protobuf 3.21.11构建跨语言API实战指南 在微服务架构盛行的今天&#xff0c;不同语言编写的服务之间如何高效通信成为开发者必须面对的挑战。想象这样一个场景&#xff1a;你的Go语言后台服务需要与Python数据分析服务共享用户数据&#xf…...

Llama-3.2V-11B-cot跨平台部署:从VMware虚拟机到物理服务器

Llama-3.2V-11B-cot跨平台部署&#xff1a;从VMware虚拟机到物理服务器 最近在帮几个团队部署Llama-3.2V-11B-cot这个多模态大模型&#xff0c;发现一个挺有意思的现象&#xff1a;大家的基础设施环境差别太大了。有的团队用的是VMware虚拟化集群&#xff0c;资源灵活但总觉得…...

无障碍辅助工具:OpenClaw+GLM-4-7-Flash语音控制电脑操作

无障碍辅助工具&#xff1a;OpenClawGLM-4-7-Flash语音控制电脑操作 1. 为什么需要本地化的语音控制方案 去年夏天&#xff0c;我帮一位因车祸导致手臂骨折的朋友临时搭建了一套语音控制系统。当时市面上主流的语音助手要么需要联网&#xff0c;要么对中文指令的理解能力有限…...

从技术到生态:FunASR如何构建开源语音识别新范式

从技术到生态&#xff1a;FunASR如何构建开源语音识别新范式 FunASR是一个端到端语音识别工具包&#xff0c;提供了丰富的预训练模型和便捷的开发工具&#xff0c;帮助开发者快速构建语音识别应用。本文将深入探讨FunASR的技术架构、核心功能、应用场景以及生态系统&#xff0…...

SkeyeVSS中国标GB28181、流媒体源RTMP/RTSP/HTTP/ONVIF、RTMP推流等协议视频流实时播放流程详解

本文基于 core/app/sev/vss/internal/logic/http/video/stream_play.go 的源码&#xff1a;从参数与设备查询&#xff0c;到按接入协议分支、触发 MS 拉流或 GB28181 Invite&#xff0c;再到返回 StreamResp 与异步处理。 源码地址 点击直达 一、接口入口与请求体 项目说明…...

MacOS极简部署OpenClaw:GLM-4.7-Flash云端沙盒体验

MacOS极简部署OpenClaw&#xff1a;GLM-4.7-Flash云端沙盒体验 1. 为什么选择云端沙盒体验 作为一个长期在本地折腾各种AI工具的技术爱好者&#xff0c;我最近被OpenClaw的自动化能力深深吸引。但在第一次尝试本地部署时&#xff0c;就被Node环境配置、依赖冲突等问题劝退。直…...