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

结果如下

a2bd5c4e360f4abfb0c4e65263bcca19.png

上面是使用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;
    }
}

结果如下

f7887784541641d4bc46c523e373ca41.png

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

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

运行

949c2ed0126e48539c6c60c64ec657f2.png

上述方法都可以 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大白猫~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值