今天突然想研究公司的架构代码,发现了分页插件和以前使用的不一样,采用的是PageHelper的PageHelper.startPage 静态方法调用。
由于以前没有接触过这个分页插件,我一直再想分页插件是如何实现第一个查询sql分页,而后面的不分页,通过查看官方文档在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页
才了解到。
仔细阅读了官方文档,发现这个分页插件对比以前我接触的各种插件来说,使用简单、代码逻辑量少、配置简单,因为项目采用了spring boot,前端访问的API都在一个包管理,所以我们对接口的名称也定义了一套规范,直接使用AOP拦截需要分页的接口,代码量可以说大大减少,对开发来说方便了很多。
贴上接口名称代码
// 参数为伪代码
public RespEntity findXXXPage(@RequestBody Object object) {
}
贴上AOP代码
@Around("execution(* com.vteam.sme.api.controller..find*Page(..))")
public Object pageHandler(ProceedingJoinPoint joinPoint) throws Throwable {
Object[] args = joinPoint.getArgs();
// 伪代码
Object params = args[0];
Assert.notNull(params.getPageNum(), "页码不能为空。");
Assert.notNull(params.getPageSize(), "每页大小不能为空。");
// 开启分页
Page<Object> page = PageHelper.startPage(params.getPageNum(), params.getPageSize());
// 处理业务逻辑
Object object = joinPoint.proceed(args);
// 设置总记录数
BeanWrapper beanWrapper = new BeanWrapperImpl(object);
beanWrapper.setPropertyValue("count", page.getTotal());
return object;
}