亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MyBatis實(shí)現(xiàn)分頁的兩種方式

 更新時(shí)間:2025年07月04日 10:52:05   作者:思靜魚  
本文詳細(xì)比較了MyBatis中的邏輯分頁(如RowBounds)、物理分頁(基于數(shù)據(jù)庫的LIMIT/OFFSET)和插件式分頁(如PageHelper)的優(yōu)缺點(diǎn)及應(yīng)用場(chǎng)景,強(qiáng)調(diào)了在處理大數(shù)據(jù)量時(shí)選擇物理分頁的重要性,以及MyBatis-Plus的分頁便利性,對(duì)mybatis分頁相關(guān)知識(shí)感興趣的朋友一起看看吧

在 MyBatis 中實(shí)現(xiàn)分頁通常有兩種方式:使用數(shù)據(jù)庫廠商提供的分頁查詢語句(如 MySQL 的 LIMIT)或者通過自定義 SQL 來實(shí)現(xiàn)分頁邏輯等

MyBatis分頁方式對(duì)比

MyBatis提供了多種分頁方式,每種方式都有其特定的應(yīng)用場(chǎng)景和優(yōu)缺點(diǎn)。以下是對(duì)MyBatis中幾種常見分頁方式的對(duì)比:

  1. 基于RowBounds的分頁(邏輯分頁):
    ○ 原理:執(zhí)行完整的SQL查詢,將結(jié)果集全部加載到內(nèi)存中,然后根據(jù)RowBounds指定的偏移量和限制數(shù)進(jìn)行分頁處理。
    ○ 優(yōu)點(diǎn):減少IO次數(shù),對(duì)于頻繁訪問且數(shù)據(jù)量較小的情況較為適合。
    ○ 缺點(diǎn):當(dāng)數(shù)據(jù)量非常大時(shí),容易造成內(nèi)存溢出,性能下降。
  2. 基于數(shù)據(jù)庫的分頁(物理分頁):
    ○ 原理:在SQL查詢語句中使用LIMIT和OFFSET關(guān)鍵字來實(shí)現(xiàn)分頁,直接在數(shù)據(jù)庫層面進(jìn)行分頁處理。
    ○ 優(yōu)點(diǎn):適用于大數(shù)據(jù)量的情況,避免了內(nèi)存溢出的風(fēng)險(xiǎn),性能較好。
    ○ 缺點(diǎn):需要數(shù)據(jù)庫支持LIMIT和OFFSET語法,不同數(shù)據(jù)庫廠商的語法可能有所不同。
  3. 基于插件的分頁:
    ○ 原理:MyBatis提供了插件機(jī)制,通過自定義插件來攔截SQL語句的執(zhí)行,并在查詢結(jié)果返回之前添加分頁邏輯。
    ○ 優(yōu)點(diǎn):插件封裝了分頁的具體實(shí)現(xiàn)細(xì)節(jié),使用起來簡單方便,適用于多種分頁需求。
    ○ 缺點(diǎn):可能需要一定的開發(fā)成本來編寫和維護(hù)插件。
  4. 數(shù)組分頁:
    ○ 原理:首先查詢出全部數(shù)據(jù),然后在Java代碼的List中截取需要的部分。
    ○ 優(yōu)點(diǎn):實(shí)現(xiàn)簡單。
    ○ 缺點(diǎn):當(dāng)數(shù)據(jù)量很大時(shí),會(huì)消耗大量內(nèi)存,并可能導(dǎo)致性能問題。
    綜上所述,選擇哪種分頁方式取決于具體的應(yīng)用場(chǎng)景和數(shù)據(jù)量大小。對(duì)于小數(shù)據(jù)量或頻繁訪問的場(chǎng)景,邏輯分頁(如RowBounds)可能是一個(gè)不錯(cuò)的選擇。而對(duì)于大數(shù)據(jù)量或需要高效分頁的場(chǎng)景,物理分頁(如基于數(shù)據(jù)庫的分頁)或基于插件的分頁可能更為合適。在實(shí)際應(yīng)用中,還需要考慮數(shù)據(jù)庫類型、系統(tǒng)性能、開發(fā)成本等因素來做出決策。

使用數(shù)據(jù)庫廠商提供的分頁查詢語句

