SpringBoot分页实现

简介

分页功能是一个简单但必需的功能,在 SpringBoot 中分页实现非常的简单,有多种实现方式;主要和项目集成的持久层框架有关;这里主要介绍集成 MyBatis 和 SpringDataJpa 的分页实现

Mybatis - 使用 PageHelper 分页

  1. 首先在 pom.xml 配置文件中添加如下依赖
<!-- 
    mybatis提供了拦截器接口,我们可以实现自己的拦截器, 将其作为一个 plugin 装入到 SqlSessionFactory, 
    GitHub上有一个分页插件, 使用起来非常的方便, 项目地址: https://github.com/pagehelper/Mybatis-PageHelper
-->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>4.1.0</version>
</dependency>
  1. 在项目配置类中添加如下实现

public class AppConfig {
    // 设置分页; 也可以配置到 properties 文件中
    
    public PageHelper pageHelper() {
        PageHelper pageHelper = new PageHelper();
        Properties properties = new Properties();
        properties.setProperty("offsetAsPageNum", "true");
        properties.setProperty("rowBoundsWithCount", "true");
        properties.setProperty("reasonable", "true");
        properties.setProperty("dialect", "mysql");
        pageHelper.setProperties(properties);
        return pageHelper;
    }
}
  1. 在 CatMapper.class 中添加一个新的方法(查询所有的记录)
("select * from cat order by id ASC")
public List<cat> listAll();
  1. 在 CatController.class 中,添加如下代码

("/cat")
public class CatController {
    
    private PageHelper pageHelper;

    ("page")
    public List < Cat > listPage(Integer pageNum, Integer pageSize) {
        // 这里第一页的页码就是1, 而spring-data-jpa的第一页的页码是0
        pageHelper.startPage(pageNum, oageSize);
        return catService.listAll();
    }
}

注意

(1) PageHelper 插件如果版本过高的话,会在系统启动的时候抛出异常,如果自信程序无错误,可以尝试降低该插件的版本,或许能解决问题

(2) 该插件主要和 Mybatis 搭配使用,如果使用 Mybatis-Plus,应尽量使用插件自带的分页插件(可参考笔记 Mybatis-plus 第 6 章 Mybatis-plus 分页查询)

SpringDataJpa - 使用自带分页插件

  1. 在 Repository 层接口继承 PagingAndSortingRepository 接口即可(也可以就继承 JpaRepository 接口(推荐),因为该接口已经继承了 PagingAndSortingRepository 接口),该持久层将返回一个 Page 对象
public interface UserRepository extends PagingAndSortingRepository<User, Integer> { }
  1. 在 Service 层定义一个方法调用 Repository 层的分页接口方法,注意传递的参数


public class UserServiceImpl implements UserService {@
    Resource
    private UserRepository userRepository;

    public Page < User > list(Pageable pageable) {
        Page < User > page = userRepository.findAll(pageable);
        return page;
    }
}
  1. 在 Controller 层传入分页参数

("/user")
public class UserController {
    
    private UserService userService;

    (value = "/page")
    public Page < User > pageList(Integer pageNum, Integer pageSize) {
        // 注意: 该插件第一页的 pageNumber 为 0, 例如前端传值pageNum=1,这里要减去1
        Pageable pageable = PageRequest.of(pageNum - 1, pageSize);
        // 排序, 根据 id
        //Sort sort = new Sort(Direction.DESC, "id");
        //PageRequest pageable = PageRequest.of(pageNum - 1, pageSize, sort);
        //或者 PageRequest pageable = PageRequest.of(pageNumber, pageSize, Sort.Direction.DESC, "id");
        Page < User > page = userService2.list(pageable);
        System.out.println("总共多少条数据: " + page.getTotalElements());
        System.out.println("总共多少页: " + page.getTotalPages());
        System.out.println("第几页: " + page.getNumber());
        System.out.println("每页多少条: " + page.getSize());
        System.out.println("当前分页的记录个数: " + page.getNumberOfElements());
        System.out.println("当前页的记录: " + page.getContent());
        return page;
    }
}
  1. 最终结果
    SpringBoot分页实现_第1张图片
    如果需要带条件的进行分页查询的话,只需要在 Repository 层实现对应的查询方法即可,关键点在于构造一个 Pageable 对象给 Repository 的方法,要注意的是,Pageable 参数要在方法的第一个位置;例如:
public interface UserRepository extends JpaRepository<User, Integer> {
    ("from User u where u.name like CONTACT('%', :name, '%') order by u.id DESC")
    Page<User> getUserListByLikeName(Pageable pageable, ("name") String name);
}

如果要使用本地 SQL 也可以,详细写法如下

(value="select * from store where store_status=:status", 
       countQuery="select count(*) from store where store_status=:status",
       nativeQuery=true)
public Page<Store> getStoreByPageAndCondition(Pageable pageable, ("status")String status);

像这种常用的分页功能,可以封装一个工具类:

public class IPage {
    // 每页显示 10 条记录
    private final static Integer pageSize = 10;

    // 初始化 Pageable 对象
    public static Pageable of(Integer pageNum) {
        // 注意该插件页码是从 0 开始的,所以前端传递的第1页
        // 这里是实际上对应的页码应该是 0
        return PageRequest.of(pageNum - 1, pageSize);
    }

    // 初始化 Pageable 对象, 自定义每页显示条数
    public static Pageable of(Integer pageNum, Integer pageSize) {
        // 注意该插件页码是从 0 开始的,所以前端传递的第1页
        // 这里是实际上对应的页码应该是 0
        return PageRequest.of(pageNum - 1, pageSize);
    }

    // 初始化 Pageable 对象, 并设置排序规则
    public static Pageable of(Integer pageNum, String sort, String order) {
        Sort.Direction direct = order.equalsIgnoreCase("ASC") ? Sort.Direction.ASC : Sort.Direction.DESC;
        return PageRequest.of(pageNum - 1, pageSize, direct, sort);
    }

    // 初始化 Pageable 对象, 并设置排序规则
    public static Pageable of(Integer pageNum, Integer pageSize, String sort, String order) {
        Sort.Direction direct = order.equalsIgnoreCase("ASC") ? Sort.Direction.ASC : Sort.Direction.DESC;
        return PageRequest.of(pageNum - 1, pageSize, direct, sort);
    }
}

你可能感兴趣的:(#,springBoot,spring,boot,mybatis,java)