pagehelper分页工具类的封装

本文实例为大家分享了pagehelper分页工具类的封装代码,供大家参考,具体内容如下

现状:

在使用Mybatis进行数据库分页查询时,我们经常使用的是插件:pagehelper 此插件可以帮助我们很方便的进行数据库分页操作,但是使用此插件每次都需要先开启插件,然后再手动的对参数进行封装,这些都是模板化的套路,有没有一种更简洁的方法,让我们不在关注具体的分页细节,只需要实现我们的业务逻辑呢?所以接下来我将使用Spring AOP技术,对该工具类进行封装,让我们可以更方便的进行分页操作;

依赖:

首先在项目中加入pagehelper 分页插件和AOP的依赖:

<!-- pagehelper 分页插件 -->
<dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper-spring-boot-starter</artifactId>
      <version>1.2.5</version>
        </dependency>
        <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper-spring-boot-autoconfigure</artifactId>
      <version>1.2.3</version>
  </dependency>
        
        <!--AOP依赖-->
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

在配置文件中,配置分页插件:

# PageHelper分页插件

#  使用的数据库,如果是mysql,这里替换成mysql
pagehelper.helperDialect= oracle

# 当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页
pagehelper.reasonable= true

# 支持通过 Mapper 接口参数来传递分页参数
pagehelper.supportMethodsArguments= true

定义一个注解类 @Page:

定义此注解类的作用是,标识哪些是分页的方法,我们将对标注@Page的方法进行分页增强

package com.rems.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @program: rems
 * @description: 分页注解
 * @author: hu.chen
 * @createDate: 2021年05月08日 10:34
 **/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Page {
}

接下来定义切面类,并在里面编写增强逻辑:

package com.rems.aop;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.rems.pojo.PageFilter;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.util.ObjectUtils;

/**
 * @program: rems
 * @description: 分页逻辑织入
 * @author: hu.chen
 * @createDate: 2021年05月08日 10:36
 **/
//声明当前类是配置类
@Configuration
//标注当前类是Aop切面类
@Aspect
@Slf4j
//开启Aop增强
@EnableAspectJAutoProxy
public class PageAop {

    /**
     * 定义切入点
     */
    @Pointcut("@annotation(com.rems.annotation.Page)")
    public void annotation() {
    }

    /**
     * 环绕增强
     */
    @Around("annotation()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
         // 当前页码
      String pageNum="1";
          //每页记录数
       String pageSize="10";
        PageFilter pageFilter=null;
        //获取被增强方法的参数
        Object[] args = proceedingJoinPoint.getArgs();
        for (Object arg : args) {
            if(arg instanceof PageFilter) {
               pageFilter=(PageFilter) arg;
                pageNum=ObjectUtils.isEmpty(pageFilter.getPageNum())? pageNum:pageFilter.getPageNum();
                pageSize=ObjectUtils.isEmpty(pageFilter.getPageSize())? pageSize:pageFilter.getPageSize();
            }
        }
        Object result = null;
        try {
            //调用分页插件传入开始页码和页面容量
            Page<Object> page = PageHelper.startPage(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
            //执行被增强的方法,不写,则被增强方法不执行
            result = proceedingJoinPoint.proceed(args);
            //获取并封装分页后的参数
            pageFilter.setPageNum(String.valueOf(page.getPageNum()));
            pageFilter.setPages(page.getPages());
            pageFilter.setPageSize(String.valueOf(page.getPageSize()));
            pageFilter.setTotal(page.getTotal());

        } catch (Exception e) {
            log.info("查询数据库异常",e);
        }
        return result;
    }
}

定义分页参数类,并让所有封装了查询参数的类继承本类

注意这里面的 getPageFilter 方法

package com.rems.pojo;

import lombok.Data;

import java.util.List;

/**
 * @program: rems
 * @description: 分页类
 * @author: hu.chen
 * @createDate: 2021年04月23日 18:26
 **/
@Data
public class PageFilter<T> {

    /**
     * 总条数
     */
    private long total;

