SpringBoot使用注解進行分頁的實現(xiàn)示例
分頁使用可以說非常普遍了,有時候會需要非常靈活的方式去開啟或關(guā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ù)據(jù)的,另一種是分頁返回數(shù)據(jù)和總數(shù)據(jù)條數(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 = "用戶權(quán)限不足";
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)建一個類用于處理分頁注解,切入點要根據(jù)自己注解進行修改
@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());
// 調(diào)用原本方法的內(nèi)容并獲取返回值
Object result = joinPoint.proceed(args);
// 返回的數(shù)據(jù)類型要保證和注解方法上的一致
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);
}
/**
* 對分頁結(jié)果進行包裝 如果分頁成功則會返回PageResult
*
* @param result
*/
private Object pageResult(Object result) {
/**
* 如果分頁成功,則查詢返回的結(jié)應該是一個Page {@link com.github.pagehelper.Page}
* 進行一次強制轉(zhuǎn)換就能獲取到 total、pageNo、pageSize 這些字段
*/
PageInfo pageInfo = null;
AjaxResult ajaxResult = null;
// 列表數(shù)據(jù) 如果方法返回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測試查看效果
使用注解的時候

把注解注釋掉

到此這篇關(guān)于SpringBoot使用注解進行分頁的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot使用注解分頁內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Maven指令打包SpringBoot項目提示沒有主清單文件問題
在Java開發(fā)中,打包Jar時常會遇到“沒有主清單屬性”的錯誤,這通常是因為在pom.xml文件中沒有正確配置maven插件導致的,特別是在使用自定義的<parent/>節(jié)點而非spring-boot-starter-parent時2024-09-09
使用@ConditionalOnProperty控制是否加載的操作
這篇文章主要介紹了使用@ConditionalOnProperty控制是否加載的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot深入理解之內(nèi)置web容器及配置的總結(jié)
今天小編就為大家分享一篇關(guān)于SpringBoot深入理解之內(nèi)置web容器及配置的總結(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
GateWay路由規(guī)則與動態(tài)路由詳細介紹
這篇文章主要介紹了GateWay路由規(guī)則與GateWay動態(tài)路由,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
kafka啟動報錯(Cluster ID)不匹配問題以及解決
這篇文章主要介紹了kafka啟動報錯(Cluster ID)不匹配問題以及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
springboot 使用poi進行數(shù)據(jù)的導出過程詳解
這篇文章主要介紹了springboot 使用poi進行數(shù)據(jù)的導出過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09

