SpringBoot使用注解進行分頁的實現(xiàn)示例
分頁使用可以說非常普遍了,有時候會需要非常靈活的方式去開啟或關閉分頁,嘗試使用一下注解的方式來進行分頁。
依賴安裝
需要使用的依賴:
- Mybatis-Plus
- PageHelper
- SpringBoot AOP
添加pom依賴
<!-- Mybatis-Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.4</version> </dependency> <!-- 分頁 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.0</version> </dependency> <!-- AOP --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> <version>2.5.5</version> </dependency>
添加公共返回實體類
需要兩種實體類,一種是不分頁直接返回數(shù)據的,另一種是分頁返回數(shù)據和總數(shù)據條數(shù)的
普通實體類 AjaxResult
@Data @NoArgsConstructor @AllArgsConstructor public class AjaxResult<T> { public static final int CODE_SUCCESS = 200; public static final int CODE_UNAUTHORIZED = 401; public static final int CODE_FORBIDDEN = 403; public static final int CODE_ERROR = 500; public static final String MSG_SUCCESS = "操作成功"; public static final String MSG_FAILED = "操作失敗"; public static final String MSG_NOT_PERMISSION = "用戶權限不足"; public static final String MSG_UNAUTHORIZED = "用戶未登錄或身份已過期"; private int code; private String msg; private T data; public static <T> AjaxResult success(int code, T data) { return new AjaxResult(code, MSG_SUCCESS, data); } public static <T> AjaxResult success(T data) { return success(CODE_SUCCESS, data); } public static AjaxResult success() { return success(CODE_SUCCESS, null); } public static AjaxResult error(int code, String msg) { return new AjaxResult(code, msg, null); } public static AjaxResult error(String msg) { return error(CODE_ERROR, msg); } public static AjaxResult error() { return new 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
創(chuàng)建一個用于分頁的注解Pagination
其實這里的pageNo和pageSize沒什么需求的話可以去掉的
/** * 分頁注解 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Pagination { // 第幾頁的請求參數(shù)名稱 通過獲取參數(shù)名稱獲取真正的pageNo String pageNo() default "pageNo"; // 分頁大小的請求參數(shù)名稱 String pageSize() default "pageSize"; }
使用AOP進行分頁
創(chuàng)建一個類用于處理分頁注解,切入點要根據自己注解進行修改
@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); // 返回的數(shù)據類型要保證和注解方法上的一致 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; // 列表數(shù)據 如果方法返回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參數(shù)就可以了,如果參數(shù)名需要更改,就修改@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使用注解進行分頁的實現(xiàn)示例的文章就介紹到這了,更多相關SpringBoot使用注解分頁內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot大學心理服務系統(tǒng)實現(xiàn)流程分步講解
本系統(tǒng)主要論述了如何使用JAVA語言開發(fā)一個大學生心理服務系統(tǒng) ,本系統(tǒng)將嚴格按照軟件開發(fā)流程進行各個階段的工作,采用B/S架構,面向對象編程思想進行項目開發(fā)2022-09-09Java Metrics系統(tǒng)性能監(jiān)控工具的使用詳解
Metrics是一個Java庫,可以對系統(tǒng)進行監(jiān)控,統(tǒng)計一些系統(tǒng)的性能指標。本文就來和大家詳細聊聊這個工具的具體使用,希望對大家有所幫助2022-11-11mybatis plus saveOrUpdate實現(xiàn)有重復數(shù)據就更新,否則新增方式
這篇文章主要介紹了mybatis plus saveOrUpdate實現(xiàn)有重復數(shù)據就更新,否則新增方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12SpringBoot整合Mybatis之各種查詢、模糊查詢、批量刪除、動態(tài)表名操作
這篇文章主要介紹了SpringBoot整合Mybatis之各種查詢、模糊查詢、批量刪除、動態(tài)表名,本文結合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12mybatis動態(tài)插入list傳入List參數(shù)的實例代碼
本文通過實例代碼給大家介紹了mybatis動態(tài)插入list,Mybatis 傳入List參數(shù)的方法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2018-04-04