    /**
     * 当前页码
     */
    private String pageNum;

    /**
     * 每页记录数
     */
    private String pageSize;

    /**
     * 总页数
     */
    private Integer pages;

    private List<T> data;

    /**
     * @param obj 继承了PageFilter类的子类
     * @param response 从数据库查询出来的参数
     * @return
     */
    public PageFilter getPageFilter(PageFilter obj,List<T> response) {
        PageFilter<T> pages = new PageFilter();
        pages.setPageNum(String.valueOf(obj.getPageNum()));
        pages.setPages(obj.getPages());
        pages.setPageSize(String.valueOf(obj.getPageSize()));
        pages.setTotal(obj.getTotal());
        pages.setData(response);
        return pages;
    }
}

上面的配置都做好后,接下来就可以进行测试:

看一下mapper接口:

在此接口上标注@Page注解,说明当前方法需要分页增强
要注意这个入参:GetDemandDo,这个类继承了上面定义的PageFilter分页类

  /**
     * @Description: 根据动态条件查询需求表
     * @Param: [demand]
     * @return: com.rems.pojo.Demand
     * @Author: chenhu
     * @Date: 2021/4/23
     */
    @Page
    List<Demand> getDemandByDynamiCondition(GetDemandDo demand);

接下来看一下service业务逻辑层:

/**
* @Description: 查询根据条件动态查询需求列表并分页
* @Param:
* @return:
* @Author: chenhu
*/
    @Override
    public PageFilter<DemandVo> getDemandByDynamiCondition(GetDemandDo demand) {
    
        //分页查询需求
        List<DemandVo> demands = demandMapper.getDemandByDynamiCondition(demand).stream()
                .map(item -> {
                    DemandVo demandVo = new DemandVo();
                    BeanUtils.copyProperties(item, demandVo);
                    return demandVo;
                }).collect(Collectors.toList());
                
        //这个方法调用的是继承自父类:PageFilter的方法,将封装了查询参数的对象放入,
                    //再将数据库查询并处理好的返回对象放入即可
        return demand.getPageFilter(demand, demands);
    }

在controller层调用:

/**
     * 根据条件动态查询需求
     *
     * @param demand
     * @return
     */
    @GetMapping("/getDemand")
    public AjaxData getDemand(GetDemandDo demand) {
    
        return AjaxData.success(demandService.getDemandByDynamiCondition(demand));
        
    }

Postman测试:

到这里就封装测试成功,之后使用只需要在需要分页查询的mapper接口上标注@Page注解,并让传递参数的对象继承PageFilter分页类,然后传递参数的对象调用继承过来的方法:getPageFilter(PageFilter obj,List response) 并将相应的参数传入即可;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Mybatis第三方PageHelper分页插件的使用与原理

    目录 ​用法 ​原理 PageHelper.startPage做了什么 Page分页信息在哪使用 拦截器 插件 拦截器链 加载&调用拦截器 @Intercepts注解 通过PageHelper创建代理对象 拦截器的调用源头-动态代理 分页逻辑 ​总结 ​用法 ​ 此时commentAnalyses为Page对象(PageHelper插件包内定义的) ​ 而Page对象继承自JDK中的ArrayList,扩展并封装了一些page相关的字段,如页码,每页大小,总记录数,总页数等. ​原理 我们就加了

  • SpringBoot整合PageHelper实现分页查询功能详解

    前言 本文介绍的是MyBatis 分页插件 PageHelper,如果你也在用 MyBatis,建议尝试该分页插件,这一定是最方便使用的分页插件.分页插件支持任何复杂的单表.多表分页. 官方文档:https://pagehelper.github.io/ 项目地址:https://github.com/pagehelper/Mybatis-PageHelper 使用方法 导入依赖 在中央仓库sonatype中搜索 pageHelper,找到 pagehelper-spring-boot-star

  • SpringBoot+Mybatis分页插件PageHelper实现分页效果

