使用Spring Boot和PageHelper实现数据分页

在Spring Boot项目中,利用PageHelper插件可以轻松实现数据分页功能。以下是具体的实现步骤和代码示例。

添加依赖

在项目的pom.xml文件中添加PageHelper和MyBatis的依赖。

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.6</version>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>

配置PageHelper

application.propertiesapplication.yml中配置PageHelper的参数。

# PageHelper配置
pagehelper:
  helper-dialect: mysql
  reasonable: true
  support-methods-arguments: true
  params: count=countSql

创建实体类

假设我们有一个图书系统数据,定义图书实体类,对应数据库中的图书表。

package com.itheima.sprintbootmybatis.pojo;

/**
 * Book 实体类
 */
public class Book {
    // 图书ID,使用Long类型
    private Long id;

    // 图书名称,使用String类型
    private String name;

    // 图书作者,使用String类型
    private String author;

    // 图书价格,使用Double类型
    private Double price;

    // Getters 和 Setters 方法
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    // 重写toString方法,方便打印对象信息
    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }
}

创建Mapper接口

创建一个MyBatis的Mapper接口,用于查询图书数据。

package com.itheima.sprintbootmybatis.mapper;
import com.itheima.sprintbootmybatis.pojo.Book;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface BookMapper {
//查询所有图书

    @Select("select * FROM books")
    List<Book> getAllBooks();
    @Select("SELECT COUNT(*) FROM books")
    long getTotalBooks(); // 获取总记录数

}

创建Service层

创建UserServiceImpl和UserService;

在Service层中调用PageHelper进行分页查询。

package com.itheima.sprintbootmybatis.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itheima.sprintbootmybatis.mapper.BookMapper;
import com.itheima.sprintbootmybatis.pojo.Book;
import com.itheima.sprintbootmybatis.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;


@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookMapper bookMapper;

    @Override
    public List<Book> getAllBooks(int page, int size) {
        //确保页码和每页大小合理
        if (page <= 0) page = 1;
        if (size <= 0) size = 10;
        // 使用PageHelper进行分页
        PageHelper.startPage(page, size);
        return bookMapper.getAllBooks();
    }
    @Override
    public long getTotalBooks() {
        return bookMapper.getTotalBooks(); // 调用Mapper方法获取总记录数
    }
}
package com.itheima.sprintbootmybatis.service;
import com.itheima.sprintbootmybatis.pojo.Book;

import java.util.List;

public interface BookService {
    List<Book> getAllBooks(int page,int size);

    long getTotalBooks();
}

创建统一的BookApiResponse 

设计一个通用的响应类有助于保持API的一致性,便于前端处理和错误管理。以下是一个常见的实现方式。

package com.itheima.sprintbootmybatis.common;
import java.util.List;
public class BookApiResponse<T> {
    private int code;      // 状态码
    private List<T> data;  // 数据列表
    private int page;      // 当前页码
    private int size;      // 每页大小
    private long total;    // 总记录数

    // 成功时的构造函数
    public BookApiResponse(List<T> data, int page, int size, long total) {
        this.code = 200; // 默认成功状态码
        this.data = data;
        this.page = page;
        this.size = size;
        this.total = total;
    }

    // 错误时的构造函数
    public BookApiResponse(int code, String message) {
        this.code = code;
        this.data = null;
        this.page = 0;
        this.size = 0;
        this.total = 0;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public List<T> getData() {
        return data;
    }

    public void setData(List<T> data) {
        this.data = data;
    }

    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public long getTotal() {
        return total;
    }

    public void setTotal(long total) {
        this.total = total;
    }
}

创建Controller层

在Controller中接收分页参数并返回分页结果。

package com.itheima.sprintbootmybatis.controller;

import com.itheima.sprintbootmybatis.pojo.Book;
import com.itheima.sprintbootmybatis.service.BookService;
import com.itheima.sprintbootmybatis.common.BookApiResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/books")
public class BookController {
    @Autowired
    private BookService bookService;

    @GetMapping
    public BookApiResponse<Book> getAllBooks(
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "10") int size) {
        try {
            List<Book> books = bookService.getAllBooks(page, size);
            long total = bookService.getTotalBooks(); // 获取总记录数
            return new BookApiResponse<>(books, page, size, total);
        } catch (Exception e) {
            e.printStackTrace();
            return new BookApiResponse<>(500, "Internal Server Error");
        }
    }
}

测试分页功能

启动项目后,访问/books接口,传入pageNumpageSize参数即可获取分页数据。例如:

GET http://localhost:8080/books?page=1&size=10

响应结果将包含分页信息,如当前页、每页数量、总页数等。

分页参数说明

  • page:当前页码,默认值为1。
  • size:每页显示的数据条数,默认值为10。
  • total:总数据量。
  • data:当前页的数据列表。

通过以上步骤,可以轻松实现Spring Boot项目中图书数据的分页功能。PageHelper插件简化了分页逻辑的开发,提高了代码的可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值