<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了pagehelper分頁工具類的封裝程式碼,供大家參考,具體內容如下
在使用Mybatis進行資料庫分頁查詢時,我們經常使用的是外掛:pagehelper 此外掛可以幫助我們很方便的進行資料庫分頁操作,但是使用此外掛每次都需要先開啟外掛,然後再手動的對引數進行封裝,這些都是模板化的套路,有沒有一種更簡潔的方法,讓我們不在關注具體的分頁細節,只需要實現我們的業務邏輯呢?所以接下來我將使用Spring AOP技術,對該工具類進行封裝,讓我們可以更方便的進行分頁操作;
首先在專案中加入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分頁外掛 # 使用的資料庫,如果是mysql,這裡替換成mysql pagehelper.helperDialect= oracle # 當該引數設定為 true 時,pageNum<=0 時會查詢第一頁, pageNum>pages(超過總數時),會查詢最後一頁 pagehelper.reasonable= true # 支援通過 Mapper 介面引數來傳遞分頁引數 pagehelper.supportMethodsArguments= true
定義一個註解類 @Page:
定義此註解類的作用是,標識哪些是分頁的方法,我們將對標註@Page的方法進行分頁增強
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 { }
接下來定義切面類,並在裡面編寫增強邏輯:
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 **/ //宣告當前類是設定類 @Configuration //標註當前類是Aop切面類 @Aspect @Slf4j //開啟Aop增強 @EnableAspectJAutoProxy public class PageAop { /** * 定義切入點 */ @Pointcut("@annotation(com.rems.annotation.Page)") public void annotation() { } /** * 環繞增強 */ @Around("annotation()") public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { // 當前頁碼 String pageNum="1"; //每頁記錄數 String pageSize="10"; PageFilter pageFilter=null; //獲取被增強方法的引數 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 { //呼叫分頁外掛傳入開始頁碼和頁面容量 Page<Object> page = PageHelper.startPage(Integer.parseInt(pageNum), Integer.parseInt(pageSize)); //執行被增強的方法,不寫,則被增強方法不執行 result = proceedingJoinPoint.proceed(args); //獲取並封裝分頁後的引數 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("查詢資料庫異常",e); } return result; } }
定義分頁引數類,並讓所有封裝了查詢引數的類繼承本類
注意這裡面的 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> { /** * 總條數 */ private long total; /** * 當前頁碼 */ private String pageNum; /** * 每頁記錄數 */ private String pageSize; /** * 總頁數 */ private Integer pages; private List<T> data; /** * @param obj 繼承了PageFilter類的子類 * @param response 從資料庫查詢出來的引數 * @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; } }
上面的設定都做好後,接下來就可以進行測試:
看一下mapper介面:
在此介面上標註@Page註解,說明當前方法需要分頁增強
要注意這個入參:GetDemandDo,這個類繼承了上面定義的PageFilter分頁類
/** * @Description: 根據動態條件查詢需求表 * @Param: [demand] * @return: com.rems.pojo.Demand * @Author: chenhu * @Date: 2021/4/23 */ @Page List<Demand> getDemandByDynamiCondition(GetDemandDo demand);
接下來看一下service業務邏輯層:
/** * @Description: 查詢根據條件動態查詢需求列表並分頁 * @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()); //這個方法呼叫的是繼承自父類別:PageFilter的方法,將封裝了查詢引數的物件放入, //再將資料庫查詢並處理好的返回物件放入即可 return demand.getPageFilter(demand, demands); }
在controller層呼叫:
/** * 根據條件動態查詢需求 * * @param demand * @return */ @GetMapping("/getDemand") public AjaxData getDemand(GetDemandDo demand) { return AjaxData.success(demandService.getDemandByDynamiCondition(demand)); }
Postman測試:
到這裡就封裝測試成功,之後使用只需要在需要分頁查詢的mapper介面上標註@Page註解,並讓傳遞引數的物件繼承PageFilter分頁類,然後傳遞引數的物件呼叫繼承過來的方法:getPageFilter(PageFilter obj,List response) 並將相應的引數傳入即可;
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45