許多數(shù)據(jù)庫廠商都提供了用于分頁的特定語法,如 MySQL 的 LIMIT、Oracle 的 ROWNUM、SQL Server 的 OFFSET FETCH 等。你可以直接在 SQL 查詢語句中使用這些語法來實(shí)現(xiàn)分頁,然后將分頁參數(shù)傳遞給 MyBatis 的方法即可。
示例(MySQL):

<select id="getUserList" resultType="User">
    SELECT * FROM users
    LIMIT #{offset}, #{pageSize}
</select>
List<User> getUserList(@Param("offset") int offset, @Param("pageSize") int pageSize);

通過自定義 SQL 實(shí)現(xiàn)分頁邏輯

如果你使用的數(shù)據(jù)庫不支持特定的分頁語法,或者想要更多靈活性,你可以通過自定義 SQL 實(shí)現(xiàn)分頁邏輯。通常,你需要通過 RowBounds 或 PageHelper 來實(shí)現(xiàn)分頁。

1. 使用 RowBounds 實(shí)現(xiàn)分頁

原理:通過RowBounds實(shí)現(xiàn)分頁和通過數(shù)組方式分頁原理差不多,都是一次獲取所有符合條件的數(shù)據(jù),然后在內(nèi)存中對(duì)大數(shù)據(jù)進(jìn)行操作,實(shí)現(xiàn)分頁效果。只是數(shù)組分頁需要我們自己去實(shí)現(xiàn)分頁邏輯,這里更加簡化而已。
存在問題:一次性從數(shù)據(jù)庫獲取的數(shù)據(jù)可能會(huì)很多,對(duì)內(nèi)存的消耗很大,可能導(dǎo)師性能變差,甚至引發(fā)內(nèi)存溢出。
適用場(chǎng)景:在數(shù)據(jù)量很大的情況下,建議還是適用攔截器實(shí)現(xiàn)分頁效果。RowBounds建議在數(shù)據(jù)量相對(duì)較小的情況下使用。
RowBounds分頁是Mybatis提供的一種分頁方式,其原理主要是在執(zhí)行SQL查詢后,將返回的所有結(jié)果集加載到內(nèi)存中,然后在內(nèi)存中根據(jù)指定的偏移量(offset)和限制數(shù)(limit)進(jìn)行分頁處理。
具體來說,當(dāng)我們?cè)贛ybatis的Mapper接口中調(diào)用查詢方法時(shí),可以傳入一個(gè)RowBounds對(duì)象作為參數(shù)。這個(gè)RowBounds對(duì)象包含了分頁所需的信息,比如當(dāng)前頁碼、每頁顯示的記錄數(shù)等。在執(zhí)行查詢時(shí),Mybatis會(huì)首先執(zhí)行完整的SQL查詢語句,獲取到所有滿足條件的結(jié)果集。然后,Mybatis會(huì)根據(jù)RowBounds對(duì)象中指定的偏移量和限制數(shù),在內(nèi)存中對(duì)這些結(jié)果集進(jìn)行截取,從而得到當(dāng)前頁需要展示的數(shù)據(jù)。
需要注意的是,RowBounds分頁方式是一種邏輯分頁,即在內(nèi)存中進(jìn)行分頁處理。當(dāng)數(shù)據(jù)量非常大時(shí),這種方式可能會(huì)導(dǎo)致內(nèi)存溢出的問題。因此,對(duì)于大數(shù)據(jù)量的分頁需求,建議使用物理分頁方式,即在SQL查詢語句中添加LIMIT和OFFSET子句,直接在數(shù)據(jù)庫層面進(jìn)行分頁處理。
此外,Mybatis還提供了另一種分頁插件PageHelper,它使用攔截器的方式實(shí)現(xiàn)了物理分頁。PageHelper插件會(huì)在Mybatis執(zhí)行SQL查詢之前,自動(dòng)根據(jù)傳入的分頁參數(shù)改寫SQL語句,添加LIMIT和OFFSET子句,從而實(shí)現(xiàn)物理分頁。這種方式可以更有效地處理大數(shù)據(jù)量的分頁需求,避免內(nèi)存溢出的問題。
List getUserList(RowBounds rowBounds);
RowBounds rowBounds = new RowBounds(offset, pageSize);
List users = sqlSession.selectList(“getUserList”, rowBounds);

