本文实例为大家分享了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) 并将相应的参数传入即可;

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

pagehelper分页工具类的封装的更多相关文章

  1. ios – UIScrollView的平滑自定义分页

    我在UIScrollView中有两个(可能更多)视图,并希望使用分页.当我尝试使用UIScrollView的默认分页选项时出现问题,因为视图具有不同的宽度,无法正确分页.所以我已经实现了一个有效的自定义分页代码.但是,当滚动较慢时,它不会按预期运行.(它回到没有动画的原始位置.)以下是我目前通过uiscrollviewdelegate进行自定义分页的方法我想要的是:是)我有的:解决方法尝试下面的自

  2. ios – 使用子视图控制器分页滚动视图

    使用分页实现水平滚动视图的最佳做法是什么,每页有一个视图控制器?由于iOS5具有用于视图控制器容器/包含的API,因此PageControl示例仍然是实现此功能的最佳方式吗?

  3. 可可触摸 – 启用预览和分页的UICollectionView

    在AppStore中显示搜索结果时,我正在尝试模仿苹果公司的功能.(参考:http://searchengineland.com/apple-app-search-shows-only-one-result-at-a-time-133818)它显示像卡中的详细应用程序信息,并且它被分页.当中间的一个活动卡片和滚动视图的分页行为仍然完整时,我被困在如何使上一张和第二张卡片显示.我已经尝试使用UICo

  4. ios – 启用了内容插入的UIScrollView分页工作很奇怪

    我创建了具有内容插入的UIScrollView.第一次,scrollView.contentOffset.x为-160.0但是奇怪的问题是当我点击scrollView(黄色区域)时,内容偏移x值将重置为0并显示为这样.我尝试过几次,但是点击滚动视图会将内容偏移量重置为0.我该如何防止这种情况?解决方法UIScrollView分页通过滚动与scrollView宽度相同的页面(在您的情况下为480个宽

  5. UIKit框架-高级控件Swift版本: 10.UIWebView方法/属性详解

    前面我们已经讲解完了UINavigationController的一些常用属性以及方法,现在让我们来看看一个关于网络的UIWebView.1.UIWebView的常用属性常用类型2.UIWebView的代理方法3.代码示范首先我们要使用storyBoard布局界面关联控件遵守代理协议自定义UIWebVIew实现代理方法在ViewDidLoad方法中实现PS:UIWebView继承与UIView,并

  6. swift+storyboard+UIImageview入门

    更新记录:该Storyboard教程由CarolineBegbie更新iOS8和Swift相关内容。Storyboard是最先在iOS5引入的一项振奋人心的特性,大幅缩减构建App用户界面所需的时间。要介绍Storyboard是什么,我打算从这张图讲起。这就是使用Storyboard的力量。Storyboard通过新的原型表项和静态表项特性,让处理表视图的工作更加轻松。Storyboard使自动布局更易用。接下来我们看一下Storyboard,点击项目浏览器中的Main.storyboard就可以在Int

  7. 使用RxSwift进行分页API调用

    如何实现这一点的任何建议将非常感谢…

  8. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. Angular2 PrimeNG分页模块学习

    这篇文章主要为大家详细介绍了Angular2 PrimeNG分页模块学习教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. PHP分页显示制作详细讲解

    搞定了最重要的如何获取数据的问题以后,剩下的就仅仅是传递参数,构造合适的sql语句然后使用php从数据库内获取数据并显示了。

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部