SpringBoot使用注解进行分页的实现示例

目录
  • 依赖安装
  • 添加公共返回实体类
  • 普通实体类 AjaxResult
  • 分页实体类 PageResult
  • 注解处理
  • 分页注解 Pagination
  • 使用AOP进行分页
  • 使用注解
  • 编写Controller类
  • 测试

分页使用可以说非常普遍了,有时候会需要非常灵活的方式去开启或关闭分页,尝试使用一下注解的方式来进行分页。

依赖安装

需要使用的依赖:

  • Mybatis-Plus
  • PageHelper
  • SpringBoot AOP

添加pom依赖

<!-- Mybatis-Plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3.4</version>
</dependency>
<!-- 分页 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.0</version>
</dependency>
<!-- AOP -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    <version>2.5.5</version>
</dependency>

添加公共返回实体类

需要两种实体类,一种是不分页直接返回数据的,另一种是分页返回数据和总数据条数的

普通实体类 AjaxResult

@Data
@NoArgsConstructor
@AllArgsConstructor
public class AjaxResult<T> {

    public static final int CODE_SUCCESS = 200;
    public static final int CODE_UNAUTHORIZED = 401;
    public static final int CODE_FORBIDDEN = 403;
    public static final int CODE_ERROR = 500;

    public static final String MSG_SUCCESS = "操作成功";
    public static final String MSG_FAILED = "操作失败";
    public static final String MSG_NOT_PERMISSION = "用户权限不足";
    public static final String MSG_UNAUTHORIZED = "用户未登录或身份已过期";

    private int code;
    private String msg;
    private T data;

    public static <T> AjaxResult success(int code, T data) {
        return new AjaxResult(code, MSG_SUCCESS, data);
    }

    public static <T> AjaxResult success(T data) {
        return success(CODE_SUCCESS, data);
    }

    public static AjaxResult success() {
        return success(CODE_SUCCESS, null);
    }

    public static AjaxResult error(int code, String msg) {
        return new AjaxResult(code, msg, null);
    }

    public static AjaxResult error(String msg) {
        return error(CODE_ERROR, msg);
    }

    public static AjaxResult error() {
        return new AjaxResult(CODE_ERROR, MSG_FAILED, null);
    }

}

分页实体类 PageResult

继承AjaxResult,额外添加total、pageNo和pageSize等字段

@Data
public class PageResult extends AjaxResult {

    private long total;
    private long pageNo;
    private long pageSize;

    public PageResult() {
        this.setCode(CODE_SUCCESS);
        this.setMsg(MSG_SUCCESS);
    }

    public PageResult(AjaxResult ajaxResult) {
        this();
        if (Objects.nonNull(ajaxResult)) {
            setCode(ajaxResult.getCode());
            setMsg(ajaxResult.getMsg());
        }
    }
}

注解处理

分页注解 Pagination

创建一个用于分页的注解Pagination

其实这里的pageNo和pageSize没什么需求的话可以去掉的

