Skip to content

PageHelper分页升级版-兼容MybatisPlus

官网:https://pagehelper.github.io/

1、改造统一返回值兼容 MybatisPlus

java
package com.xx.page.annotation;

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

/**
 * @Author: xueqimiao
 * @Date: 2023/11/8 15:54
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NeedPage {

    /**
     * pageNo:页码
     * pageSize:每页显示条数
     * countFlag:是否进行count查询
     */

}
java
package com.xx.page.interceptor;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xx.page.context.PageData;
import com.xx.result.Result;
import com.xx.utils.PageDataUtil;
import com.xx.utils.ServletUtil;
import com.xx.utils.ValidationUtil;
import jakarta.servlet.http.HttpServletRequest;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @Author: xueqimiao
 * @Date: 2023/11/8 15:58
 */
@Component
@Aspect
public class PageDataInterceptor {

    public Logger log = LoggerFactory.getLogger(PageDataInterceptor.class);

    // 切入点
    @Pointcut("@annotation(com.xx.page.annotation.NeedPage)")
    public void controllerAspect() {
    }

    @Around("controllerAspect()")
    public Result controllerAround(ProceedingJoinPoint proJoinPoint) throws Throwable {
        log.info("==========> 开始执行PageHelper");
        // 1、获取请求参数
        HttpServletRequest request = ServletUtil.getHttpRequest();
        int currentPage = getIntParameter(request, PageDataUtil.PAGE_CURRENT_PAGE_NO_STR, 1);
        int pageSize = getIntParameter(request, PageDataUtil.PAGE_SIZE_STR, 10);
        Page<Object> page = PageHelper.startPage(currentPage, pageSize);
        return handlePage(proJoinPoint, page);
    }

    private Result handlePage(ProceedingJoinPoint proJoinPoint, Page<Object> page) throws Throwable {
        Object retVal = proJoinPoint.proceed();
        if (retVal == null || !(retVal instanceof Result)
                || !((Result) retVal).isSuccess()) {
            return Result.ok(retVal);
        }
        Result returnResult = (Result) retVal;
        if (!(returnResult.getResult() instanceof List)) {
            return returnResult;
        }
        PageData pageData = new PageData();
        Object result = returnResult.getResult();
        pageData.setRecords(result);
        PageInfo pageInfo = new PageInfo<>(page);
        pageData.setSize(pageInfo.getPageSize());
        pageData.setTotal(pageInfo.getTotal());
        pageData.setPages(pageInfo.getPages());
        pageData.setCurrent(pageInfo.getPageNum());
        returnResult.setResult(pageData);
        return returnResult;
    }

    private static int getIntParameter(HttpServletRequest request, String paramName, Integer defaultVal) {
        String paramValue = request.getParameter(paramName);
        if (ValidationUtil.isEmpty(paramValue)) {
            return defaultVal;
        }
        return Integer.parseInt(paramValue);
    }
}

2、PageHelper查询总记录数

java
/**
 * 开始分页
 *
 * @param pageNum  页码
 * @param pageSize 每页显示数量
 * @param count    是否进行count查询
 */
public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count) {
    return startPage(pageNum, pageSize, count, null, null);
}

修改我们的注解

java
package com.xx.utils;

/**
 * @Author: xueqimiao
 * @Date: 2023/11/8 16:06
 */
public class PageDataUtil {

    public static final String PAGE_CURRENT_PAGE_NO_STR = "pageNo";

    public static final String PAGE_SIZE_STR = "pageSize";

    public static final String COUNT_FLAG = "countFlag";
}
java
package com.xx.page.interceptor;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xx.page.context.PageData;
import com.xx.result.Result;
import com.xx.utils.PageDataUtil;
import com.xx.utils.ServletUtil;
import com.xx.utils.ValidationUtil;
import jakarta.servlet.http.HttpServletRequest;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @Author: xueqimiao
 * @Date: 2023/11/8 15:58
 */
@Component
@Aspect
public class PageDataInterceptor {

    public Logger log = LoggerFactory.getLogger(PageDataInterceptor.class);

    // 切入点
    @Pointcut("@annotation(com.xx.page.annotation.NeedPage)")
    public void controllerAspect() {
    }

    @Around("controllerAspect()")
    public Result controllerAround(ProceedingJoinPoint proJoinPoint) throws Throwable {
        log.info("==========> 开始执行PageHelper");
        // 1、获取请求参数
        HttpServletRequest request = ServletUtil.getHttpRequest();
        int currentPage = getIntParameter(request, PageDataUtil.PAGE_CURRENT_PAGE_NO_STR, 1);
        int pageSize = getIntParameter(request, PageDataUtil.PAGE_SIZE_STR, 10);
        // 是否进行count查询
        int count = getIntParameter(request, PageDataUtil.COUNT_FLAG, 1);
        Page<Object> page = PageHelper.startPage(currentPage, pageSize, count == 1);
        return handlePage(proJoinPoint, page);
    }

    private Result handlePage(ProceedingJoinPoint proJoinPoint, Page<Object> page) throws Throwable {
        Object retVal = proJoinPoint.proceed();
        if (retVal == null || !(retVal instanceof Result)
                || !((Result) retVal).isSuccess()) {
            return Result.ok(retVal);
        }
        Result returnResult = (Result) retVal;
        if (!(returnResult.getResult() instanceof List)) {
            return returnResult;
        }
        PageData pageData = new PageData();
        Object result = returnResult.getResult();
        pageData.setRecords(result);
        PageInfo pageInfo = new PageInfo<>(page);
        pageData.setSize(pageInfo.getPageSize());
        pageData.setTotal(pageInfo.getTotal());
        pageData.setPages(pageInfo.getPages());
        pageData.setCurrent(pageInfo.getPageNum());
        returnResult.setResult(pageData);
        return returnResult;
    }

    private static int getIntParameter(HttpServletRequest request, String paramName, Integer defaultVal) {
        String paramValue = request.getParameter(paramName);
        if (ValidationUtil.isEmpty(paramValue)) {
            return defaultVal;
        }
        return Integer.parseInt(paramValue);
    }

}

写在最后

让我们带着这份对技术的热爱与执着,继续前行吧。在探索的道路上,我们或许会疲惫,或许会迷失方向,但只要心中的信念之火不熄,我们定能穿越风雨,迎接那属于自己的技术之光。