2. 使用 PageHelper 實(shí)現(xiàn)分頁

PageHelper的分頁原理主要基于MyBatis的插件機(jī)制。具體來說,PageHelper內(nèi)部實(shí)現(xiàn)了一個(gè)PageInterceptor攔截器,這個(gè)攔截器會(huì)在MyBatis執(zhí)行SQL查詢之前進(jìn)行攔截。
當(dāng)我們?cè)诖a中調(diào)用PageHelper的startPage方法時(shí),它會(huì)在當(dāng)前線程上下文中設(shè)置一個(gè)ThreadLocal變量,用于保存分頁的參數(shù),如當(dāng)前頁碼、每頁顯示的數(shù)量等。
隨后,當(dāng)MyBatis執(zhí)行SQL查詢時(shí),PageInterceptor攔截器會(huì)攔截到這一操作。攔截器會(huì)從ThreadLocal中獲取到分頁參數(shù),并根據(jù)這些參數(shù)來改寫原始的SQL語句,添加LIMIT和OFFSET子句,以實(shí)現(xiàn)分頁查詢。
改寫后的SQL語句會(huì)被發(fā)送到數(shù)據(jù)庫執(zhí)行,數(shù)據(jù)庫返回的結(jié)果集就是根據(jù)分頁參數(shù)查詢得到的結(jié)果。
最后,PageInterceptor攔截器會(huì)將ThreadLocal中的分頁參數(shù)清除,避免對(duì)后續(xù)操作產(chǎn)生影響。
通過這種方式,PageHelper實(shí)現(xiàn)了對(duì)MyBatis查詢結(jié)果的分頁處理,而無需修改原有的SQL語句、Mapper接口和XML文件,因此具有無侵入性和易用性。同時(shí),由于分頁操作是在數(shù)據(jù)庫層面進(jìn)行的,因此也具有較高的性能。
需要注意的是,PageHelper使用了ThreadLocal來保存分頁參數(shù),因此分頁參數(shù)是與線程綁定的,這意味著不同的線程之間不會(huì)共享分頁參數(shù),從而保證了分頁的準(zhǔn)確性和獨(dú)立性。
總的來說,PageHelper通過攔截MyBatis的SQL查詢操作,并在查詢語句中添加LIMIT和OFFSET子句,實(shí)現(xiàn)了對(duì)查詢結(jié)果的分頁處理,從而簡化了分頁操作的實(shí)現(xiàn)過程,提高了開發(fā)效率。
PageHelper 是一個(gè) MyBatis 的分頁插件,可以簡化分頁操作。
首先,在 MyBatis 的配置文件中配置 PageHelper 插件:

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <property name="helperDialect" value="mysql"/>
    </plugin>
</plugins>
然后,在需要分頁的查詢方法中添加分頁參數(shù):
List<User> getUserList(@Param("pageNum") int pageNum, @Param("pageSize") int pageSize);
PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.getUserList(pageNum, pageSize);
這兩種方式都可以實(shí)現(xiàn)分頁查詢,你可以根據(jù)實(shí)際需求選擇合適的方式。

數(shù)組分頁

使用數(shù)組進(jìn)行分頁通常意味著在數(shù)據(jù)庫中獲取所有數(shù)據(jù),然后在應(yīng)用程序中對(duì)數(shù)據(jù)進(jìn)行分割和展示。這種方法在數(shù)據(jù)量較小且不頻繁變化時(shí)比較適用,但在數(shù)據(jù)量較大時(shí)可能會(huì)影響性能。下面是一個(gè)簡單的 Java 代碼示例,演示如何使用數(shù)組進(jìn)行分頁:

