Java实现SQL分页

这篇具有很好参考价值的文章主要介绍了Java实现SQL分页。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

编写配置类 

@Configuration
public class MybatisPlusConfiguration {

    /**
     * 配置mysql拦截器
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

}

在控制器层可以加上之后使用

 page.setOptimizeCountSql(false);

了解如下 

page.setOptimizeCountSql(false); 是 MyBatis 框架中的一个配置选项,用于控制是否优化分页查询中的总记录数查询 SQL。这通常用于分页查询,其中需要获取总记录数以计算总页数等信息

当 page.setOptimizeCountSql(true); 时,MyBatis 将尝试优化总记录数查询 SQL,以提高性能。通常,这意味着 MyBatis 会尝试从分页查询的 SQL 语句中提取总记录数,而不会执行额外的总记录数查询

当 page.setOptimizeCountSql(false); 时,MyBatis 将不进行总记录数查询的优化,而是会执行一个额外的 SQL 查询来获取总记录数。这可以保证总记录数的准确性,但可能会增加数据库的负载,尤其在处理大数据集时

选择是否启用总记录数查询的优化取决于你的具体需求和性能要求。如果你可以容忍轻微的性能损失以获得更准确的总记录数,可以将其设置为 false,否则,你可以将其设置为 true 以提高性能

大致流程如下

在控制器中注入业务层实现方法时需要加上参数IPage

public R pageByListAll(Page page) //传入 current=页码,size=页大小
{
     IPage<dabaimao> pageData = dabaimaoService.listAll(page); //(dabaimao为查询结果集的类)
     return R.ok(pageData);
}

在Service中实现将Ipage传入Mapper文件中

    /**
     * 分页
     * @param current 页码
     * @param size 页大小
     * @return
     */  
    @Override
    public IPage<dabaimao> listAll(IPage<dabaimao> page) {
        // IPage<dabaimao> pageset = new IPage(page, size);
        //也可以直接使用IPage获取
        IPage<dabaimao> pageData = this.baseMapper.listAll(page);
        //数据进行分页变成IPage对象
        return pageData;
    }

 在mapper层中加入参数Ipage实现分页

IPage<Dabaimao> listAll(IPage page);

结果如下

Java实现SQL分页,sql,java,数据库,spring boot,maven,java-ee,tomcat

上面是使用mybatis-puls实现分页,也可以使用Pagehandle这个工具类

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

获得数据后

PageHelper.startPage(page, size);
PageInfo<Dabaimao> pageData= new PageInfo<>(data);

工具类如下

@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;
    }
}

结果如下

Java实现SQL分页,sql,java,数据库,spring boot,maven,java-ee,tomcat

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

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分页,sql,java,数据库,spring boot,maven,java-ee,tomcat

上述方法都可以 文章来源地址https://www.toymoban.com/news/detail-714419.html

到了这里,关于Java实现SQL分页的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java从入门到精通24==》数据库、SQL基本语句、DDL语句

    2023.8.27 数据库是一个电子化储存数据的系统,它能够以结构化形式组织、存储和管理数据,使得数据的访问、操作和管理变得更为高效、可靠和安全 数据库通常包括数据、数据结构、查询语言、数据存储和检索引擎等多个组成部分,可分为关系型数据库、非关系型数据库等

    2024年02月11日
    浏览(45)
  • Java一般用于postgis空间数据库通用的增删查改sql命令

    目录 1 增加 2 删除 3 查询 4 更新 \\\"public\\\".\\\"JGSQGW_Geo\\\"为某模式下得表  一般postgrel有这样的设计模式

    2024年02月13日
    浏览(45)
  • SQL Server、MySQL和Oracle数据库分页查询的区别与联系

    摘要:本文将通过一个现实例子,详细解释SQL Server、MySQL和Oracle这三种常见关系型数据库在分页查询方面的区别与联系。我们将提供具体场景下的SQL语句示例,并解释每个数据库的分页查询用法以及优化方法,帮助读者更好地选择适合自己需求的分页查询方式。 假设我们有一

    2024年02月11日
    浏览(53)
  • 实战Java springboot 采用Flink CDC操作SQL Server数据库获取增量变更数据

    目录 前言: 1、springboot引入依赖: 2、yml配置文件 3、创建SQL server CDC变更数据监听器 4、反序列化数据,转为变更JSON对象 5、CDC 数据实体类 6、自定义ApplicationContextUtil 7、自定义sink 交由spring管理,处理变更数据         我的场景是从SQL Server数据库获取指定表的增量数据,查

    2024年02月10日
    浏览(87)
  • Java实现SQL分页

    在日常开发需要对数据进行分页,配置如下 编写配置类  在控制器层可以加上之后使用 了解如下  大致流程如下 在控制器中注入业务层实现方法时需要加上参数IPage 在Service中实现将Ipage传入Mapper文件中  在mapper层中加入参数Ipage实现分页 结果如下 上面是使用mybatis-puls实现分

    2024年02月08日
    浏览(41)
  • Microsoft SQL Server 2019 下载、安装及Java JDBC配置连接数据库(多图详解 超详细)

    一、下载 下载链接Microsoft SQL Server 二、安装 1.找到刚刚下载的文件,双击打开后,选择基本并接受 2.选择接受 3.选择安装位置,并点击安装,然后等待下载安装完成 4.正在安装 -5.遇到了一个问题,重启一下(未遇到该问题的可忽略此步) 6.安装成功,点击安装SSMS 7.点击下载

    2024年02月04日
    浏览(105)
  • 从数据库中取时间值,报错:java.sql.Timestamp cannot be cast to java.lang.Long

    1、问题描述 将数据库中的查询到的 timestamp类型的数据,转成 Long类型报错。 2、解决方案 因为 java.sql.Timestamp 是 java.util.Date 的子类; 所以,直接 将 java.sql.Timestamp 转换为 java.util.Date 类型 即可。 或者将数据转成String类型输出: DateUtil 工具类如下:

    2024年02月15日
    浏览(45)
  • 24、Flink 的table api与sql之Catalogs(java api操作数据库、表)-2

    一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。 3、

    2024年02月04日
    浏览(55)
  • Cause: java.sql.SQLSyntaxErrorException: Table ‘xxx数据库.xxx表‘ doesn‘t exist

    Cause: java.sql.SQLSyntaxErrorException: Table ‘xxx数据库.xxx表‘ doesn‘t exist 这个错误通常表示在数据库中找不到指定的表。出现这个错误的原因可能有几种,包括以下情况: 表不存在:最明显的原因是表确实不存在于数据库中。这可能是由于表名拼写错误、数据库连接错误或表在数

    2024年02月05日
    浏览(44)
  • Bug解决:获取JDBC连接失败;嵌套异常是java.sql.SQLException:无法从底层数据库获取连接

    出现的问题 Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database! 说白了就是连接数据库出问题了,寻找了一个半小时才发现错误 从头到尾检查了一遍,这里使用的是C3P0连接池。 解决方法 1.如果使用的是c3p0连接池,prop

    2023年04月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包