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());}

运行

上述方法都可以 

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

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

相关文章

Openssl数据安全传输平台011:秘钥协商客户端

文章目录 0. 代码仓库拷贝jsoncpp库至工程目录下编译protobuf类文件Message.proto VS 2022 设置 0. 代码仓库 https://github.com/Chufeng-Jiang/OpenSSL_Secure_Data_Transmission_Platform/tree/main/Preparation 拷贝jsoncpp库至工程目录下 编译protobuf类文件 VS2022 pr…

Unity C#中LuaTable、LuaArrayTable、LuaDictTable中数据的增删改查

LuaTable、LuaArrayTable、LuaDictTable中数据的增删改查 介绍Lua表lua表初始化lua移除引用lua中向表中添加数据lua中表中移除数据lua表中连接数据lua表中数据排序获取lua表长度获取表中最大值 UnityC#中LuaTableUnityC#中LuaArrayTable、LuaDictTable、LuaDictTable<K,V>…

asp.net教务管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio计算机毕业设计

一、源码特点 asp.net 教务管理信息系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言 开发 asp.net教务管理系统 应用技术&a…

随写 - GPT使用时机

感慨科技的进步&#xff0c;还记得15年的时候初中&#xff0c;需要写一篇什么读后感&#xff0c;东抄西凑一篇500字的语句不通顺的文章交上去&#xff0c;那时候什么文库啥的都不需要会员&#xff0c;直接复制就行了。 现在问一问GPT什么都出来了。 1.EDA设计 由于课程结束&am…

【AICFD案例操作】汽车外气动分析

AICFD是由天洑软件自主研发的通用智能热流体仿真软件&#xff0c;用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程&#xff0c;帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

大彩串口屏读写文件问题

分区 本文使用的是大彩串口屏M系列的&#xff1a; 串口屏内部有三个分区&#xff0c;分别为A、B、C三个区&#xff1a; A区&#xff1a;系统区&#xff0c;存储组态工程文件 B区&#xff1a;数据区&#xff0c;存储配置信息&#xff0c;记录数据、历史曲线等 C区&#xff1a;备…

Java练习题2022-3

从键盘上输入一个数值字符串&#xff08;表示非负整数&#xff0c;所以该字符串不带正负号和小数点&#xff09;&#xff0c;输出这个字符串中的数字字符重新组合的最小数。例如“654321”输出的为“123456”&#xff1b;“001254”输出为“100245”&#xff1b;“00000”输出为…

iOS Autolayout 约束设置【顺序】的重要性!

0x00 顺序不同&#xff0c;结果不同 看图说话 1 代码是这样滴~ 设置好约束&#xff0c;让 4 个按钮&#xff0c;宽度均分~ 结果如上图 [_pastButton.topAnchor constraintEqualToAnchor:_textView.bottomAnchor constant:6].active YES;[_pastButton.leftAnchor constraintEq…

香港服务器运行不正常原因简析

​  网站在线业务的部署需要服务器的存在。于我们而言&#xff0c;租用正规服务商(正规机房)的服务器&#xff0c;一般情况下是会很少出现问题。但&#xff0c;要知道&#xff0c;再稳定的服务器也有出现问题的时候&#xff0c;香港服务器也不例外&#xff0c;而且恰恰这个原…

变压器分析

参考方向 如图所示&#xff0c;是变压器的原理图。其中&#xff0c; ϕ \phi ϕ是变压器铁芯的有效磁通&#xff0c; ϕ 1 \phi_1 ϕ1​是主线圈的漏磁通&#xff0c; ϕ 2 \phi_2 ϕ2​是副线圈的漏磁通。图中 u 1 u_1 u1​为初级线圈输入电压&#xff0c; i 1 i_1 i1​为初级…

LeetCode刷题:88. 合并两个有序数组

文章目录 写在前面⭐️88. 合并两个有序数组⭐️&#x1f510;题目描述&#x1f4a1;解题思路&#x1f511;代码 写在前面 本题的题解代码是用C语言编写的。 &#x1f4d2;博客主页&#xff1a;2023Fighting的博客主页 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收…

大厂面试题-JVM中的三色标记法是什么?

目录 问题分析 问题答案 问题分析 三色标记法是Java虚拟机(JVM)中垃圾回收算法的一种&#xff0c;主要用来标记内存中存活和需要回收的对象。 它的好处是&#xff0c;可以让JVM不发生或仅短时间发生STW(Stop The World)&#xff0c;从而达到清除JVM内存垃圾的目的&#xff…