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

pagehelper分頁(yè)工具類(lèi)的封裝

 更新時(shí)間:2022年08月14日 15:33:47   作者:陳虎_63  
這篇文章主要為大家詳細(xì)介紹了pagehelper分頁(yè)工具類(lèi)的封裝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了pagehelper分頁(yè)工具類(lèi)的封裝代碼,供大家參考,具體內(nèi)容如下

現(xiàn)狀:

在使用Mybatis進(jìn)行數(shù)據(jù)庫(kù)分頁(yè)查詢時(shí),我們經(jīng)常使用的是插件:pagehelper 此插件可以幫助我們很方便的進(jìn)行數(shù)據(jù)庫(kù)分頁(yè)操作,但是使用此插件每次都需要先開(kāi)啟插件,然后再手動(dòng)的對(duì)參數(shù)進(jìn)行封裝,這些都是模板化的套路,有沒(méi)有一種更簡(jiǎn)潔的方法,讓我們不在關(guān)注具體的分頁(yè)細(xì)節(jié),只需要實(shí)現(xiàn)我們的業(yè)務(wù)邏輯呢?所以接下來(lái)我將使用Spring AOP技術(shù),對(duì)該工具類(lèi)進(jìn)行封裝,讓我們可以更方便的進(jìn)行分頁(yè)操作;

依賴(lài):

首先在項(xiàng)目中加入pagehelper 分頁(yè)插件和AOP的依賴(lài):

<!-- pagehelper 分頁(yè)插件 -->
<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依賴(lài)-->
? ?<dependency>
? ? ? <groupId>org.springframework.boot</groupId>
? ? ? <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

在配置文件中,配置分頁(yè)插件:

# PageHelper分頁(yè)插件

# ?使用的數(shù)據(jù)庫(kù),如果是mysql,這里替換成mysql
pagehelper.helperDialect= oracle

# 當(dāng)該參數(shù)設(shè)置為 true 時(shí),pageNum<=0 時(shí)會(huì)查詢第一頁(yè), pageNum>pages(超過(guò)總數(shù)時(shí)),會(huì)查詢最后一頁(yè)
pagehelper.reasonable= true

# 支持通過(guò) Mapper 接口參數(shù)來(lái)傳遞分頁(yè)參數(shù)
pagehelper.supportMethodsArguments= true

定義一個(gè)注解類(lèi) @Page:

定義此注解類(lèi)的作用是,標(biāo)識(shí)哪些是分頁(yè)的方法,我們將對(duì)標(biāo)注@Page的方法進(jìn)行分頁(yè)增強(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: 分頁(yè)注解
?* @author: hu.chen
?* @createDate: 2021年05月08日 10:34
?**/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Page {
}

接下來(lái)定義切面類(lèi),并在里面編寫(xiě)增強(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: 分頁(yè)邏輯織入
?* @author: hu.chen
?* @createDate: 2021年05月08日 10:36
?**/
//聲明當(dāng)前類(lèi)是配置類(lèi)
@Configuration
//標(biāo)注當(dāng)前類(lèi)是Aop切面類(lèi)
@Aspect
@Slf4j
//開(kāi)啟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)前頁(yè)碼
? ? ? String pageNum="1";
? ? ? ? ? //每頁(yè)記錄數(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)用分頁(yè)插件傳入開(kāi)始頁(yè)碼和頁(yè)面容量
? ? ? ? ? ? Page<Object> page = PageHelper.startPage(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
? ? ? ? ? ? //執(zhí)行被增強(qiáng)的方法,不寫(xiě),則被增強(qiáng)方法不執(zhí)行
? ? ? ? ? ? result = proceedingJoinPoint.proceed(args);
? ? ? ? ? ? //獲取并封裝分頁(yè)后的參數(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ù)庫(kù)異常",e);
? ? ? ? }
? ? ? ? return result;
? ? }
}

定義分頁(yè)參數(shù)類(lèi),并讓所有封裝了查詢參數(shù)的類(lèi)繼承本類(lèi)

注意這里面的 getPageFilter 方法

package com.rems.pojo;

import lombok.Data;

import java.util.List;


/**
?* @program: rems
?* @description: 分頁(yè)類(lèi)
?* @author: hu.chen
?* @createDate: 2021年04月23日 18:26
?**/
@Data
public class PageFilter<T> {

? ? /**
? ? ?* 總條數(shù)
? ? ?*/
? ? private long total;

? ? /**
? ? ?* 當(dāng)前頁(yè)碼
? ? ?*/
? ? private String pageNum;

? ? /**
? ? ?* 每頁(yè)記錄數(shù)
? ? ?*/
? ? private String pageSize;

? ? /**
? ? ?* 總頁(yè)數(shù)
? ? ?*/
? ? private Integer pages;

? ? private List<T> data;

? ? /**
? ? ?* @param obj 繼承了PageFilter類(lèi)的子類(lèi)
? ? ?* @param response 從數(shù)據(jù)庫(kù)查詢出來(lái)的參數(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;
? ? }
}

上面的配置都做好后,接下來(lái)就可以進(jìn)行測(cè)試:

看一下mapper接口:

在此接口上標(biāo)注@Page注解,說(shuō)明當(dāng)前方法需要分頁(yè)增強(qiáng)
要注意這個(gè)入?yún)ⅲ篏etDemandDo,這個(gè)類(lèi)繼承了上面定義的PageFilter分頁(yè)類(lèi)

? /**
? ? ?* @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);

接下來(lái)看一下service業(yè)務(wù)邏輯層:

/**
* @Description: 查詢根據(jù)條件動(dòng)態(tài)查詢需求列表并分頁(yè)
* @Param:
* @return:
* @Author: chenhu
*/
? ? @Override
? ? public PageFilter<DemandVo> getDemandByDynamiCondition(GetDemandDo demand) {
? ??
? ? ? ? //分頁(yè)查詢需求
? ? ? ? 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)用的是繼承自父類(lèi):PageFilter的方法,將封裝了查詢參數(shù)的對(duì)象放入,
? ? ? ? ? ? ? ? ? ? //再將數(shù)據(jù)庫(kù)查詢并處理好的返回對(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è)試成功,之后使用只需要在需要分頁(yè)查詢的mapper接口上標(biāo)注@Page注解,并讓傳遞參數(shù)的對(duì)象繼承PageFilter分頁(yè)類(lèi),然后傳遞參數(shù)的對(duì)象調(diào)用繼承過(guò)來(lái)的方法:getPageFilter(PageFilter obj,List response) 并將相應(yīng)的參數(shù)傳入即可;

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于easyExcel中讀取Excel表頭的實(shí)例說(shuō)明