/**
 * 分页注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Pagination {

    // 第几页的请求参数名称 通过获取参数名称获取真正的pageNo
    String pageNo() default "pageNo";
    // 分页大小的请求参数名称
    String pageSize() default "pageSize";

}

使用AOP进行分页

创建一个类用于处理分页注解,切入点要根据自己注解进行修改

@Aspect
@Component
@Slf4j
public class PaginationAspect {

    /**
     * 定义切入点
     */
    @Pointcut("@annotation(cn.montaro.social.aspect.annotation.Pagination)")
    public void access() {

    }

    @SneakyThrows
    @Around("access()")
    public Object around(ProceedingJoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        Pagination pagination = getPaginationAnnotation(joinPoint);
        startPage(pagination.pageNo(), pagination.pageSize());
        // 调用原本方法的内容并获取返回值
        Object result = joinPoint.proceed(args);
        // 返回的数据类型要保证和注解方法上的一致
        return pageResult(result);
    }

    /**
     * 获取Pagination注解
     *
     * @param joinPoint
     * @return
     */
    public Pagination getPaginationAnnotation(ProceedingJoinPoint joinPoint) {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        Method method = methodSignature.getMethod();
        Pagination pagination = method.getAnnotation(Pagination.class);
        return pagination;
    }

    /**
     * 开始分页
     */
    private void startPage(String pageNoParameterName, String pageSizeParameterName) {
        // 获取pageNo和pageSize
        int pageNo = ServletUtils.getParameterToInt(pageNoParameterName, 1);
        int pageSize = ServletUtils.getParameterToInt(pageSizeParameterName, 10);
        PageHelper.startPage(pageNo, pageSize);
    }

    /**
     * 对分页结果进行包装 如果分页成功则会返回PageResult
     *
     * @param result
     */
    private Object pageResult(Object result) {
        /**
         * 如果分页成功,则查询返回的结应该是一个Page {@link com.github.pagehelper.Page}
         * 进行一次强制转换就能获取到 total、pageNo、pageSize 这些字段
         */
        PageInfo pageInfo = null;
        AjaxResult ajaxResult = null;
        // 列表数据 如果方法返回Page则直接使用 如果是AjaxResult则getData再封装
        Object list = null;
        if (result instanceof Page) {
            list = result;
            Page page = (Page) result;
            pageInfo = new PageInfo(page);
        } else if (result instanceof AjaxResult) {
            ajaxResult = (AjaxResult) result;
            Object data = ajaxResult.getData();
            if (data instanceof List) {
                list = data;
                pageInfo = new PageInfo((List) data);
            }
        }
        if (pageInfo != null) {
            PageResult pageResult = new PageResult(ajaxResult);
            pageResult.setData(list);
            pageResult.setPageNo(pageInfo.getPageNum());
            pageResult.setPageSize(pageInfo.getPageSize());
            pageResult.setTotal(pageInfo.getTotal());

            return pageResult;
        }
        return result;
    }
}

还有注解中使用到的ServletUtils

public class ServletUtils {

    public static HttpServletRequest getRequest() {
        ServletRequestAttributes requestAttributes = getRequestAttributes();
        return requestAttributes.getRequest();
    }

    public static ServletRequestAttributes getRequestAttributes() {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        return (ServletRequestAttributes) requestAttributes;
    }

    public static Integer getParameterToInt(String parameterName, Integer defaultValue) {
        HttpServletRequest request = getRequest();
        String strValue = request.getParameter(parameterName);
        Integer intValue = Convert.toInt(strValue, defaultValue);
        return intValue;
    }

    public static Integer getParameterToInt(String parameterName) {
        return getParameterToInt(parameterName, null);
    }

}

使用注解

为了避免跑题,此处就省略mybatis-plus的使用了。

需要分页就加上@Pagination注解就行了,不需要就注释掉,代码完全不需要修改

分页的时候传入pageNo和pageSize参数就可以了,如果参数名需要更改,就修改@Pagination就可以了

编写Controller类

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    /**
     * 列出所有用户
     * @return
     */
    @Pagination
    @GetMapping("/list")
    public AjaxResult list(UserQueryReq query) {
        List<User> userList = userService.selectUserListByQuery(query);
        return AjaxResult.success(userList);
    }

}

测试

使用的Postman测试查看效果

使用注解的时候

把注解注释掉

