最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot使用注解進(jìn)行分頁的實(shí)現(xiàn)示例

 更新時(shí)間:2022年03月28日 15:42:08   作者:JavaGaga  
分頁使用可以說非常普遍了,有時(shí)候會(huì)需要非常靈活的方式去開啟或關(guān)閉分頁,嘗試使用一下注解的方式來進(jìn)行分頁,本文主要介紹了SpringBoot使用注解進(jìn)行分頁的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

分頁使用可以說非常普遍了,有時(shí)候會(huì)需要非常靈活的方式去開啟或關(guān)閉分頁,嘗試使用一下注解的方式來進(jì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í)體類,一種是不分頁直接返回?cái)?shù)據(jù)的,另一種是分頁返回?cái)?shù)據(jù)和總數(shù)據(jù)條數(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 = "用戶權(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);
    }

}

分頁實(shí)體類 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)建一個(gè)用于分頁的注解Pagination

其實(shí)這里的pageNo和pageSize沒什么需求的話可以去掉的

/**
 * 分頁注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Pagination {

    // 第幾頁的請(qǐng)求參數(shù)名稱 通過獲取參數(shù)名稱獲取真正的pageNo
    String pageNo() default "pageNo";
    // 分頁大小的請(qǐng)求參數(shù)名稱
    String pageSize() default "pageSize";

}

使用AOP進(jìn)行分頁

創(chuàng)建一個(gè)類用于處理分頁注解,切入點(diǎn)要根據(jù)自己注解進(jìn)行修改

@Aspect
@Component
@Slf4j
public class PaginationAspect {

    /**
     * 定義切入點(diǎn)
     */
    @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);
    }

    /**
     * 對(duì)分頁結(jié)果進(jìn)行包裝 如果分頁成功則會(huì)返回PageResult
     *
     * @param result
     */
    private Object pageResult(Object result) {
        /**
         * 如果分頁成功,則查詢返回的結(jié)應(yīng)該是一個(gè)Page {@link com.github.pagehelper.Page}
         * 進(jìn)行一次強(qiáng)制轉(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注解就行了,不需要就注釋掉,代碼完全不需要修改

分頁的時(shí)候傳入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);
    }

}

測(cè)試

使用的Postman測(cè)試查看效果

使用注解的時(shí)候

把注解注釋掉

到此這篇關(guān)于SpringBoot使用注解進(jìn)行分頁的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot使用注解分頁內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot中配置文件pom.xml的使用詳解

    SpringBoot中配置文件pom.xml的使用詳解

    SpringBoot的pom.xml文件是Maven項(xiàng)目的核心配置文件,用于定義項(xiàng)目的依賴、插件、構(gòu)建配置等信息,下面小編就來和大家詳細(xì)介紹一下它的具體使用吧
    2025-03-03
  • Maven指令打包SpringBoot項(xiàng)目提示沒有主清單文件問題

    Maven指令打包SpringBoot項(xiàng)目提示沒有主清單文件問題

    在Java開發(fā)中,打包Jar時(shí)常會(huì)遇到“沒有主清單屬性”的錯(cuò)誤,這通常是因?yàn)樵趐om.xml文件中沒有正確配置maven插件導(dǎo)致的,特別是在使用自定義的<parent/>節(jié)點(diǎn)而非spring-boot-starter-parent時(shí)
    2024-09-09
  • RocketMQ重試機(jī)制及消息冪代碼實(shí)例解析

    RocketMQ重試機(jī)制及消息冪代碼實(shí)例解析

    這篇文章主要介紹了RocketMQ重試機(jī)制及消息冪代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 使用@ConditionalOnProperty控制是否加載的操作

    使用@ConditionalOnProperty控制是否加載的操作

    這篇文章主要介紹了使用@ConditionalOnProperty控制是否加載的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot深入理解之內(nèi)置web容器及配置的總結(jié)

    SpringBoot深入理解之內(nèi)置web容器及配置的總結(jié)

    今天小編就為大家分享一篇關(guān)于SpringBoot深入理解之內(nèi)置web容器及配置的總結(jié),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • GateWay路由規(guī)則與動(dòng)態(tài)路由詳細(xì)介紹

    GateWay路由規(guī)則與動(dòng)態(tài)路由詳細(xì)介紹

    這篇文章主要介紹了GateWay路由規(guī)則與GateWay動(dòng)態(tài)路由,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Java常見面試題之final在java中的作用是什么

    Java常見面試題之final在java中的作用是什么

    這篇文章主要介紹了Java常見面試題之final在java中的作用是什么,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • kafka啟動(dòng)報(bào)錯(cuò)(Cluster ID)不匹配問題以及解決

    kafka啟動(dòng)報(bào)錯(cuò)(Cluster ID)不匹配問題以及解決

    這篇文章主要介紹了kafka啟動(dòng)報(bào)錯(cuò)(Cluster ID)不匹配問題以及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java選擇排序法以及實(shí)例詳解

    Java選擇排序法以及實(shí)例詳解

    在本篇文章里小編給大家整理了一篇關(guān)于Java選擇排序法以及實(shí)例內(nèi)容,并做了詳細(xì)分析,有興趣的朋友們可以跟著學(xué)習(xí)下。
    2022-11-11
  • springboot 使用poi進(jìn)行數(shù)據(jù)的導(dǎo)出過程詳解

    springboot 使用poi進(jìn)行數(shù)據(jù)的導(dǎo)出過程詳解

    這篇文章主要介紹了springboot 使用poi進(jìn)行數(shù)據(jù)的導(dǎo)出過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論

邛崃市| 海城市| 九江县| 昭平县| 上虞市| 青海省| 安龙县| 阿坝| 卓尼县| 延津县| 勃利县| 行唐县| 龙游县| 乃东县| 买车| 马鞍山市| 南漳县| 临漳县| 互助| 成都市| 临漳县| 临城县| 浦东新区| 连平县| 清新县| 南陵县| 武义县| 成安县| 永顺县| 平阳县| 和静县| 沙坪坝区| 宝应县| 巴塘县| 枝江市| 东乌珠穆沁旗| 绥阳县| 丹巴县| 武城县| 手机| 阳西县|