import java.util.ArrayList;
import java.util.List;
public class PaginationWithArrayExample {
    // 模擬從數(shù)據(jù)庫中獲取數(shù)據(jù)的方法,返回所有數(shù)據(jù)
    public List<String> fetchDataFromDatabase() {
        // 這里假設(shè)從數(shù)據(jù)庫中獲取了一些數(shù)據(jù),實(shí)際情況根據(jù)需求修改
        List<String> dataList = new ArrayList<>();
        for (int i = 1; i <= 100; i++) {
            dataList.add("Data " + i);
        }
        return dataList;
    }
    // 根據(jù)頁碼和每頁顯示數(shù)量,從數(shù)據(jù)集中獲取指定頁的數(shù)據(jù)
    public List<String> getDataForPage(List<String> dataList, int pageNumber, int pageSize) {
        int startIndex = (pageNumber - 1) * pageSize;
        int endIndex = Math.min(startIndex + pageSize, dataList.size());
        if (startIndex >= endIndex) {
            return new ArrayList<>(); // 如果起始索引大于等于結(jié)束索引,返回空列表
        }
        return dataList.subList(startIndex, endIndex);
    }
    // 示例用法
    public static void main(String[] args) {
        PaginationWithArrayExample example = new PaginationWithArrayExample();
        List<String> dataList = example.fetchDataFromDatabase(); // 模擬從數(shù)據(jù)庫中獲取數(shù)據(jù)
        int pageNumber = 2; // 第2頁
        int pageSize = 10; // 每頁顯示10條數(shù)據(jù)
        List<String> pageData = example.getDataForPage(dataList, pageNumber, pageSize);
        // 輸出當(dāng)前頁的數(shù)據(jù)
        System.out.println("Page " + pageNumber + " data:");
        for (String data : pageData) {
            System.out.println(data);
        }
    }
}

在這個(gè)示例中,fetchDataFromDatabase 方法模擬從數(shù)據(jù)庫中獲取數(shù)據(jù),返回一個(gè)包含了所有數(shù)據(jù)的列表。然后,getDataForPage 方法根據(jù)傳入的頁碼和每頁顯示數(shù)量,從數(shù)據(jù)集中獲取指定頁的數(shù)據(jù),返回一個(gè)包含了當(dāng)前頁數(shù)據(jù)的子列表。在示例的 main 方法中,演示了如何使用這兩個(gè)方法來獲取指定頁的數(shù)據(jù),并將其打印輸出。

使用 MyBatis-Plus 進(jìn)行分頁

MyBatis-Plus進(jìn)行分頁的原理主要依賴于其內(nèi)置的分頁插件和Page對(duì)象。
首先,MyBatis-Plus提供了分頁插件,該插件會(huì)在MyBatis執(zhí)行SQL查詢之前進(jìn)行攔截。當(dāng)使用MyBatis-Plus進(jìn)行分頁查詢時(shí),分頁插件會(huì)自動(dòng)識(shí)別分頁相關(guān)的參數(shù),并對(duì)原始的SQL語句進(jìn)行改寫,添加LIMIT和OFFSET子句,以實(shí)現(xiàn)物理分頁。
其次,MyBatis-Plus中的Page對(duì)象用于表示分頁信息。這個(gè)對(duì)象包含了當(dāng)前頁碼、每頁記錄數(shù)、總記錄數(shù)等信息。在進(jìn)行分頁查詢時(shí),可以通過傳遞Page對(duì)象給MyBatis-Plus的查詢方法,來告訴MyBatis-Plus需要進(jìn)行分頁查詢以及分頁的具體參數(shù)。
當(dāng)MyBatis-Plus執(zhí)行分頁查詢時(shí),它會(huì)根據(jù)Page對(duì)象中的信息生成對(duì)應(yīng)的分頁SQL語句,并通過數(shù)據(jù)庫執(zhí)行這個(gè)語句。數(shù)據(jù)庫會(huì)根據(jù)LIMIT和OFFSET子句返回指定范圍的結(jié)果集。
最后,MyBatis-Plus將查詢結(jié)果封裝到Page對(duì)象中,并返回給調(diào)用者。這個(gè)Page對(duì)象不僅包含了實(shí)際的查詢結(jié)果列表,還包含了分頁相關(guān)的信息,如總記錄數(shù)、總頁數(shù)等。這使得分頁操作更加方便,同時(shí)也提高了代碼的可維護(hù)性。
需要注意的是,MyBatis-Plus的分頁實(shí)現(xiàn)是基于物理分頁的,即直接在數(shù)據(jù)庫層面進(jìn)行分頁處理,而不是在內(nèi)存中處理。這種方式在處理大數(shù)據(jù)量時(shí)性能較好,避免了內(nèi)存溢出的風(fēng)險(xiǎn)。
總結(jié)來說,MyBatis-Plus進(jìn)行分頁的原理是通過分頁插件和Page對(duì)象來實(shí)現(xiàn)物理分頁,通過在SQL語句中添加LIMIT和OFFSET子句來獲取指定范圍的結(jié)果集,并將結(jié)果封裝到Page對(duì)象中返回給調(diào)用者。
MyBatis-Plus 是 MyBatis 的增強(qiáng)工具包,提供了很多便捷的功能,其中包括了分頁功能。MyBatis-Plus 的分頁功能可以輕松地實(shí)現(xiàn)物理分頁,讓分頁操作變得更加簡單。
首先,你需要在項(xiàng)目中引入 MyBatis-Plus 的依賴。在 Maven 項(xiàng)目中,你可以在 pom.xml 文件中添加如下依賴:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>latest_version</version>
</dependency>

