在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.properties
或application.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
接口,传入pageNum
和pageSize
参数即可获取分页数据。例如:
GET http://localhost:8080/books?page=1&size=10
响应结果将包含分页信息,如当前页、每页数量、总页数等。
分页参数说明
page
:当前页码,默认值为1。- size:每页显示的数据条数,默认值为10。
total
:总数据量。- data:当前页的数据列表。
通过以上步骤,可以轻松实现Spring Boot项目中图书数据的分页功能。PageHelper插件简化了分页逻辑的开发,提高了代码的可维护性。