    目录 一.项目结构 二.插件引入 三.代码 四.测试: 最近刚入职新公司,项目是从零开始搭建的项目.我觉得是时候考验是驴还是千里马的时候.都是泪就不多说了. 附上一篇Mybatis常用的分页案例.这次要做的是最常见的分页效果,也是基础功能.但是很多人都做不好的.这次采用Mybatis分页插件PageHelper.   仅献给伸手党的大爷们.大爷们好!拿代码记得扣666!!小的在这给感谢了!! 一.项目结构 按照controller,service,mapper(也叫dao)来建立项目,utils

  • Mybatis分页查询的实现(Rowbounds和PageHelper)

    我们实现查询除了 @org.junit.Test public void test02(){ SqlSession session = MybatisUtil.getSession(); UserDao mapper = session.getMapper(UserDao.class); List<User> allUser = mapper.getAllUser(); session.close(); for (User user : allUser) { System.out.printl

  • ssm框架+PageHelper插件实现分页查询功能

    通过搭建ssm框架,然后通过mybatis的分页插件pagehelp进行分页查询. 源码:https://gitee.com/smfx1314/pagehelper 看一下项目结构: 首先创建一个maven工程,pom中引入相关jar包 <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId&

  • Springboot 整合通用mapper和pagehelper展示分页数据的问题(附github源码)

    简介 springboot 设计目的就是为了加速开发,减少xml的配置.如果你不想写配置文件只需要在配置文件添加相对应的配置就能快速的启动的程序. 通用mapp 通用mapper只支持对单表的操作,对单表的增删改查,无需在mapper.xml写对应的sql语句,只需要我们调用相应的接口即可. pagehelp pagehelper主要是在对查询的数据进行一个分页查询. 首先在maven项目,在pom.xml中引入mapper和pagehelper的依赖 <!-- pagehelp --> &l

  • springboot +mybatis 使用PageHelper实现分页并带条件模糊查询功能

    完整案例: SpringBoot + laypage分页 + 模糊查询 完整案例 下面在通过实例代码介绍下springboot +mybatis 使用PageHelper实现分页并带条件模糊查询功能,内容如下所示: 调用接口Controller类 @ApiOperation("查询列表") @PostMapping("/selectList") public Result selectList(@RequestBody User_InfoListRequest us

  • Mybatis利用分页插件PageHelper快速实现分页查询

    目录 前言 首先创建一个Maven项目 数据库中创建一张表 设置Mybatis配置文件 编写pojo实体类和mapper接口和mapper映射文件 创建测试类 总结 前言 Mybatis算是对数据库操作的利器了.但是在处理分页的时候,Mybatis并没有什么特别的方法,一般需要自己去写limit子句实现,成本较高.好在有国内开发者写了一个PageHelper插件,可以帮助我们快速实现分页查询. 官网地址 首先创建一个Maven项目 导入相关依赖: <!-- 依赖列表--> <depend

  • MyBatis如何使用PageHelper实现分页查询

    目录 使用PageHelper实现分页查询 1.创建数据表 2.创建项目 2.1 创建实体类(Entity层) 2.2 数据库映射层(Mapper层) 3.运行测试 MyBatis PageHelper的使用 1.引入pagehelper的jar包 2.在mybatis的配置文件中配置拦截(也可以在spring配置文件中配置) 3.代码中如何实现 4.注意事项 分页不安全的情况 使用PageHelper实现分页查询 [实例]MyBatis使用PageHelper实现分页查询,并显示分页信息.执行

  • 使用PageHelper插件实现Service层分页

    本文实例为大家分享了使用PageHelper插件实现Service层分页的具体代码,供大家参考,具体内容如下 使用场景: 平时分页我们可以直接使用mybatis-plus中内置的IPage进行分页,一般是在mapper中写好接口,在执行sql时就将其进行分页操作,但是有些复杂的查询或者是需要拼接返回格式的数据就难以操作了,所以我们使用PageHelper插件来实现Service分页功能. 1.在pom.xml文件中导入PageHelper插件依赖 <!--pagehelper分页插件--> &

随机推荐