简介
分页功能是一个简单但必需的功能,在 SpringBoot 中分页实现非常的简单,有多种实现方式;主要和项目集成的持久层框架有关;这里主要介绍集成 MyBatis 和 SpringDataJpa 的分页实现
Mybatis - 使用 PageHelper 分页
- 首先在 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>
- 在项目配置类中添加如下实现
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;
}
}
public
- 在 CatMapper.class 中添加一个新的方法(查询所有的记录)
("select * from cat order by id ASC")
public List<cat> listAll();
- 在 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 - 使用自带分页插件
- 在 Repository 层接口继承 PagingAndSortingRepository 接口即可(也可以就继承 JpaRepository 接口(推荐),因为该接口已经继承了 PagingAndSortingRepository 接口),该持久层将返回一个 Page 对象
public interface UserRepository extends PagingAndSortingRepository<User, Integer> { }
- 在 Service 层定义一个方法调用 Repository 层的分页接口方法,注意传递的参数
class UserServiceImpl implements UserService {@
Resource
private UserRepository userRepository;
public Page < User > list(Pageable pageable) {
Page < User > page = userRepository.findAll(pageable);
return page;
}
}
public
- 在 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;
}
}
- 最终结果
如果需要带条件的进行分页查询的话,只需要在 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);
}
}