    關(guān)于easyExcel中讀取Excel表頭的實(shí)例說(shuō)明

    EasyExcel是阿里巴巴開(kāi)源的一個(gè)excel處理框架,以使用簡(jiǎn)單、節(jié)省內(nèi)存著稱(chēng),下面這篇文章主要給大家介紹了關(guān)于easyExcel中讀取Excel表頭的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 用java生成html文件實(shí)現(xiàn)原理及代碼

    用java生成html文件實(shí)現(xiàn)原理及代碼

    用printStream來(lái)向html文件里輸出數(shù)據(jù),先創(chuàng)建一個(gè)StringBuilder對(duì)象,通過(guò)append方法來(lái)為其添加html語(yǔ)句,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下,希望對(duì)大家有所幫助
    2013-08-08
  • Java實(shí)現(xiàn)雙鏈表互相交換任意兩個(gè)節(jié)點(diǎn)的方法示例

    Java實(shí)現(xiàn)雙鏈表互相交換任意兩個(gè)節(jié)點(diǎn)的方法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)雙鏈表互相交換任意兩個(gè)節(jié)點(diǎn)的方法,簡(jiǎn)單講述了雙鏈表的概念,并結(jié)合實(shí)例形式給出了java雙鏈表實(shí)現(xiàn)任意兩個(gè)節(jié)點(diǎn)交換的操作技巧,需要的朋友可以參考下
    2017-11-11
  • Java數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)難點(diǎn)解析

    Java數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)難點(diǎn)解析

    樹(shù)是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹(shù)中稱(chēng)為結(jié)點(diǎn))按分支關(guān)系組織起來(lái)的結(jié)構(gòu),很象自然界中的樹(shù)那樣。樹(shù)結(jié)構(gòu)在客觀世界中廣泛存在,如人類(lèi)社會(huì)的族譜和各種社會(huì)組織機(jī)構(gòu)都可用樹(shù)形象表示
    2021-10-10
  • SpringBoot初始教程之Servlet、Filter、Listener配置詳解

    SpringBoot初始教程之Servlet、Filter、Listener配置詳解

    本篇文章主要介紹了SpringBoot初始教程之Servlet、Filter、Listener配置詳解,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-09-09
  • Java基礎(chǔ)教程之包(package)

    Java基礎(chǔ)教程之包(package)

    這篇文章主要介紹了Java基礎(chǔ)教程之包(package),本文詳細(xì)講解了包的創(chuàng)建、使用等方法,需要的朋友可以參考下
    2014-08-08
  • Java中泛型通配符的使用方法示例

    Java中泛型通配符的使用方法示例

    這篇文章主要介紹了Java中泛型通配符的使用方法,結(jié)合實(shí)例形式分析了java中泛型通配符的功能、語(yǔ)法及在泛型類(lèi)創(chuàng)建泛型對(duì)象中的使用方法,需要的朋友可以參考下
    2019-08-08
  • RocketMQ實(shí)現(xiàn)隨緣分BUG小功能示例詳解

    RocketMQ實(shí)現(xiàn)隨緣分BUG小功能示例詳解

    這篇文章主要為大家介紹了RocketMQ實(shí)現(xiàn)隨緣分BUG小功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 淺談Mybatis二級(jí)緩存的缺陷

    淺談Mybatis二級(jí)緩存的缺陷

    本文主要介紹了淺談Mybatis二級(jí)緩存的缺陷,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Java優(yōu)化重復(fù)冗余代碼的8種方式總結(jié)

    Java優(yōu)化重復(fù)冗余代碼的8種方式總結(jié)

    日常開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到一些重復(fù)代碼,最近小編優(yōu)化了一些系統(tǒng)中的重復(fù)代碼,用了好幾種的方式,感覺(jué)挺有用的,所以本文給大家講講優(yōu)化重復(fù)代碼的幾種方式
    2023-08-08

最新評(píng)論

东丰县| 杂多县| 阿勒泰市| 蓬溪县| 陈巴尔虎旗| 包头市| 文昌市| 健康| 莲花县| 剑川县| 唐山市| 韶山市| 尼玛县| 密云县| 通辽市| 定日县| 定兴县| 平阳县| 西峡县| 扶沟县| 浦北县| 黄平县| 若尔盖县| 喜德县| 将乐县| 古浪县| 台南县| 皮山县| 云南省| 张家港市| 屏东市| 永春县| 富宁县| 顺平县| 仁化县| 射阳县| 财经| 宣威市| 大宁县| 石屏县| 新营市|