到此这篇关于SpringBoot使用注解进行分页的实现示例的文章就介绍到这了,更多相关SpringBoot使用注解分页内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot使用Mybatis注解实现分页动态sql开发教程

    目录 一.环境配置 二.Mybatis注解 三.方法参数读取 1.普通参数读取 2.对象参数读取 四.分页插件的使用 五.动态标签 六.完整示例 一.环境配置 1.引入mybatis依赖 compile( //SpringMVC 'org.springframework.boot:spring-boot-starter-web', "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.3", //Mybatis依赖及分页

  • SpringBoot使用注解进行分页的实现示例

    目录 依赖安装 添加公共返回实体类 普通实体类 AjaxResult 分页实体类 PageResult 注解处理 分页注解 Pagination 使用AOP进行分页 使用注解 编写Controller类 测试 分页使用可以说非常普遍了,有时候会需要非常灵活的方式去开启或关闭分页,尝试使用一下注解的方式来进行分页. 依赖安装 需要使用的依赖: Mybatis-Plus PageHelper SpringBoot AOP 添加pom依赖 <!-- Mybatis-Plus --> <depe

  • springboot @ComponentScan注解原理解析

    这篇文章主要介绍了springboot @ComponentScan注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 @ComponentScan 告诉Spring从哪里找到bean. 如果你的其他包都在@SpringBootApplication注解的启动类所在的包及其下级包,则你什么都不用做,SpringBoot会自动帮你把其他包都扫描了. 如果你有一些bean所在的包,不在启动类的包及其下级包,那么你需要手动加上@Compone

  • spring常用注解开发一个RESTful接口示例

    目录 一.开发REST接口 1.第一步:定义资源(对象) 2.第二步:HTTP方法与Controller(动作) 二.统一规范接口响应的数据格式 一.开发REST接口 在本专栏之前的章节中已经给大家介绍了 Spring常用注解及http数据转换教程 Spring Boot提高开发效率必备工具lombok使用 Spring Boot开发RESTful接口与http协议状态表述 本节内容就是将之前学到的内容以代码的方式体现出来. 1. 第一步:定义资源(对象) @Data @Builder publ

  • springboot整合mybatis-plus实现多表分页查询的示例代码

    1.新建一个springboot工程 2.需要导入mybatis和mybatis-plus的依赖文件 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.1</version> </dependency> <dependency> &l

  • SpringBoot使用自定义注解实现权限拦截的示例

    本文介绍了SpringBoot使用自定义注解实现权限拦截的示例,分享给大家,具体如下: HandlerInterceptor(处理器拦截器) 常见使用场景 日志记录: 记录请求信息的日志, 以便进行信息监控, 信息统计, 计算PV(page View)等 性能监控: 权限检查: 通用行为: 使用自定义注解实现权限拦截 首先HandlerInterceptor了解 在HandlerInterceptor中有三个方法: public interface HandlerInterceptor { //

  • SpringBoot通过自定义注解实现日志打印的示例代码

    前言 在我们日常的开发过程中通过打印详细的日志信息能够帮助我们很好地去发现开发过程中可能出现的Bug,特别是在开发Controller层的接口时,我们一般会打印出Request请求参数和Response响应结果,但是如果这些打印日志的代码相对而言还是比较重复的,那么我们可以通过什么样的方式来简化日志打印的代码呢? SpringBoot 通过自定义注解实现权限检查可参考我的博客:SpringBoot 通过自定义注解实现权限检查 正文 Spring AOP Spring AOP 即面向切面,是对OO

  • SpringBoot @GroupSequenceProvider注解实现bean多属性联合校验的示例代码

    目录 参考资料 一. 前期准备 二. 需求 三. 需求 参考资料 分组序列@GroupSequenceProvider.@GroupSequence控制数据校验顺序,解决多字段联合逻辑校验问题[享学Spring MVC] Hibernate Validator提供了非标准的@GroupSequenceProvider注解.针对当前对象实例的状态,动态来决定加载那些校验组进入默认校验组.需要借助Hibernate Validation提供给我们的DefaultGroupSequenceProvid

  • springboot swagger2注解使用的教程

    swagger2 注解整体说明  最近在使用Swagger的时候忘记了注解的用法,特此记录一下. @Api:用在请求的类上,表示对类的说明 tags="说明该类的作用,可以在UI界面上看到的注解" value="该参数没什么意义,在UI界面上也看到,所以不需要配置" @ApiOperation:用在请求的方法上,说明方法的用途.作用 value="说明方法的用途.作用" notes="方法的备注说明" @ApiImplicit

  • springboot集成CAS实现单点登录的示例代码

    最近新参与的项目用到了cas单点登录,我还不会,这怎么能容忍!空了学习并搭建了一个spring-boot 集成CAS 的demo.实现了单点登录与登出. 单点登录英文全称是:Single Sign On,简称SSO. 含义:在多个相互信任的系统中,只要登录一个系统其他系统均可访问. CAS 是一种使用广泛的单点登录实现,分为客户端CAS Client和服务端 CAS Service,客户端就是我们的系统,服务端是认证中心,由CAS提供,我们需要稍作修改,启动起来就可以用.~~~~ 效果演示 ht

随机推荐