springboot实现分页显示,spring boot分页

  springboot实现分页显示,spring boot分页

  

目录

依赖安装添加公共返回实体类普通实体类AjaxResult分页实体类页面结果注解处理分页注解页码使用面向切面编程进行分页使用注解编写控制器类测试分页使用可以说非常普遍了,有时候会需要非常灵活的方式去开启或关闭分页,尝试使用一下注解的方式来进行分页。

 

  

依赖安装

需要使用的依赖:

 

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

  !-我的batis Plus-dependency groupIdcom.baomidou/groupId artifactId我的batis-Plus-boot-starter/artifactId版本3.4.3.4/version/dependency!-分页-依赖groupIdcom.github.pagehelper/groupId artifactId page helper-spring-boot-starter/artifactId版本1 . 4 . 0/版本/依赖关系!-AOP-依赖groupIdorg.springframework.boot/groupId artifact id spring-boot-starter-AOP/artifact id版本2 . 5 . 5/版本/依赖性

  

添加公共返回实体类

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

 

  

普通实体类 AjaxResult

@ Data @ NoArgsConstructor @ AllArgsConstructorpublic class Ajax resultt { public static final int CODE _ SUCCESS=200;公共静态final int CODE _ authorized=401公共静态最终int CODE _ FORBIDDEN=403公共静态最终整数代码错误=500公共静态最终字符串MSG_SUCCESS=操作成功;公共静态最终字符串MSG_FAILED=操作失败;公共静态最终字符串MSG_NOT_PERMISSION=用户权限不足;公共静态最终字符串MSG_UNAUTHORIZED=用户未登录或身份已过期;私有(同Internationalorganizations)国际组织代码;私有字符串味精私人测试数据;public static T Ajax result SUCCESS(int code,T data){ return new Ajax result(code,MSG_SUCCESS,data);}公共静态T Ajax结果成功(T数据){返回成功(CODE _ SUCCESS,data);}公共静态Ajax结果SUCCESS(){返回成功(CODE _ SUCCESS,null);}公共静态AjaxResult错误(int code,String msg){返回新的Ajax结果(code,msg,null);}公共静态Ajax结果错误(String msg){返回错误(CODE _ ERROR,msg);}公共静态AjaxResult错误(){ r

 

  eturn new AjaxResult(CODE_ERROR, MSG_FAILED, null); }}

 

  

分页实体类 PageResult

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

 

  

@Datapublic 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@Slf4jpublic 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使用注解分页内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: