欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis插件PageHelper的實(shí)現(xiàn)原理詳解

 更新時(shí)間:2023年06月05日 16:19:31   作者:蜀山劍客李沐白  
PageHelper 是一款開(kāi)源的 MyBatis 分頁(yè)插件,可以在實(shí)際應(yīng)用中方便地實(shí)現(xiàn)分頁(yè)功能,這篇文章主要來(lái)和大家講講PageHelper的原理與使用,需要的可以參考下

PageHelper 是一款開(kāi)源的 MyBatis 分頁(yè)插件,可以在實(shí)際應(yīng)用中方便地實(shí)現(xiàn)分頁(yè)功能。PageHelper 能夠有效地縮減開(kāi)發(fā)人員的分頁(yè)處理代碼量,提升開(kāi)發(fā)效率。

一、PageHelper 簡(jiǎn)介

1.1 PageHelper 的作用

面向關(guān)系型數(shù)據(jù)庫(kù)的 SQL 查詢(xún)和數(shù)據(jù)導(dǎo)出時(shí),如果數(shù)據(jù)條數(shù)非常大,直接將所有數(shù)據(jù)一次性查出或者導(dǎo)出顯然是不可行的。這時(shí)候就需要進(jìn)行分頁(yè)查詢(xún)或分頁(yè)導(dǎo)出,將查詢(xún)或?qū)С龅臄?shù)據(jù)按照指定大小分頁(yè)加載或?qū)懭?,從而提高查?xún)或?qū)С龅男?。而分?yè)查詢(xún)或分頁(yè)導(dǎo)出的實(shí)現(xiàn)過(guò)程比較繁瑣,需要考慮很多細(xì)節(jié)問(wèn)題,容易出錯(cuò)。因此,出現(xiàn)了一些支持分頁(yè)查詢(xún)或分頁(yè)導(dǎo)出的插件或工具類(lèi),例如 MyBatis 的分頁(yè)插件 PageHelper。

1.2 PageHelper 的特點(diǎn)

PageHelper 的特點(diǎn)主要有以下幾點(diǎn):

(1)無(wú)侵入性:使用 PageHelper 對(duì) MyBatis 進(jìn)行分頁(yè)處理時(shí),不需要修改原有的 SQL 語(yǔ)句,也不需要修改 Mapper 接口和 XML 文件。

(2)易用性:使用 PageHelper 只需要在項(xiàng)目中引入相關(guān)依賴(lài),然后通過(guò)代碼或配置即可實(shí)現(xiàn)分頁(yè)功能。

(3)強(qiáng)大的功能:PageHelper 支持多種數(shù)據(jù)庫(kù),支持復(fù)雜的分頁(yè)查詢(xún)功能,例如排序、聚合查詢(xún)、連表查詢(xún)等。

(4)高度自定義:PageHelper 支持自定義攔截器,并且提供了豐富的配置選項(xiàng),可以根據(jù)實(shí)際需要進(jìn)行自定義設(shè)置。

二. PageHelper 的使用

2.1 引入 PageHelper

在項(xiàng)目中使用 PageHelper 首先需要在 pom.xml 文件中引入相關(guān)的依賴(lài):

<dependency>
   <groupId>com.github.pagehelper</groupId>
   <artifactId>pagehelper</artifactId>
   <version>5.2.0</version>
</dependency>

此外,如果需要使用 PageHelper 的自動(dòng)配置功能,還需要引入 MyBatis-Spring-Boot-Starter 和 Spring Boot Starter JDBC 或 MyBatis-Starter 等相關(guān)依賴(lài)。

2.2 配置 PageHelper

在 Spring Boot 中使用 PageHelper 可以通過(guò)配置文件或者 Java 代碼進(jìn)行配置。以下是通過(guò)配置文件進(jìn)行配置的示例:

# PageHelper 配置
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql

其中,helperDialect 屬性指定了當(dāng)前項(xiàng)目所使用的數(shù)據(jù)庫(kù)類(lèi)型,reasonable 屬性指定了是否啟用合理化查詢(xún)(即優(yōu)化分頁(yè)查詢(xún)性能),supportMethodsArguments 屬性指定了是否支持接口參數(shù)來(lái)傳遞分頁(yè)參數(shù),params 屬性指定了 PageHelper 的參數(shù)名稱(chēng)。

2.3 使用 PageHelper

使用 PageHelper 進(jìn)行分頁(yè)查詢(xún)非常簡(jiǎn)單,只需在代碼中加入對(duì) PageHelper 的支持,并按照要求傳遞分頁(yè)參數(shù)即可。以下是一個(gè)示例:

// 第 1 個(gè)參數(shù)為當(dāng)前頁(yè)碼數(shù),第 2 個(gè)參數(shù)為每頁(yè)顯示的條數(shù)
PageHelper.startPage(1, 10);
List<User> userList = userDao.selectUserList();
// 通過(guò) PageInfo 獲取分頁(yè)信息
PageInfo<User> pageInfo = new PageInfo<>(userList);
System.out.println(pageInfo.getTotal());

上述代碼首先調(diào)用了 PageHelper 的 startPage 方法,傳入了當(dāng)前頁(yè)碼數(shù)和每頁(yè)顯示的條數(shù),然后調(diào)用了 UserDao 的 selectUserList() 方法查詢(xún)用戶(hù)列表。最后通過(guò) PageInfo 獲取分頁(yè)信息,包括總記錄數(shù)、當(dāng)前頁(yè)碼數(shù)、每頁(yè)顯示的條數(shù)等信息。

三. PageHelper 的優(yōu)缺點(diǎn)

3.1 優(yōu)點(diǎn)

PageHelper 的優(yōu)點(diǎn)主要有以下幾點(diǎn):

(1)使用方便:PageHelper 實(shí)現(xiàn)了 MyBatis 的 Interceptor 接口,并提供了強(qiáng)大的分頁(yè)查詢(xún) API,可以方便地完成分頁(yè)查詢(xún)操作。

(2)性能優(yōu)化:PageHelper 在分頁(yè)查詢(xún)時(shí)自動(dòng)優(yōu)化 SQL 語(yǔ)句,減少了很多重復(fù)性工作,提升了分頁(yè)查詢(xún)的性能。

(3)支持多種數(shù)據(jù)庫(kù):PageHelper 支持多種關(guān)系型數(shù)據(jù)庫(kù),例如 MySQL、Oracle 等,可以輕松切換不同的數(shù)據(jù)庫(kù)。

(4)自定義擴(kuò)展:PageHelper 提供了自定義攔截器和配置選項(xiàng),可以根據(jù)實(shí)際需要進(jìn)行自定義擴(kuò)展。

3.2 缺點(diǎn)

PageHelper 的缺點(diǎn)主要有以下幾點(diǎn):

(1)一定程度上增加了項(xiàng)目的復(fù)雜度:在項(xiàng)目中引入 PageHelper ,需要修改項(xiàng)目的依賴(lài)、配置和代碼,一定程度上增加了項(xiàng)目的復(fù)雜度。

(2)部分靈活性較差:由于 PageHelper 是直接在 MyBatis 插件機(jī)制中實(shí)現(xiàn)的,因此在某些情況下會(huì)出現(xiàn)靈活性較差的情況。

(3)文檔不夠豐富:PageHelper 的官方文檔相對(duì)簡(jiǎn)單,部分功能使用方法沒(méi)有詳細(xì)介紹,需要開(kāi)發(fā)者自行查詢(xún)相關(guān)資料。

四. PageHelper 的注意事項(xiàng)

在使用 PageHelper 進(jìn)行分頁(yè)查詢(xún)時(shí),需要注意以下幾點(diǎn):

(1)避免一次加載過(guò)多的數(shù)據(jù):雖然 PageHelper 可以?xún)?yōu)化分頁(yè)查詢(xún)性能,但是如果一次加載過(guò)多的數(shù)據(jù),依然會(huì)影響查詢(xún)效率。因此,應(yīng)該更加精細(xì)地控制每頁(yè)顯示的數(shù)據(jù)量,盡量避免一次加載過(guò)多的數(shù)據(jù)。

(2)Java 版本兼容性:PageHelper 的不同版本對(duì)于 Java 版本的兼容性可能會(huì)有所不同,因此在使用 PageHelper 時(shí)需要注意當(dāng)前所使用的 Java 版本和 PageHelper 的版本是否匹配。

(3)類(lèi)似于 limit 關(guān)鍵字的語(yǔ)法:PageHelper 使用了類(lèi)似于 limit 關(guān)鍵字的語(yǔ)法,這可能會(huì)受到不同數(shù)據(jù)庫(kù)支持的限制,因此需要在實(shí)際使用時(shí)進(jìn)行測(cè)試。

(4)分頁(yè)參數(shù)設(shè)置:在使用 PageHelper 進(jìn)行分頁(yè)查詢(xún)時(shí),需要按照要求設(shè)置分頁(yè)參數(shù),如 pageNum 和 pageSize 等參數(shù),否則可能會(huì)導(dǎo)致查詢(xún)結(jié)果不正確。

五、實(shí)現(xiàn)原理

主要是通過(guò)攔截器(Interceptor)來(lái)實(shí)現(xiàn)。在 MyBatis 中,提供了 Interceptor 接口用于對(duì) SQL 語(yǔ)句進(jìn)行攔截和處理,PageHelper 就是實(shí)現(xiàn)了這個(gè)接口,從而實(shí)現(xiàn)了對(duì) SQL 語(yǔ)句的攔截和分頁(yè)處理。

PageHelper 在攔截器中主要做了如下幾個(gè)事情:

  • 解析分頁(yè)參數(shù):通過(guò)攔截 Executor 的 query() 方法,獲取傳入的參數(shù),解析出當(dāng)前所在的頁(yè)碼、每頁(yè)顯示的數(shù)據(jù)量等分頁(yè)參數(shù)。
  • 生成分頁(yè) SQL:通過(guò)攔截 StatementHandler 的 prepare() 方法,將原始的 SQL 語(yǔ)句修改為分頁(yè)查詢(xún)的 SQL 語(yǔ)句,具體實(shí)現(xiàn)方式是根據(jù)當(dāng)前數(shù)據(jù)庫(kù)類(lèi)型,使用相應(yīng)的方言(Dialect)生成分頁(yè)查詢(xún)語(yǔ)句。
  • 執(zhí)行分頁(yè)查詢(xún):通過(guò)攔截 Executor 的 query() 方法,將修改后的 SQL 語(yǔ)句執(zhí)行,并將結(jié)果保存在 Page 對(duì)象中,同時(shí)返回分頁(yè)查詢(xún)結(jié)果 List。
  • 生成分頁(yè)信息:通過(guò)自定義 Page 對(duì)象,保存當(dāng)前頁(yè)碼、每頁(yè)顯示的數(shù)據(jù)量、總記錄數(shù)以及分頁(yè)查詢(xún)結(jié)果 List,最終返回 PageInfo 對(duì)象,包含了分頁(yè)查詢(xún)的所有信息。

其中,涉及到的一些核心代碼如下:

// 分頁(yè)查詢(xún)攔截器
public class PageInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 解析分頁(yè)參數(shù)
        Page<Object> page = getPageParam(invocation);
        // 生成分頁(yè) SQL
        String pageSql = generatePageSql(page, invocation);
        // 替換原始 SQL 語(yǔ)句為分頁(yè) SQL
        setSql(invocation, pageSql);
        // 執(zhí)行分頁(yè)查詢(xún)
        List<?> result = (List<?>) invocation.proceed();
        // 生成分頁(yè)信息
        PageInfo<?> pageInfo = new PageInfo<>(result, page.getPageSize());
        return pageInfo;
    }
}
// 獲取分頁(yè)參數(shù)
private Page<Object> getPageParam(Invocation invocation) {
    Object[] args = invocation.getArgs();
    for (Object arg : args) {
        if (arg instanceof Page) {
            return (Page<Object>) arg;
        }
    }
    return null;
}
// 生成分頁(yè) SQL
private String generatePageSql(Page<?> page, Invocation invocation) {
    MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
    String sql = mappedStatement.getBoundSql(page).getSql();
    Dialect dialect = getDialect(mappedStatement.getConfiguration().getEnvironment().getDataSource());
    return dialect.generatePageSql(sql, page.getStartRow(), page.getPageSize());
}
// 設(shè)置 SQL 語(yǔ)句
private void setSql(Invocation invocation, String sql) {
    Object[] args = invocation.getArgs();
    MappedStatement mappedStatement = (MappedStatement) args[0];
    BoundSql boundSql = mappedStatement.getBoundSql(args[1]);
    MetaObject metaObject = SystemMetaObject.forObject(boundSql);
    metaObject.setValue("sql", sql);
}

以上代碼中,getPageParam() 方法用于獲取傳入的分頁(yè)參數(shù),generatePageSql() 方法用于根據(jù)當(dāng)前數(shù)據(jù)庫(kù)類(lèi)型生成分頁(yè) SQL 語(yǔ)句,setSql() 方法用于將原始的 SQL 語(yǔ)句替換為分頁(yè) SQL 語(yǔ)句。此外,還需要實(shí)現(xiàn) Dialect 接口來(lái)提供不同數(shù)據(jù)庫(kù)類(lèi)型的方言實(shí)現(xiàn)。

到此這篇關(guān)于Mybatis插件PageHelper的實(shí)現(xiàn)原理詳解的文章就介紹到這了,更多相關(guān)Mybatis PageHelper內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring負(fù)載均衡LoadBalancer使用詳解

    Spring負(fù)載均衡LoadBalancer使用詳解

    這篇文章主要介紹了Spring負(fù)載均衡LoadBalancer使用詳解,Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客戶(hù)端負(fù)載均衡器, 用來(lái)替代Ribbon,Spring官方提供了兩種客戶(hù)端都可以使用loadbalancer,需要的朋友可以參考下
    2023-11-11
  • Java中的CyclicBarrier循環(huán)柵欄解析

    Java中的CyclicBarrier循環(huán)柵欄解析

    這篇文章主要介紹了Java中的CyclicBarrier循環(huán)柵欄解析,從字面上的意思可以知道,這個(gè)類(lèi)的中文意思是"循環(huán)柵欄",大概的意思就是一個(gè)可循環(huán)利用的屏障,它的作用就是會(huì)讓所有線程都等待完成后才會(huì)繼續(xù)下一步行動(dòng),需要的朋友可以參考下
    2023-12-12
  • Java的線程阻塞、中斷及優(yōu)雅退出方法詳解

    Java的線程阻塞、中斷及優(yōu)雅退出方法詳解

    這篇文章主要介紹了Java的線程阻塞、中斷及優(yōu)雅退出方法詳解,Java中的線程阻塞是指當(dāng)一個(gè)線程無(wú)法繼續(xù)執(zhí)行時(shí),它會(huì)進(jìn)入阻塞狀態(tài),直到某個(gè)條件滿(mǎn)足后才能繼續(xù)執(zhí)行,線程阻塞可以通過(guò)多種方式實(shí)現(xiàn),需要的朋友可以參考下
    2023-10-10
  • Java生成隨機(jī)數(shù)的2種示例方法代碼

    Java生成隨機(jī)數(shù)的2種示例方法代碼

    在Java中,生成隨機(jī)數(shù)有兩種方法。1是使用Random類(lèi)。2是使用Math類(lèi)中的random方法。看下面的例子使用吧
    2013-11-11
  • Java編程讀寫(xiě)鎖詳解

    Java編程讀寫(xiě)鎖詳解

    本篇文章給大家詳細(xì)分享了Java編程讀寫(xiě)鎖的相關(guān)原理以及知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以參考下。
    2018-08-08
  • SpringBoot實(shí)現(xiàn)定時(shí)發(fā)送郵件的三種方法案例詳解

    SpringBoot實(shí)現(xiàn)定時(shí)發(fā)送郵件的三種方法案例詳解

    這篇文章主要介紹了SpringBoot三種方法實(shí)現(xiàn)定時(shí)發(fā)送郵件的案例,Spring框架的定時(shí)任務(wù)調(diào)度功能支持配置和注解兩種方式Spring?Boot在Spring框架的基礎(chǔ)上實(shí)現(xiàn)了繼承,并對(duì)其中基于注解方式的定時(shí)任務(wù)實(shí)現(xiàn)了非常好的支持,本文給大家詳細(xì)講解,需要的朋友可以參考下
    2023-03-03
  • Java通過(guò)freemarker生成Word文檔導(dǎo)出的方式詳解

    Java通過(guò)freemarker生成Word文檔導(dǎo)出的方式詳解

    本文詳細(xì)介紹了如何使用FreeMarker模板生成Word文檔,包括制作FTL模板、在Java中使用FreeMarker生成文檔以及處理動(dòng)態(tài)數(shù)據(jù)和合并單元格等內(nèi)容,需要的朋友可以參考下
    2025-03-03
  • java代碼效率優(yōu)化方法(推薦)

    java代碼效率優(yōu)化方法(推薦)

    下面小編就為大家?guī)?lái)一篇java代碼效率優(yōu)化方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • ThreadPoolExecutor中的submit()方法詳細(xì)講解

    ThreadPoolExecutor中的submit()方法詳細(xì)講解

    在使用線程池的時(shí)候,發(fā)現(xiàn)除了execute()方法可以執(zhí)行任務(wù)外,還發(fā)現(xiàn)有一個(gè)方法submit()可以執(zhí)行任務(wù),本文就詳細(xì)的介紹一下ThreadPoolExecutor中的submit()方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-04-04
  • java中實(shí)現(xiàn)漢字按照拼音排序(示例代碼)

    java中實(shí)現(xiàn)漢字按照拼音排序(示例代碼)

    這篇文章主要是對(duì)java中將漢字按照拼音排序的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12

最新評(píng)論