接下來,假設(shè)你有一個(gè) UserMapper 接口,用于操作用戶信息。你可以在該接口中直接定義分頁查詢的方法,無需額外編寫 XML 映射文件。

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.User;
public interface UserMapper extends BaseMapper<User> {
    Page<User> selectUserPage(Page<User> page);
}

在該方法中,我們使用了 MyBatis-Plus 提供的 Page 類來實(shí)現(xiàn)分頁。Page 類繼承自 MyBatis 的 RowBounds 類,它除了包含分頁信息外,還包含了分頁查詢返回的數(shù)據(jù)列表。
然后,你可以在 Service 層中調(diào)用這個(gè)方法來進(jìn)行分頁查詢:

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    public Page<User> getUserPage(int pageNum, int pageSize) {
        Page<User> page = new Page<>(pageNum, pageSize);
        return userMapper.selectUserPage(page);
    }
}

在這個(gè)示例中,我們創(chuàng)建了一個(gè)新的 Page 對(duì)象,并傳入了當(dāng)前頁碼和每頁顯示數(shù)量。然后調(diào)用 selectUserPage 方法進(jìn)行分頁查詢,并將結(jié)果返回。
最后,在 Controller 層中調(diào)用 Service 方法并將結(jié)果返回給前端即可完成分頁查詢的操作。

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
    @Autowired
    private UserService userService;
    @GetMapping("/users")
    public Page<User> getUserPage(@RequestParam(defaultValue = "1") int pageNum,
                                  @RequestParam(defaultValue = "10") int pageSize) {
        return userService.getUserPage(pageNum, pageSize);
    }
}

通過 MyBatis-Plus,你可以很方便地實(shí)現(xiàn)分頁查詢,而無需編寫繁瑣的 SQL 語句或者額外的 XML 映射文件。

MyBatis物理分頁和邏輯分頁

MyBatis中的物理分頁和邏輯分頁是兩種不同的分頁方式,它們?cè)趯?shí)現(xiàn)方式和性能上有顯著的區(qū)別。
物理分頁:
物理分頁是在數(shù)據(jù)庫層面上實(shí)現(xiàn)的分頁,它依賴于數(shù)據(jù)庫自身提供的分頁功能。在MyBatis中,物理分頁通常是通過在SQL語句中添加LIMIT和OFFSET子句來實(shí)現(xiàn)的。這種方式在查詢數(shù)據(jù)庫時(shí),數(shù)據(jù)庫會(huì)根據(jù)指定的偏移量和限制數(shù)直接返回分頁后的結(jié)果,而不需要加載全部數(shù)據(jù)到內(nèi)存中。因此,物理分頁在處理大數(shù)據(jù)量時(shí)性能較好,避免了內(nèi)存溢出的風(fēng)險(xiǎn)。然而,需要注意的是,不同的數(shù)據(jù)庫可能具有不同的分頁語法,因此在使用物理分頁時(shí)需要考慮到數(shù)據(jù)庫方言的問題。
邏輯分頁:
邏輯分頁則是在應(yīng)用層面上實(shí)現(xiàn)的分頁,它依賴于查詢結(jié)果集。邏輯分頁首先會(huì)查詢出全部的數(shù)據(jù),然后將這些數(shù)據(jù)加載到內(nèi)存中,再根據(jù)分頁要求篩選出合適的數(shù)據(jù)進(jìn)行分頁。這種方式在數(shù)據(jù)量較小時(shí)可能比較方便,但在處理大數(shù)據(jù)量時(shí),會(huì)消耗大量的內(nèi)存,并可能導(dǎo)致性能問題。因此,邏輯分頁通常適用于數(shù)據(jù)量較小或?qū)?shù)據(jù)實(shí)時(shí)性要求不高的場(chǎng)景。
在實(shí)際應(yīng)用中,選擇物理分頁還是邏輯分頁需要根據(jù)具體的需求和場(chǎng)景來決定。對(duì)于大數(shù)據(jù)量或?qū)?shù)據(jù)性能要求較高的場(chǎng)景,建議使用物理分頁以提高性能和避免內(nèi)存溢出。而對(duì)于數(shù)據(jù)量較小或?qū)?shù)據(jù)實(shí)時(shí)性要求不高的場(chǎng)景,可以選擇邏輯分頁以簡化實(shí)現(xiàn)過程。
此外,MyBatis還提供了分頁插件如PageHelper來簡化分頁操作的實(shí)現(xiàn)。這些插件內(nèi)部實(shí)現(xiàn)了物理分頁的邏輯,使得開發(fā)者可以更方便地進(jìn)行分頁操作,而無需手動(dòng)編寫復(fù)雜的分頁SQL語句。然而,在使用分頁插件時(shí),仍然需要注意插件的性能和兼容性等問題。

