pagehelper 分页工具类的封装

7 篇文章 0 订阅
5 篇文章 0 订阅
本文介绍了如何通过SpringAOP和自定义注解,实现对Mybatis PageHelper分页插件的封装,以避免每次手动配置分页参数。首先引入相关依赖,然后创建分页注解和切面类,定义切入点和增强逻辑。接着在Mapper接口上使用注解,通过PageFilter参数获取和设置分页信息。最终在Service和Controller层调用,实现简洁的分页查询。
摘要由CSDN通过智能技术生成

现状:

在使用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) 并将相应的参数传入即可;

### 回答1: PageHelper是一款开源的Java分页插件,它能够帮助我们方便地进行分页操作。使用PageHelper插件,我们只需要在查询数据的方法中加入分页参数即可实现分页功能,无需手动编写SQL语句进行分页。 在使用PageHelper插件时,我们需要在项目中引入PageHelper的依赖包,并在MyBatis的配置文件中配置插件。配置完成后,在查询数据时,我们只需要在查询方法中添加分页参数即可,PageHelper会自动进行分页,并将分页后的结果集返回给我们。例如: ``` //指定分页参数 PageHelper.startPage(pageNum, pageSize); //调用查询方法 List<User> userList = userDao.getUserList(); //获取分页信息 PageInfo<User> pageInfo = new PageInfo<>(userList); ``` 其中,`pageNum`表示当前页码,`pageSize`表示每页显示的记录数。PageHelper会自动根据这两个参数进行分页,并将分页后的结果集返回给我们。我们也可以通过PageInfo对象获取分页信息,如总记录数、总页数等。 使用PageHelper插件可以使我们的分页操作更加方便、简洁,提高开发效率。 ### 回答2: PageHelper是一个基于MyBatis分页插件,它帮助开发者快速、方便地实现分页功能。通过PageHelper,我们可以快速完成对于大数据量查询结果的分页操作,提高了查询效率和用户体验。 PageHelper的使用非常简便。首先,我们需要在项目的pom.xml文件中添加PageHelper的依赖。然后,在MyBatis的配置文件中,配置PageHelper的插件。这样,我们就可以在数据库查询时,使用PageHelper提供的工具类进行分页了。 具体的使用方式如下: 1. 在查询方法前,调用PageHelper的startPage方法,设置要查询的页码和每页显示的数量。例如:PageHelper.startPage(1, 10),表示查询第一页,每页显示10条记录。 2. 执行查询操作,PageHelper会在查询结束后自动将结果封装成一个Page对象,该对象包含了查询的结果列表、总记录数等信息。 3. 可以通过Page对象的getTotal()方法获取查询结果的总记录数,可以通过getPageNum()和getPageSize()方法获取当前页码和每页显示数量。 4. 可以通过Page对象的getList()方法获取查询结果的列表。 PageHelper还提供了很多其他的功能,如支持分页插件的属性设置、参数绑定、物理分页、翻页方式选择等。可以根据实际需求进行配置和使用。 总结来说,PageHelper是一个非常好用的分页插件,通过它可以实现快速、方便的分页功能。它提供了丰富的功能和灵活的配置选项,可以满足不同场景下的分页需求。通过合理使用PageHelper,我们可以提高查询效率,优化用户体验。 ### 回答3: PageHelper是一款用于实现数据库分页的开源插件,该插件支持多种数据库,包括MySQL、Oracle、SQL Server等。 使用PageHelper进行分页可以有效地减小内存开销,提高查询效率。通过简单的配置和调用,就可以实现数据的分页查询。 首先,我们需要在项目中引入PageHelper的依赖包。然后在MyBatis的配置文件中配置PageHelper的插件。 在需要进行分页查询的地方,我们只需要在查询前调用PageHelper的startPage方法即可。startPage方法接收两个参数,分别是当前页码和每页的记录数。例如,startPage(1, 10)表示查询第一页,每页10条记录。 接下来,我们进行数据库查询操作,此时查询的结果就会被自动拦截并进行分页处理。 在查询结果中,我们可以通过PageInfo对象获取到分页的详细信息,包括总记录数、总页数、当前页码等。 同时,PageHelper还支持一些其他的功能,例如设置排序规则、获取当前页的前后页码等。 需要注意的是,使用PageHelper进行分页查询时,要确保查询方法的返回类型是Page<E>类型,其中E表示查询结果的实体类。 总之,PageHelper是一个简单易用、高效可靠的分页工具,它可以帮助我们快速地实现数据库的分页查询功能。在实际开发中,只需要简单地配置和调用,就可以轻松地实现分页功能,提高系统的性能和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值