Skip to content

Spring Boot PageHelper 使用

PageHelper 是一个基于 MyBatis 的分页插件,可以非常简单的实现分页功能。

添加依赖

xml
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>2.1.0</version>
</dependency>

最新版本链接

简单使用

java
try (Page<?> ignored = PageHelper.startPage(param.getPage(), param.getPageSize(), true)) {
    List<Item> list = itemMapper.select(param.getParam());
    PageInfo<Item> pageInfo = new PageInfo<>(list);
    pageInfo.getPageNum(); // 当前页码
    pageInfo.getPageSize(); // 每页条数
    pageInfo.getPages(); // 总页数
    pageInfo.getList(); // 当前页数据
}

这里使用try-with-resources语法,在PageHelper.startPage方法中,返回的Page对象是Closeable接口的实现类,所以需要自动关闭。也可以不加,但是在报错时需要手动关闭。

Aop加自定义注解

  • 自定义注解
java
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PageSearch {
}

这里不需要什么别的参数就只定义一个作用域在方法上的注解。

  • Aop
java
package com.demo.aop;

import com.github.pagehelper.PageHelper;
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.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class PageAspect {

    @Pointcut("@annotation(com.demo.aop.PageSearch)")
    public void searchPointcut() {
    }

    @Around("searchPointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        // 获取参数类型
        Class<?>[] parameterTypes = ((MethodSignature) joinPoint.getSignature()).getParameterTypes();
        PageParam<?> param = null;
        // 根据参数类型获取分页参数 这里的PageParam是自定义的分页查询参数类
        for (int i = 0; i < parameterTypes.length; i++) {
            if (PageParam.class.isAssignableFrom(parameterTypes[i])) {
                param = (PageParam<?>) args[i];
            }
        }
        // 没有分页参数,直接执行
        if (param == null) {
            return joinPoint.proceed(args);
        }
        // 开启分页
        try (Page<?> ignored = PageHelper.startPage(param.getPage(), param.getPageSize(), true)) {
            return joinPoint.proceed(args);
        }
    }

}
java
public class PageParam<T> {
    /**
     * 页码
     */
    private Integer page;
    /**
     * 每页个数
     */
    private Integer pageSize;
    /**
     * 查询参数
     */
    private T param;

    // getter setter
}
  • 使用注解
java
@Service
public class ItemServiceImpl implements ItemService {

    @Autowired
    private ItemMapper itemMapper;

    @PageSearch
    @Override
    public Page<Item> search(PageParam<ItemSearchParam> param) {
        List<Item> list itemMapper.select(param.getParam());
        return PageUtil.toPage(list);
    }
}
java
public class PageUtil {
    public static <T> Page<T> toPage(List<T> list) {
        Page<T> page = new Page<>();
        PageInfo<T> pageInfo = new PageInfo<>(list);
        page.setPage(pageInfo.getPageNum());
        page.setPageSize(pageInfo.getPageSize());
        page.setPageCount(pageInfo.getPages());
        page.setList(pageInfo.getList());
        return page;
    }
}