宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

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

依赖安装

需要使用的依赖:

我的batis-pluspagehelpersingboot AOP添加砰的一声依赖

!- Mybatis-Plus –

属国

groupIdcom.baomidou/groupId

artifactIdmybatis-plus-boot-starter/artifactId

版本3 .4 .3 .4/版本

/依赖性

!-分页-

属国

groupIdcom.github.pagehelper/groupId

artifactIdpagehelper-spring-boot-starter/artifactId

版本1 .4 .0/版本

/依赖性

!- AOP –

属国

groupIdorg.springframework.boot/groupId

artifactIdspring-boot-starter-AOP/artifactId

版本2 .5 .5/版本

/dependency

添加公共返回实体类

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

普通实体类 AjaxResult

@数据

@NoArgsConstructor

@AllArgsConstructor

公共类AjaxResultT {

公共静态最终int CODE _ SUCCESS=200

公共静态最终int CODE _ UNAUTHORIZED=401

公共静态最终int CODE _ BARTING=403

公共静态最终int CODE _ ERROR=500

公共静态最终字符串MSG_SUCCESS=’操作成功;

公共静态最终字符串MSG_FAILED=’操作失败;

‘公共静态最终字符串MSG_NOT_PERMISSION=’用户权限不足;

公共静态最终字符串MSG _ UNAUTHORIZED=’用户未登录或身份已过期;

私有(同Internationalorganizations)国际组织代码;

私有字符串消息;

私人测试数据;

公共静态测试AjaxResult成功(内部代码,测试数据){ 0

返回新的AjaxResult(代码,MSG_SUCCESS,数据);

}

公共静态测试AjaxResult成功(测试数据){ 0

返回成功(代码_成功,数据);

}

公共静态AJaxResult成功(){ 0

返回成功(CODE_SUCCESS,null);

}

公共静态AjaxResult错误(int代码,字符串消息){ 0

返回新的AjaxResult(代码,msg,null);

}

公共静态AjaxResult错误(字符串消息){ 0

返回错误(代码错误,消息);

}

公共静态AjaxResult错误(){ 0

返回新的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注解就行了,不需要就注释掉,代码完全不需要修改

<p style="text-indent快三三期必中口诀 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测试查看效果

使用注解的时候

springcloud分页(springboot实现分页显示)-冯金伟博客园

把注解注释掉

springcloud分页(springboot实现分页显示)-冯金伟博客园

原文链接:https://www.cnblogs.com/montaro/p/15415509.html