MyBatis 手寫一個(gè) 攔截器分頁

MyBatis 攔截器可以用于在 SQL 執(zhí)行前后進(jìn)行一些額外的處理,例如實(shí)現(xiàn)分頁功能。下面我會(huì)給出一個(gè)簡單的示例,包含了 DAO 層和業(yè)務(wù)層的代碼。

假設(shè)你有一個(gè) UserDao 接口,其中定義了獲取用戶列表的方法:
public interface UserDao {
    List<User> getUserList();
}
接下來,我們創(chuàng)建一個(gè)攔截器來實(shí)現(xiàn)分頁功能:
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import java.util.Properties;
@Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}))
public class PaginationInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object[] args = invocation.getArgs();
        MappedStatement mappedStatement = (MappedStatement) args[0];
        Object parameter = args[1];
        RowBounds rowBounds = (RowBounds) args[2];
        // 判斷是否需要進(jìn)行分頁
        if (rowBounds != RowBounds.DEFAULT) {
            BoundSql boundSql = mappedStatement.getBoundSql(parameter);
            String sql = boundSql.getSql();
            // 自己實(shí)現(xiàn)分頁邏輯,這里簡單起見,直接拼接 LIMIT
            sql += " LIMIT " + rowBounds.getOffset() + ", " + rowBounds.getLimit();
            BoundSql newBoundSql = new BoundSql(mappedStatement.getConfiguration(), sql, boundSql.getParameterMappings(), boundSql.getParameterObject());
            MappedStatement newMappedStatement = copyFromMappedStatement(mappedStatement, new BoundSqlSqlSource(newBoundSql));
            args[0] = newMappedStatement;
            args[2] = RowBounds.DEFAULT;
        }
        return invocation.proceed();
    }
    private MappedStatement copyFromMappedStatement(MappedStatement ms, BoundSqlSqlSource newSqlSource) {
        MappedStatement.Builder builder = new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), newSqlSource, ms.getSqlCommandType());
        builder.resource(ms.getResource());
        builder.fetchSize(ms.getFetchSize());
        builder.statementType(ms.getStatementType());
        builder.keyGenerator(ms.getKeyGenerator());
        builder.keyProperty(ms.getKeyProperty());
        builder.timeout(ms.getTimeout());
        builder.parameterMap(ms.getParameterMap());
        builder.resultMaps(ms.getResultMaps());
        builder.cache(ms.getCache());
        builder.flushCacheRequired(ms.isFlushCacheRequired());
        builder.useCache(ms.isUseCache());
        return builder.build();
    }
    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }
    @Override
    public void setProperties(Properties properties) {
        // 這里可以接收配置參數(shù),但我們這里不需要配置參數(shù)
    }
    private static class BoundSqlSqlSource implements org.apache.ibatis.mapping.SqlSource {
        private final BoundSql boundSql;
        public BoundSqlSqlSource(BoundSql boundSql) {
            this.boundSql = boundSql;
        }
        @Override
        public BoundSql getBoundSql(Object parameterObject) {
            return boundSql;
        }
    }
}
然后,在你的 MyBatis 配置文件中配置該攔截器:
<plugins>
    <plugin interceptor="your.package.name.PaginationInterceptor"/>
