MyBatis實(shí)現(xiàn)分頁的兩種方式
在 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ì)比:
- 基于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)存溢出,性能下降。 - 基于數(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ù)庫廠商的語法可能有所不同。 - 基于插件的分頁:
○ 原理:MyBatis提供了插件機(jī)制,通過自定義插件來攔截SQL語句的執(zhí)行,并在查詢結(jié)果返回之前添加分頁邏輯。
○ 優(yōu)點(diǎn):插件封裝了分頁的具體實(shí)現(xiàn)細(xì)節(jié),使用起來簡單方便,適用于多種分頁需求。
○ 缺點(diǎn):可能需要一定的開發(fā)成本來編寫和維護(hù)插件。 - 數(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)文章希望大家以后多多支持腳本之家!
- Mybatis的分頁實(shí)現(xiàn)方式
- SpringBoot+Mybatis-plus實(shí)現(xiàn)分頁查詢的示例代碼
- mybatisplus 多表關(guān)聯(lián)條件分頁查詢的實(shí)現(xiàn)
- SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁的項(xiàng)目實(shí)踐
- MyBatis-Flex實(shí)現(xiàn)分頁查詢的示例代碼
- 使用MyBatis-Plus實(shí)現(xiàn)聯(lián)表查詢分頁的示例代碼
- MyBatis-Plus實(shí)現(xiàn)對(duì)查詢結(jié)果進(jìn)行分頁的基本步驟
- mybatis-plus分頁查詢的實(shí)現(xiàn)實(shí)例
- Springboot?Mybatis使用pageHelper如何實(shí)現(xiàn)分頁查詢
- SpringBoot中使用MyBatis-Plus實(shí)現(xiàn)分頁接口的詳細(xì)教程
相關(guān)文章
spring-boot-maven-plugin?配置有啥用
這篇文章主要介紹了spring-boot-maven-plugin?配置是干啥的,這個(gè)是SpringBoot的Maven插件,主要用來打包的,通常打包成jar或者war文件,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08解決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-01JAVA初級(jí)項(xiàng)目——實(shí)現(xiàn)圖書管理系統(tǒng)
這篇文章主要介紹了JAVA如何實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06IntelliJ?IDEA?2022.2.3最新激活圖文教程(親測(cè)有用永久激活)
今天給大家分享一個(gè)?IDEA?2022.2.3?的激活破解教程,全文通過文字+圖片的方式講解,手把手教你如何激活破解?IDEA,?只需要幾分鐘即可搞定,對(duì)idea2022.2.3激活碼感興趣的朋友跟隨小編一起看看吧2022-11-11Lombok不生效,提示java:?找不到符號(hào)的解決方案
這篇文章主要介紹了Lombok不生效,提示java:?找不到符號(hào)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07