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

Java实现SQL分页

在日常开发需要对数据进行分页,配置如下

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

在控制器层参数加上Page page,之后使用

 page.setOptimizeCountSql(false);

了解如下 

page.setOptimizeCountSql(false); 是 MyBatis 框架中的一个配置选项,用于控制是否优化分页查询中的总记录数查询 SQL。这通常用于分页查询,其中需要获取总记录数以计算总页数等信息当 page.setOptimizeCountSql(true); 时,MyBatis 将尝试优化总记录数查询 SQL,以提高性能。通常,这意味着 MyBatis 会尝试从分页查询的 SQL 语句中提取总记录数,而不会执行额外的总记录数查询当 page.setOptimizeCountSql(false); 时,MyBatis 将不进行总记录数查询的优化,而是会执行一个额外的 SQL 查询来获取总记录数。这可以保证总记录数的准确性,但可能会增加数据库的负载,尤其在处理大数据集时选择是否启用总记录数查询的优化取决于你的具体需求和性能要求。如果你可以容忍轻微的性能损失以获得更准确的总记录数,可以将其设置为 false,否则,你可以将其设置为 true 以提高性能
Page<类> page = new Page(page, pageSize);
//生成数据data
pageInfo = this.baseMapper.selectPage(page, data);
return pageInfo;

结果如下

也可以使用Pagehandle这个包

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

获得数据后

PageHelper.startPage(页码, 页大小);
PageInfo<类> 对象= new PageInfo<>(数据);

工具类如下

@Component
public class PageInfoUtil {public static PageInfo<T> getData(List<T> data, int pageNumber, int pageSize) {PageHelper.startPage(pageNumber, pageSize);PageInfo<T> Result= new PageInfo<>(data);return Result;}
}

结果如下

最后可以自己写一个工具类

public class PaginationInfo<T> {private int pageNum;            // 当前页码private int pageSize;           // 每页大小private int size;               // 当前页数据条数private int startRow;           // 当前页的起始行private int endRow;             // 当前页的结束行private long total;             // 总数据条数private int pages;              // 总页数private List<T> list;           // 当前页的数据列表private int prePage;            // 前一页页码private int nextPage;           // 后一页页码private boolean isFirstPage;    // 是否是第一页private boolean isLastPage;     // 是否是最后一页private boolean hasPreviousPage; // 是否有前一页private boolean hasNextPage;     // 是否有后一页private int navigatePages;      // 导航页码数private int navigateFirstPage;  // 导航页的第一页页码private int navigateLastPage;   // 导航页的最后一页页码private List<Integer> navigatepageNums; // 导航页码列表// 构造函数,用于创建 PaginationInfo 对象public PaginationInfo(List<T> data, int pageNum, int pageSize) {this.pageNum = pageNum;this.pageSize = pageSize;this.list = data;this.total = data.size();this.pages = (int) Math.ceil((double) total / pageSize);if (pageNum < 1) {pageNum = 1;} else if (pageNum > pages) {pageNum = pages;}int fromIndex = (pageNum - 1) * pageSize;int toIndex = Math.min(fromIndex + pageSize, data.size());this.size = toIndex - fromIndex;this.list = data.subList(fromIndex, toIndex);this.startRow = fromIndex + 1;this.endRow = fromIndex + size;this.prePage = pageNum > 1 ? pageNum - 1 : 1;this.nextPage = pageNum < pages ? pageNum + 1 : pages;this.isFirstPage = pageNum == 1;this.isLastPage = pageNum == pages;this.hasPreviousPage = pageNum > 1;this.hasNextPage = pageNum < pages;this.navigatePages = 8; // 可以根据需要进行调整this.calcNavigatePageNumbers();if (this.navigatepageNums != null && !this.navigatepageNums.isEmpty()) {this.navigateFirstPage = this.navigatepageNums.get(0);this.navigateLastPage = this.navigatepageNums.get(this.navigatepageNums.size() - 1);}}// 计算导航页码列表private void calcNavigatePageNumbers() {navigatepageNums = new ArrayList<>();int startNum;int endNum;if (pages <= navigatePages) {startNum = 1;endNum = pages;} else {int halfPages = navigatePages / 2;startNum = pageNum - halfPages;endNum = pageNum + halfPages;if (startNum < 1) {startNum = 1;endNum = navigatePages;}if (endNum > pages) {endNum = pages;startNum = pages - navigatePages + 1;}}for (int i = startNum; i <= endNum; i++) {navigatepageNums.add(i);}}
}

