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. 最终结果
    在这里插入图片描述
    如果需要带条件的进行分页查询的话,只需要在 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);
    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot中,可以利用Pageable插件实现分页和查询。PageableSpring Data库中定义的一个接口,它抽象了与分页相关的所有信息,包括页码、每页大小等。通过Pageable接口,我们可以获取所有与分页相关的信息。 下面是一个示例代码,展示了如何在控制层中使用Pageable插件进行分页查询: ```java // 分页 @RequestMapping("/findPage") public String findByPage(Model model, Integer pageNum) { // 当前页面为空时,赋值为一,代表当前为第一页 if (pageNum == null) { pageNum = 1; } Pageable pageable = PageRequest.of(pageNum - 1, 5); Page<List<Map>> page = serviceStudent.findPage(pageable); model.addAttribute("pageInfo", page); return "index"; } ``` 在上述代码中,首先判断当前页码是否为空,如果为空则默认为第一页。然后使用PageRequest.of方法创建一个Pageable对象,指定页码和每页大小。接下来调用serviceStudent的findPage方法,传入Pageable对象进行分页查询。最后将查询结果存入model中,返回index页面。 为了在显示页面中实现首页、上一页、下一页和尾页等功能,返回值需要使用Page<List<?>>类型。这样可以将数据交给Page类处理并进行分页。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring Boot 利用Pageable插件实现分页和查询](https://blog.csdn.net/CSDN_java1005/article/details/106235082)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值