Java实现SQL分页

news2024/11/19 7:25:56

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

 <!-- 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.coloradmin.cn/o/1138294.html

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

相关文章

8.稳定性专题

1. anr https://code84.com/303466.html 一句话&#xff0c;规定的时间没有干完要干的事&#xff0c;就会发生anrsystem_anr场景 input 5sservice 前台20s 后台60scontentprivider超市 比较少见 原因 主线程耗时 复杂layout iobinder对端block子线程同步锁blockbinder被占满导…

ROS自学笔记十五:URDF工具

要使用工具之前&#xff0c;首先需要安装&#xff0c;安装命令: sudo apt install liburdfdom-tools 1.check_urdf 语法检查 在ROS中&#xff0c;你可以使用.check_urdf命令行工具来对URDF&#xff08;Unified Robot Description Format&#xff09;文件进行语法检查和验证。…

【广州华锐视点】VR飞行员驾驶模拟实训系统

VR飞行员驾驶模拟实训系统是一种基于虚拟现实技术的航空装备仿真测试技术&#xff0c;可以用于飞行员、乘务员和机务人员的训练。该系统可以模拟真实的飞行环境&#xff0c;包括天气、地形、飞机性能等&#xff0c;使被试者能够在虚拟环境中进行飞行操作&#xff0c;从而提高其…

DAY35 435. 无重叠区间 + 763.划分字母区间 + 56. 合并区间

435. 无重叠区间 题目要求&#xff1a;给定一个区间的集合&#xff0c;找到需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”&#xff0c;但没有相互重叠。 示例 1: 输入: [ […

Nginx 的配置文件(负载均衡,反向代理)

Nginx可以配置代理多台服务器&#xff0c;当一台服务器宕机之后&#xff0c;仍能保持系统可用。 cmd查找端口是否使用&#xff1a;netstat -ano Nginx出现403 forbidden #解决办法&#xff1a;修改web目录的读写权限&#xff0c;或者是把nginx的启动用户改成目录的所属用户&…

题目 1059: 二级C语言-等差数列(python详解)——练气四层后期

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f352;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; ✨…

京东平台数据分析:2023年9月京东空气净化器行业品牌销售排行榜

鲸参谋监测的京东平台9月份空气净化器市场销售数据已出炉&#xff01; 9月份&#xff0c;空气净化器的销售同比上年增长。根据鲸参谋平台的数据显示&#xff0c;今年9月&#xff0c;京东平台空气净化器的销量将近15万&#xff0c;同比增长约1%&#xff1b;销售额将近2亿元&…

身份证读卡器Qt语言实现Linux系统开发集成

Linux系统用Qt开发身份证读卡器示例&#xff0c;后面是Cdemo源码&#xff1a; 编译平台&#xff1a; 麒麟V10&#xff08;SP1&#xff09;&#xff0c;amd构架&#xff0c;Intel i7-10700 CPU Qt版本&#xff1a; Qt Creator 4.11.0&#xff0c;Based on Qt 5.12.12&#xff0…

CTF-Crypto 第二天-DES加密算法原理学习

文章目录 DES算法简介DES算法流程迭代加密费斯妥函数&#xff08;F函数&#xff09;密钥调度 混淆与扩散 DES算法简介 数据加密标准&#xff08;Data Encryption Standard&#xff0c;缩写DES&#xff09;是一种对称加密算法&#xff0c;也是一种分组加密算法。 对称加密指的…

RabbitMQ的交换机(原理及代码实现)

1.交换机类型 Fanout Exchange&#xff08;扇形&#xff09;Direct Exchange&#xff08;直连&#xff09;opic Exchange&#xff08;主题&#xff09;Headers Exchange&#xff08;头部&#xff09; 2.Fanout Exchange 2.1 简介 Fanout 扇形的&#xff0c;散开的&#xff1…

linux配置jdk环境变量的三种方法

在Linux系统中&#xff0c;配置JDK环境变量是非常重要的&#xff0c;它可以让你在终端中直接使用Java命令&#xff0c;同时也能够确保你的Java应用程序能够正常运行。下面将介绍三种常用的方法来配置JDK环境变量。 方法一&#xff1a;使用/etc/profile文件 1. 打开终端&#…

TWAS模型数据*.wgt.RDat查看及导入R

TWAS模型数据*.wgt.RDat查看及导入R 1 数据导入R load(“./SLC7A8.wgt.RDat”) as.data.frame(snps) -> snp snp %>% head()V1 V2 V3 V4 V5 V6 1 12 rs10747759 0 55683634 C T 2 12 rs2293409 0 55684180 A C 3 12 rs1048103 0 55684405 C …

.DS_Store泄露

.DS_Store泄露 1.简介2.发掘和利用方式 1.简介 .DS_Store文件是苹果操作系统&#xff08;如Mac OS&#xff09;中的隐藏文件&#xff0c;它保存了文件夹的自定义属性、图标布局和其他元数据信息。通常&#xff0c;这些文件用于记录文件夹中的视图选项和布局设置。 就文件本身…

中国铁路线路数据,分为高速铁路和普通铁路,有shp格式和xlsx格式,免费下载

数据地址&#xff1a; 中国铁路线路数据https://www.xcitybox.com/datamarketview/#/Productpage?id274 基本信息. 数据名称: 中国铁路线路数据 数据格式: ShpXlsx 数据时间: 2018年 数据几何类型: 线 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据 数据…

uni-app打包apk实现自动更新

一、直接复制粘贴就可用(豪横) app.vue文件里写 //app.vue里写 <script>export default {onShow: function() {console.log(App Show)},onHide: function() {console.log(App Hide)},onLaunch: function() {let appVersion uni.getSystemInfo({success: function(e) {ap…

阿里云RocketMQ版查看消息队列的客户端

通过group查看连接mq的主机 消息队列 RocketMQ 版/实例列表/Group 管理/Group 详情/运行信息

chatgpt论文润色 降重

用chatgpt最好要给他范例。chatgpt降重原理&#xff1a; https://www.bilibili.com/video/BV1Eh411M7Ug/?spm_id_from333.337.search-card.all.click&vd_sourceebc47f36e62b223817b8e0edff181613 一. 中文论文翻译成英文 1.1 直接翻译 你是一位广义零样本学习的专家&a…

谷歌Bard更新!会有哪些体验升级?

今年2月&#xff0c;谷歌的对话机器人Bard在发布会上翻车&#xff0c;遭到了科技圈的群嘲。如今半年过去了&#xff0c;Bard卷土重来&#xff0c;在9月发布了它的重磅更新“扩展插件”&#xff0c;集成了Gmail、Google Docs、Youtube 、Google Drive、Google Maps、Google Flig…

【算法练习Day29】柠檬水找零根据身高重建队列用最少数量的箭引爆气球

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 柠檬水找零根据身高重建队列…