</plugins>
最后,在業(yè)務(wù)代碼中使用分頁功能:
import org.apache.ibatis.session.RowBounds;
public class UserService {
    private final UserDao userDao;
    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
    public List<User> getUsersByPage(int pageNum, int pageSize) {
        // 計(jì)算 offset
        int offset = (pageNum - 1) * pageSize;
        // 使用 RowBounds 進(jìn)行分頁
        RowBounds rowBounds = new RowBounds(offset, pageSize);
        return userDao.getUserList(rowBounds);
    }
}

這樣,當(dāng)調(diào)用 getUsersByPage 方法時(shí),會(huì)自動(dòng)進(jìn)行分頁查詢。

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

相關(guān)文章

  • java基本事件處理機(jī)制解析

    java基本事件處理機(jī)制解析

    這篇文章主要介紹了java基本事件處理機(jī)制解析,?Java事件處理機(jī)制是一種用于處理用戶交互和系統(tǒng)事件的編程模型,它基于事件驅(qū)動(dòng)的思想,通過監(jiān)聽和響應(yīng)事件來實(shí)現(xiàn)程序的交互性和動(dòng)態(tài)性,需要的朋友可以參考下
    2023-10-10
  • spring-boot-maven-plugin?配置有啥用

    spring-boot-maven-plugin?配置有啥用

    這篇文章主要介紹了spring-boot-maven-plugin?配置是干啥的,這個(gè)是SpringBoot的Maven插件,主要用來打包的,通常打包成jar或者war文件,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Java方法的參數(shù)傳遞機(jī)制詳解

    Java方法的參數(shù)傳遞機(jī)制詳解

    這篇文章主要介紹了Java方法的參數(shù)傳遞機(jī)制詳解,對(duì)于Java初學(xué)者來說,剛學(xué)習(xí)Java的時(shí)候可能經(jīng)常會(huì)聽到調(diào)用方法時(shí)參數(shù)的值傳遞與引用傳遞,但是,實(shí)際上Java中方法的參數(shù)傳遞機(jī)制只有值傳遞,需要的朋友可以參考下
    2024-01-01
  • 基于Spring框架的Shiro配置方法

    基于Spring框架的Shiro配置方法

    這篇文章主要介紹了基于Spring框架的Shiro配置方法,需要的朋友可以參考下
    2014-10-10
  • 解決mybatis-plus動(dòng)態(tài)數(shù)據(jù)源切換不生效的問題

    解決mybatis-plus動(dòng)態(tài)數(shù)據(jù)源切換不生效的問題

    本文主要介紹了解決mybatis-plus動(dòng)態(tài)數(shù)據(jù)源切換不生效的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • java Wrapper類基本用法詳解

    java Wrapper類基本用法詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于java Wrapper類基本用法詳解,有興趣的朋友們可以參考下。
    2021-01-01
  • JAVA初級(jí)項(xiàng)目——實(shí)現(xiàn)圖書管理系統(tǒng)

    JAVA初級(jí)項(xiàng)目——實(shí)現(xiàn)圖書管理系統(tǒng)

    這篇文章主要介紹了JAVA如何實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • java當(dāng)中的定時(shí)器的4種使用方式

    java當(dāng)中的定時(shí)器的4種使用方式

    這篇文章主要介紹了java當(dāng)中的定時(shí)器的4種使用方式,有需要的朋友可以參考一下
    2013-12-12
  • IntelliJ?IDEA?2022.2.3最新激活圖文教程(親測(cè)有用永久激活)

    IntelliJ?IDEA?2022.2.3最新激活圖文教程(親測(cè)有用永久激活)

    今天給大家分享一個(gè)?IDEA?2022.2.3?的激活破解教程,全文通過文字+圖片的方式講解,手把手教你如何激活破解?IDEA,?只需要幾分鐘即可搞定,對(duì)idea2022.2.3激活碼感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • Lombok不生效,提示java:?找不到符號(hào)的解決方案

    Lombok不生效,提示java:?找不到符號(hào)的解決方案

    這篇文章主要介紹了Lombok不生效,提示java:?找不到符號(hào)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評(píng)論