测试如下

public static void main(String[] args) {// 创建一个示例数据列表List<String> dataList = new ArrayList<>();for (int i = 1; i <= 50; i++) {dataList.add("Item " + i);}// 每页显示10条数据int pageSize = 10;// 测试PaginationInfo类PaginationInfo<String> paginationInfo = new PaginationInfo<>(dataList, 1, pageSize);// 打印分页信息System.out.print("当前页:" + paginationInfo.getPageNum()+" ");System.out.print("每页大小:" + paginationInfo.getPageSize()+" ");System.out.print("总数据条数:" + paginationInfo.getTotal()+" ");System.out.print("总页数:" + paginationInfo.getPages()+" ");System.out.print("当前页数据条数:" + paginationInfo.getSize()+" ");System.out.print("是否第一页:" + paginationInfo.isFirstPage()+" ");System.out.print("是否最后一页:" + paginationInfo.isLastPage()+" ");System.out.print("前一页页码:" + paginationInfo.getPrePage()+" ");System.out.print("后一页页码:" + paginationInfo.getNextPage()+" ");// 打印当前页的数据列表List<String> currentPageData = paginationInfo.getList();System.out.println("当前页的数据:");for (String item : currentPageData) {System.out.println(item);}// 打印导航页码列表List<Integer> navigatePageNums = paginationInfo.getNavigatepageNums();System.out.println("导航页码列表:");for (Integer pageNum : navigatePageNums) {System.out.println(pageNum);}System.out.println(paginationInfo.toString());}

运行

上述方法都可以 

相关文章:

Java实现SQL分页

在日常开发需要对数据进行分页&#xff0c;配置如下 <!-- baomidou --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</version></dependency> 在控…...

软件测试进阶篇----自动化测试脚本开发

自动化测试脚本开发 一、自动化测试用例开发 1、用例设计需要注意的点 2、设计一条测试用例 二、脚本开发过程中的技术 1、线性脚本开发 2、模块化脚本开发&#xff08;封装线性代码到方法或者类中。在需要的地方进行调用&#xff09; 3、关键字驱动开发&#xff1a;selen…...

rust std

目录 一&#xff0c;std基本数据结构 1&#xff0c;std::option 2&#xff0c;std::result 二&#xff0c;std容器 1&#xff0c;vector 三&#xff0c;std算法 1&#xff0c;排序 2&#xff0c;二分 &#xff08;1&#xff09;vector二分 &#xff08;2&#xff09;…...

SpringMVC(下)

1、拦截器&#xff1a; 1、拦截器的配置: SpringMVC中的拦截器用于拦截控制器方法的执行 SpringMVC中的拦截器需要实现HandlerInterceptor <!--配置拦截器--><mvc:interceptors><!--对所有的请求进行拦截--><!--<bean class"com.songzhishu.m…...

分布式操作系统的必要性及重要性

总有人在各个平台留言或者私信问LAXCUS分布式操作系统的各种问题&#xff0c;尤其是关于分布式操作系统的应用市场、价值、意义之类的问题。我们团队做LAXCUS分布式操作系统&#xff0c;也不是头脑凭空发热&#xff0c;是基于我们之前的大量产品设计、经验逐渐一步步做起来。当…...

【Javascript】定时器

目录 延迟执行 定时执行 清除定时任务 延迟执行 setTimeout(function(){}, 毫秒) console.log(1); console.log(2); console.log(3); setTimeout(function (){console.log(5) },5000) console.log(4);setTimeout(function (){ console.log(5) },5000) 设定了一个任务&…...

基于stm32的ADC读取烟雾报警器的数值

本文想要设计一个设计一个有stm32控制的烟雾报警系统。通过MQ-2烟雾报警器将获取模拟的数值传递给stm32的ADC外设并在串口助手上显示对应的电压值。烟雾报警器浓度越高&#xff0c;他的电压就越高&#xff0c;但是不会超过3.3V。设置一个电压临界值&#xff0c;当传输回来的电压…...

无需更换vue-cli 脚手架 uniapp-搭建项目-H5-低版本安卓IOS兼容问题(白屏)(接口请求异常)

✨求关注~ &#x1f4bb;博客&#xff1a;www.protaos.com I. 简介 A. UniApp项目概述 B. 白屏和接口请求异常问题的背景 II. 白屏问题 A. 问题描述 1、uniapp 打包H5内嵌入APP内、低版本手机系统访问白屏问题 B. 问题根本原因 1、低版本手机系统 自带的webview内核不支持ES6语…...

【IO面试题 四】、介绍一下Java的序列化与反序列化

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;介绍一下Java的序列化与…...

M1本地部署Stable Diffusion

下载安装 参考博客: 在Mac上部署Stable Diffusion&#xff08;超详细&#xff0c;AI 绘画入门保姆级教程&#xff09; 安装需要的依赖库 brew install cmake protobuf rust python3.10 git wget 可能中途会存在下载报错或者下载卡主的问题,需要切国内源 brew进行替换源: …...

java中的内存分配

目录 1.堆内存 2.栈内存 3.常量池 4.寄存器 5.示例 6.总结 1.堆内存 堆用来存放程序中动态生产的数据&#xff0c;如new出来的对象。 通过new方式创建的对象&#xff0c;数组及字符串都有自己的内存地址。 方法调用完毕后&#xff0c;方法中new出来的对象就会变成垃圾…...

Matter.js 插件:matter-wrap(世界是圆的)

本文简介 点赞 关注 收藏 学会了 记得以前看爆笑校园里有一集讲到&#xff0c;一个人对着前面开了一枪&#xff0c;过了一阵子弹打中他自己的后脑勺。作者想通过这个冷笑话告诉大家一件事&#xff1a;地球是圆的。 在 Matter.js 世界里&#xff0c;默认是没有边界的&#…...

HCIA --- ACL(访问控制列表)

ACL访问控制列表 一、作用 访问控制 --- 在路由器流量进或出的接口上&#xff0c;匹配流量产生动作---允许、拒绝定义感兴趣流量 --- 抓取流量&#xff0c;之后给到其他的策略&#xff0c;让其他策略进行工作&#xff1b; 二、匹配规则 至上而下逐一匹配&#xff0c;上条匹…...

Xcode自定义快捷键

一、新建脚本 1. 编写脚本 把脚本sh文件保存在安全的目录&#xff0c;不会被删除 我这里主要是两个常用的&#xff1a; 1.打开终端: xcode-terminal.sh #!/bin/shif [ -n "$XcodeProjectPath" ]; then open -a Terminal "$XcodeProjectPath"/.. elseo…...

jmeter界面压测过程卡死解决思路

1、排查压测机的资源是否充足&#xff1b; 2、检查jmeter压测脚本&#xff0c;除聚合报告的所有组件关闭&#xff1b; 我在压测过程中出现频繁卡死&#xff0c;就是查看结果数和断言结果信息量过多导致&#xff1a; 3、直接用非gui界面形式&#xff0c;也就是脚本形式压测。...

听GPT 讲Rust源代码--library/std(6)

题图来自 Why you should use Python and Rust together[1] File: rust/library/std/src/sys/unix/thread_parking/netbsd.rs 文件netbsd.rs位于Rust源代码的rust/library/std/src/sys/unix/thread_parking目录下。该文件是Rust标准库中用于Unix操作系统的线程等待和唤醒机制的…...

如何使用gpt提高效率

如何使用gpt提高效率 自动化替代人力工作减少创意工作需求技术依赖风险实际应用领域内容生成自动回答问题自动化编程个性化推荐 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&…...

配置VUE环境过程中 npm报错的处理方案以及VUE环境搭建过程

背景&#xff1a;VUE已经出来很久了&#xff0c;一直想研究这个东西也很久了。由于各种各样的原因&#xff0c;一直没有能处理。最近终于有时间可以研究了。 奈何报错了 嘤嘤嘤~~ 针对报错情况&#xff0c;其实后来没有找到什么好的方案&#xff0c;几经周折&#xff0c;终于搭…...

springboot 配置文件加载顺序

SpringBoot中配置文件的加载顺序是怎样的? 优先级从高到低&#xff0c;高优先级的配置覆盖低优先级的配置&#xff0c;所有配置会形成互补配置。 1.命令行参数。所有的配置都可以在命令行上进行指定; 2.Java系统属性(System.getProperties0) ; 3.操作系统环境变量 4.jar包外…...

二分查找java

一、题目。 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出: 4…...

深入理解Java中的转义字符

最近在学习《两周自制脚本语言》这本书&#xff0c;在词法分析的一些复杂的正则中用到了大量的转义字符’\&#xff0c;比如正则字符串中包含了这个部分\\\\\"你知道它是匹配什么的么&#xff1f; 反斜杠在字符串和正则表达式中都有特殊作用。今天让我们来深入理解一下Ja…...

VScode 调试 linux内核

VScode 调试 linux内核 这里调试的 linux 内核是通过 LinuxSD卡(rootfs)运行的内核 gdb 命令行调试 编辑 /home/tyustli/.gdbinit 文件&#xff0c;参考 【GDB】 .gdbinit 文件 set auto-load safe-path /home/tyustli/code/open_source/kernel/linux-6.5.7/.gdbinit在 lin…...

Babylonjs学习笔记(五)——创建PBR材质

书接上回&#xff0c;这里讨论PBR材质&#xff01;&#xff01;&#xff01; // 创建天空盒/* */const createSkyBox (scene:Scene):void>{const envTex CubeTexture.CreateFromPrefilteredData(./env/environment.env,scene)scene.environmentTexture envTex;scene.cre…...

C++ -- 深入理解多态

前言&#xff1a;多态的概念&#xff0c;通俗地来讲就是多种形态。当我们要完成某个行为的时候&#xff0c;不同的对象去完成时会产生不同的状态&#xff0c;这就叫做多态。具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会 产生出不同的状态。多态在C的类和对象中…...

【Java】泛型通配符

类型通配符 类型通配符<?> 一般用于接受使用&#xff0c;不能够做添加List<?>&#xff1a;表示元素类型未知的list&#xff0c;它的元素可以匹配任何类型带通配符的List仅表示它是各种泛型List的父类&#xff0c;并不能把元素添加到其中类型通配符上限&#xff1…...

NNDL:作业五

习题4-1 对于一个神经元,并使用梯度下降优化参数w时,如果输入x恒大于0,其收敛速度会比零均值化的输入更慢. 证明&#xff1a; 激活函数以sigmoid为例。 神经元&#xff1a;有两层&#xff0c;线性层和激活层&#xff1a;yw*xb,然后y‘sigmoid(y)&#xff0c;也就是。 梯度…...

OpenAI大模型项目计划表(InsCode AI 创作助手)

OpenAI大模型项目计划表 阶段任务负责人开始日期完成日期立项确定项目目标和范围项目经理2023-05-012023-05-03确定项目团队和资源项目经理2023-05-042023-05-05确定项目时间表和里程碑项目经理2023-05-062023-05-10数据收集收集训练数据和标注数据团队2023-05-112023-05-20确…...

MyBatis入门的第一个程序

2023.10.28 今天正式开始MyBatis的学习&#xff0c;先来一个入门程序的编写。 ①准备一个数据库表&#xff1a; ②配置pom.xml文件&#xff1a;&#xff08;打包方式和2个依赖的引入&#xff09; <?xml version"1.0" encoding"UTF-8"?> <proj…...

React项目中使用zustand状态管理详细教程

zustand 是一个用于状态管理的小巧而强大的库&#xff0c;它与 React 非常兼容。以下是使用 zustand 在 React 项目中进行状态管理的详细教程&#xff1a; 步骤 1&#xff1a;安装 zustand 首先&#xff0c;你需要安装 zustand。你可以使用 npm 或 yarn 安装它&#xff1a; …...

Linux 扩展 root 文件系统

本文描述的是通过Linux自带的工具&#xff0c;不用安装额外的包&#xff0c;来实现root文件系统的扩展。 我们可以看到&#xff0c;根盘46.6G&#xff1a; # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 46.6G 0 disk ├─sda1 …...