pagehelper分頁工具類的封裝
本文實(shí)例為大家分享了pagehelper分頁工具類的封裝代碼,供大家參考,具體內(nèi)容如下
現(xiàn)狀:
在使用Mybatis進(jìn)行數(shù)據(jù)庫分頁查詢時(shí),我們經(jīng)常使用的是插件:pagehelper 此插件可以幫助我們很方便的進(jìn)行數(shù)據(jù)庫分頁操作,但是使用此插件每次都需要先開啟插件,然后再手動(dòng)的對(duì)參數(shù)進(jìn)行封裝,這些都是模板化的套路,有沒有一種更簡(jiǎn)潔的方法,讓我們不在關(guān)注具體的分頁細(xì)節(jié),只需要實(shí)現(xiàn)我們的業(yè)務(wù)邏輯呢?所以接下來我將使用Spring AOP技術(shù),對(duì)該工具類進(jìn)行封裝,讓我們可以更方便的進(jìn)行分頁操作;
依賴:
首先在項(xiàng)目中加入pagehelper 分頁插件和AOP的依賴:
<!-- pagehelper 分頁插件 --> <dependency> ? ? ? <groupId>com.github.pagehelper</groupId> ? ? ? <artifactId>pagehelper-spring-boot-starter</artifactId> ? ? <version>1.2.5</version> ? ? ? ? </dependency> ? ? ? ? <dependency> ? ? ? <groupId>com.github.pagehelper</groupId> ? ? ? <artifactId>pagehelper-spring-boot-autoconfigure</artifactId> ? ? ? <version>1.2.3</version> ? </dependency> ? ? ? ?? ? ? ? ? <!--AOP依賴--> ? ?<dependency> ? ? ? <groupId>org.springframework.boot</groupId> ? ? ? <artifactId>spring-boot-starter-aop</artifactId> </dependency>
在配置文件中,配置分頁插件:
# PageHelper分頁插件 # ?使用的數(shù)據(jù)庫,如果是mysql,這里替換成mysql pagehelper.helperDialect= oracle # 當(dāng)該參數(shù)設(shè)置為 true 時(shí),pageNum<=0 時(shí)會(huì)查詢第一頁, pageNum>pages(超過總數(shù)時(shí)),會(huì)查詢最后一頁 pagehelper.reasonable= true # 支持通過 Mapper 接口參數(shù)來傳遞分頁參數(shù) pagehelper.supportMethodsArguments= true
定義一個(gè)注解類 @Page:
定義此注解類的作用是,標(biāo)識(shí)哪些是分頁的方法,我們將對(duì)標(biāo)注@Page的方法進(jìn)行分頁增強(qiáng)
package com.rems.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** ?* @program: rems ?* @description: 分頁注解 ?* @author: hu.chen ?* @createDate: 2021年05月08日 10:34 ?**/ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface Page { }
接下來定義切面類,并在里面編寫增強(qiáng)邏輯:
package com.rems.aop; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.rems.pojo.PageFilter; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.util.ObjectUtils; /** ?* @program: rems ?* @description: 分頁邏輯織入 ?* @author: hu.chen ?* @createDate: 2021年05月08日 10:36 ?**/ //聲明當(dāng)前類是配置類 @Configuration //標(biāo)注當(dāng)前類是Aop切面類 @Aspect @Slf4j //開啟Aop增強(qiáng) @EnableAspectJAutoProxy public class PageAop { ? ? /** ? ? ?* 定義切入點(diǎn) ? ? ?*/ ? ? @Pointcut("@annotation(com.rems.annotation.Page)") ? ? public void annotation() { ? ? } ? ? /** ? ? ?* 環(huán)繞增強(qiáng) ? ? ?*/ ? ? @Around("annotation()") ? ? public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { ? ? ? ? ?// 當(dāng)前頁碼 ? ? ? String pageNum="1"; ? ? ? ? ? //每頁記錄數(shù) ? ? ? ?String pageSize="10"; ? ? ? ? PageFilter pageFilter=null; ? ? ? ? //獲取被增強(qiáng)方法的參數(shù) ? ? ? ? Object[] args = proceedingJoinPoint.getArgs(); ? ? ? ? for (Object arg : args) { ? ? ? ? ? ? if(arg instanceof PageFilter) { ? ? ? ? ? ? ? ?pageFilter=(PageFilter) arg; ? ? ? ? ? ? ? ? pageNum=ObjectUtils.isEmpty(pageFilter.getPageNum())? pageNum:pageFilter.getPageNum(); ? ? ? ? ? ? ? ? pageSize=ObjectUtils.isEmpty(pageFilter.getPageSize())? pageSize:pageFilter.getPageSize(); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? Object result = null; ? ? ? ? try { ? ? ? ? ? ? //調(diào)用分頁插件傳入開始頁碼和頁面容量 ? ? ? ? ? ? Page<Object> page = PageHelper.startPage(Integer.parseInt(pageNum), Integer.parseInt(pageSize)); ? ? ? ? ? ? //執(zhí)行被增強(qiáng)的方法,不寫,則被增強(qiáng)方法不執(zhí)行 ? ? ? ? ? ? result = proceedingJoinPoint.proceed(args); ? ? ? ? ? ? //獲取并封裝分頁后的參數(shù) ? ? ? ? ? ? pageFilter.setPageNum(String.valueOf(page.getPageNum())); ? ? ? ? ? ? pageFilter.setPages(page.getPages()); ? ? ? ? ? ? pageFilter.setPageSize(String.valueOf(page.getPageSize())); ? ? ? ? ? ? pageFilter.setTotal(page.getTotal()); ? ? ? ? } catch (Exception e) { ? ? ? ? ? ? log.info("查詢數(shù)據(jù)庫異常",e); ? ? ? ? } ? ? ? ? return result; ? ? } }
定義分頁參數(shù)類,并讓所有封裝了查詢參數(shù)的類繼承本類
注意這里面的 getPageFilter 方法
package com.rems.pojo; import lombok.Data; import java.util.List; /** ?* @program: rems ?* @description: 分頁類 ?* @author: hu.chen ?* @createDate: 2021年04月23日 18:26 ?**/ @Data public class PageFilter<T> { ? ? /** ? ? ?* 總條數(shù) ? ? ?*/ ? ? private long total; ? ? /** ? ? ?* 當(dāng)前頁碼 ? ? ?*/ ? ? private String pageNum; ? ? /** ? ? ?* 每頁記錄數(shù) ? ? ?*/ ? ? private String pageSize; ? ? /** ? ? ?* 總頁數(shù) ? ? ?*/ ? ? private Integer pages; ? ? private List<T> data; ? ? /** ? ? ?* @param obj 繼承了PageFilter類的子類 ? ? ?* @param response 從數(shù)據(jù)庫查詢出來的參數(shù) ? ? ?* @return ? ? ?*/ ? ? public PageFilter getPageFilter(PageFilter obj,List<T> response) { ? ? ? ? PageFilter<T> pages = new PageFilter(); ? ? ? ? pages.setPageNum(String.valueOf(obj.getPageNum())); ? ? ? ? pages.setPages(obj.getPages()); ? ? ? ? pages.setPageSize(String.valueOf(obj.getPageSize())); ? ? ? ? pages.setTotal(obj.getTotal()); ? ? ? ? pages.setData(response); ? ? ? ? return pages; ? ? } }
上面的配置都做好后,接下來就可以進(jìn)行測(cè)試:
看一下mapper接口:
在此接口上標(biāo)注@Page注解,說明當(dāng)前方法需要分頁增強(qiáng)
要注意這個(gè)入?yún)ⅲ篏etDemandDo,這個(gè)類繼承了上面定義的PageFilter分頁類
? /** ? ? ?* @Description: 根據(jù)動(dòng)態(tài)條件查詢需求表 ? ? ?* @Param: [demand] ? ? ?* @return: com.rems.pojo.Demand ? ? ?* @Author: chenhu ? ? ?* @Date: 2021/4/23 ? ? ?*/ ? ? @Page ? ? List<Demand> getDemandByDynamiCondition(GetDemandDo demand);
接下來看一下service業(yè)務(wù)邏輯層:
/** * @Description: 查詢根據(jù)條件動(dòng)態(tài)查詢需求列表并分頁 * @Param: * @return: * @Author: chenhu */ ? ? @Override ? ? public PageFilter<DemandVo> getDemandByDynamiCondition(GetDemandDo demand) { ? ?? ? ? ? ? //分頁查詢需求 ? ? ? ? List<DemandVo> demands = demandMapper.getDemandByDynamiCondition(demand).stream() ? ? ? ? ? ? ? ? .map(item -> { ? ? ? ? ? ? ? ? ? ? DemandVo demandVo = new DemandVo(); ? ? ? ? ? ? ? ? ? ? BeanUtils.copyProperties(item, demandVo); ? ? ? ? ? ? ? ? ? ? return demandVo; ? ? ? ? ? ? ? ? }).collect(Collectors.toList()); ? ? ? ? ? ? ? ?? ? ? ? ? //這個(gè)方法調(diào)用的是繼承自父類:PageFilter的方法,將封裝了查詢參數(shù)的對(duì)象放入, ? ? ? ? ? ? ? ? ? ? //再將數(shù)據(jù)庫查詢并處理好的返回對(duì)象放入即可 ? ? ? ? return demand.getPageFilter(demand, demands); ? ? }
在controller層調(diào)用:
/** ? ? ?* 根據(jù)條件動(dòng)態(tài)查詢需求 ? ? ?* ? ? ?* @param demand ? ? ?* @return ? ? ?*/ ? ? @GetMapping("/getDemand") ? ? public AjaxData getDemand(GetDemandDo demand) { ? ?? ? ? ? ? return AjaxData.success(demandService.getDemandByDynamiCondition(demand)); ? ? ? ?? ? ? }
Postman測(cè)試:
到這里就封裝測(cè)試成功,之后使用只需要在需要分頁查詢的mapper接口上標(biāo)注@Page注解,并讓傳遞參數(shù)的對(duì)象繼承PageFilter分頁類,然后傳遞參數(shù)的對(duì)象調(diào)用繼承過來的方法:getPageFilter(PageFilter obj,List response) 并將相應(yīng)的參數(shù)傳入即可;
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 使用PageHelper插件實(shí)現(xiàn)Service層分頁
- SpringBoot整合PageHelper實(shí)現(xiàn)分頁查詢功能詳解
- springboot?+mybatis?使用PageHelper實(shí)現(xiàn)分頁并帶條件模糊查詢功能
- Mybatis第三方PageHelper分頁插件的使用與原理
- Mybatis分頁查詢的實(shí)現(xiàn)(Rowbounds和PageHelper)
- MyBatis如何使用PageHelper實(shí)現(xiàn)分頁查詢
- SpringBoot+Mybatis分頁插件PageHelper實(shí)現(xiàn)分頁效果
- Springboot 整合通用mapper和pagehelper展示分頁數(shù)據(jù)的問題(附github源碼)
- Mybatis利用分頁插件PageHelper快速實(shí)現(xiàn)分頁查詢
- ssm框架+PageHelper插件實(shí)現(xiàn)分頁查詢功能
相關(guān)文章
MyBatis-Plus通過version機(jī)制實(shí)現(xiàn)樂觀鎖的思路
version機(jī)制的核心思想就是,假設(shè)發(fā)生并發(fā)沖突的幾率很低,只有當(dāng)更新數(shù)據(jù)的時(shí)候采取檢查是否有沖突,而判斷是否有沖突的依據(jù)就是version的值是否被改變了,這篇文章主要介紹了MyBatis-Plus通過version機(jī)制實(shí)現(xiàn)樂觀鎖的思路,需要的朋友可以參考下2021-09-09spring?mybatis環(huán)境常量與枚舉轉(zhuǎn)換示例詳解
這篇文章主要為大家介紹了spring?mybatis環(huán)境常量與枚舉轉(zhuǎn)換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06源碼解析Spring 數(shù)據(jù)庫異常抽理知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享了關(guān)于源碼解析Spring 數(shù)據(jù)庫異常抽理知識(shí)點(diǎn)內(nèi)容,對(duì)此有需要的朋友們學(xué)習(xí)參考下。2019-05-05Java 多態(tài)中繼承的轉(zhuǎn)型詳解與用法分析
繼承是java面向?qū)ο缶幊碳夹g(shù)的一塊基石,因?yàn)樗试S創(chuàng)建分等級(jí)層次的類。繼承就是子類繼承父類的特征和行為,使得子類對(duì)象(實(shí)例)具有父類的實(shí)例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為2021-10-10Java開發(fā)者就業(yè)需要掌握的9大專業(yè)技能
這篇文章主要為大家詳細(xì)介紹了java就業(yè)前需要掌握的專業(yè)技能,感興趣的小伙伴們可以參考一下2016-09-09Java利用httpclient通過get、post方式調(diào)用https接口的方法
這篇文章主要介紹了Java利用httpclient通過get、post方式調(diào)用https接口的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02