• 分页功能实现


    大家好 , 我是苏麟 , 今天聊一聊分页功能 .

    Page分页构造器是mybatisplus包中的一个分页类 .

    Page分页

    引入依赖

    1. com.baomidou
    2. mybatis-plus-boot-starter
    3. 3.4.1
    4. com.alibaba
    5. druid
    6. 1.1.16

    配置

    1. /**
    2.  * 配置MP的分页插件
    3.  */
    4. @Configuration
    5. public class MybatisPlusConfig {
    6.  
    7.     @Bean
    8.     public MybatisPlusInterceptor mybatisPlusInterceptor(){
    9.         MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
    10.         mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
    11.         return mybatisPlusInterceptor;
    12.     }
    13. }

    分页查询的实现

    1.   /**
    2.      * 分页查询
    3.      * @param page
    4.      * @param pageSize
    5.      * @param name
    6.      * @return
    7.      */
    8.     @GetMapping("/page")
    9.     public R page(@RequestParam(required = false, defaultValue = "1") int page,
    10.                         @RequestParam(required = false, defaultValue = "10") int pageSize,
    11.                         String name){
    12.         log.info("page = {},pageSize = {},name = {}" ,page,pageSize,name);
    13.  
    14.         //构造分页构造器
    15.         Page pageInfo = new Page(page,pageSize);
    16.  
    17.         //构造条件构造器
    18.         LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper();
    19.         //添加过滤条件
    20.         queryWrapper.like(StringUtils.isNotEmpty(name),Employee::getName,name);
    21.         //添加排序条件
    22.         queryWrapper.orderByDesc(Employee::getUpdateTime);
    23.  
    24.         //执行查询
    25.         employeeService.page(pageInfo,queryWrapper);
    26.  
    27.         return R.success(pageInfo);
    28.     }

    无条件查询

    1. @GetMapping("/page")
    2. public R page(int page,int pageSize,String name){
    3. //构造分页构造器对象
    4. Page pageInfo = new Page<>(page,pageSize);
    5. //执行分页查询
    6. dishService.page(pageInfo, null);
    7. return R.success(page);
    8. }

    PageHelper

    PageHelper官网 : MyBatis 分页插件 PageHelper

     开始使用

    引入依赖

    1. com.github.pagehelper
    2. pagehelper-spring-boot-starter
    3. 1.4.6

     在spring boot 配置

    Spring Boot 引入 starter 后自动生效,对分页插件进行配置时,在 Spring Boot 对应的配置文件中配置:

    properties : 

    1. pagehelper.propertyName=propertyValue
    2. pagehelper.reasonable=false
    3. pagehelper.defaultCount=true

    yml :

    1. pagehelper:
    2. propertyName: propertyValue
    3. reasonable: false
    4. defaultCount: true # 分页插件默认参数支持 default-count 形式,自定义扩展的参数,必须大小写一致

    准备一些数据

    测试

    1. @Test
    2. void mybatisTest() {
    3. PageHelper.startPage(1,2);
    4. Page list = (Page) userMapper.list();
    5. System.out.println(list);
    6. }

    测试结果 

    分页插件还支持的几种方法(官方给出的方式)

    1. //第一种,RowBounds方式的调用
    2. List list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));
    3. //第二种,Mapper接口方式的调用,推荐这种使用方式。
    4. PageHelper.startPage(1, 10);
    5. List list = userMapper.selectIf(1);
    6. //第三种,Mapper接口方式的调用,推荐这种使用方式。
    7. PageHelper.offsetPage(1, 10);
    8. List list = userMapper.selectIf(1);
    9. //第四种,参数方法调用
    10. //存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
    11. public interface CountryMapper {
    12. List selectByPageNumSize(
    13. @Param("user") User user,
    14. @Param("pageNum") int pageNum,
    15. @Param("pageSize") int pageSize);
    16. }
    17. //配置supportMethodsArguments=true
    18. //在代码中直接调用:
    19. List list = userMapper.selectByPageNumSize(user, 1, 10);
    20. //第五种,参数对象
    21. //如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
    22. //有如下 User 对象
    23. public class User {
    24. //其他fields
    25. //下面两个参数名和 params 配置的名字一致
    26. private Integer pageNum;
    27. private Integer pageSize;
    28. }
    29. //存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
    30. public interface CountryMapper {
    31. List selectByPageNumSize(User user);
    32. }
    33. //当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
    34. List list = userMapper.selectByPageNumSize(user);
    35. //第六种,ISelect 接口方式
    36. //jdk6,7用法,创建接口
    37. Page page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
    38. @Override
    39. public void doSelect() {
    40. userMapper.selectGroupBy();
    41. }
    42. });
    43. //jdk8 lambda用法
    44. Page page = PageHelper.startPage(1, 10).doSelectPage(()-> userMapper.selectGroupBy());
    45. //也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
    46. pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
    47. @Override
    48. public void doSelect() {
    49. userMapper.selectGroupBy();
    50. }
    51. });
    52. //对应的lambda用法
    53. pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> userMapper.selectGroupBy());
    54. //count查询,返回一个查询语句的count数
    55. long total = PageHelper.count(new ISelect() {
    56. @Override
    57. public void doSelect() {
    58. userMapper.selectLike(user);
    59. }
    60. });
    61. //lambda
    62. total=PageHelper.count(()->userMapper.selectLike(user));

    更详细的请看官方文档 .


    例子 :

    前提条件 

    1. @Data
    2. public class EmployeePageQueryDTO implements Serializable {
    3. //员工姓名
    4. private String name;
    5. //页码
    6. private int page;
    7. //每页显示记录数
    8. private int pageSize;
    9. }
    1. /**
    2. * 封装分页查询结果
    3. */
    4. @Data
    5. @AllArgsConstructor
    6. @NoArgsConstructor
    7. public class PageResult implements Serializable {
    8. private long total; //总记录数
    9. private List records; //当前页数据集合
    10. }

    代码 :

    1. /**
    2. * 员工分页查询
    3. * @param employeePageQueryDTO
    4. * @return
    5. */
    6. @GetMapping("/page")
    7. @ApiOperation(value = "员工分页查询功能")
    8. public Result page(EmployeePageQueryDTO employeePageQueryDTO) {
    9. log.info("员工分页参数 : {}", employeePageQueryDTO);
    10. PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO);
    11. return Result.success(pageResult);
    12. }
    1. /**
    2. * 员工分页查询
    3. *
    4. * @param employeePageQueryDTO
    5. * @return
    6. */
    7. @Override
    8. public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {
    9. //开始分页查询
    10. PageHelper.startPage(employeePageQueryDTO.getPage(), employeePageQueryDTO.getPageSize());
    11. Page page = employeeMapper.pageQuery(employeePageQueryDTO);
    12. long total = page.getTotal();
    13. List result = page.getResult();
    14. return new PageResult(total,result);
    15. }

    PageHelper 自动添加 limit 所以直接用就好了 .

    这期就到这里 , 下期见 !

    拜拜 !

  • 相关阅读:
    java计算机课程在线培训学习管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    Leetcode6247-从链表中移除节点
    Seata 源码篇之AT模式启动流程 - 上 - 02
    解决方案:可以ping别人,但是别人不能ping我
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java客户需求管理系统2v0d6
    Spring BeanPostProcessor 接口&
    【Mac OS】在Window与Mac之间快捷传输文件
    【YOLOv5/v7改进系列】改进池化层为YOLOv9的SPPELAN
    【设计模式】Java设计模式 - 装饰者模式
    gdb常用调试命令 + 多进程调试命令
  • 原文地址:https://blog.csdn.net/sytdsqzr/article/details/132609620