MyBatis中使用分頁插件PageHelper實現(xiàn)分頁功能
一、前言
分頁是web應(yīng)用程序非常重要的一個技術(shù)。數(shù)據(jù)庫中的數(shù)據(jù)可能是成千上萬的,不可能把這么多的數(shù)據(jù)一次顯示在瀏覽器上面。一般根據(jù)每行數(shù)據(jù)在頁面上所占的空間每頁顯示若干行,比如一般20行是一個比較理想的顯示狀態(tài)。

對于MyBatis中分頁的操作其實是有兩種,一種是基于參數(shù)的改造, 還有一種是基于插件的攔截。
對于參數(shù)的改造,可以直接使用通過添加參數(shù)limit和offset就可以實現(xiàn)查詢從某個位置開始的若干記錄,代碼實現(xiàn)如下所示:
<select id="selectSomeData" parameterType="map" resultType="com.somedata">
SELECT * FROM sometable
ORDER BY somecolumn
LIMIT #{limit} OFFSET #{offset}
</select>這段 SQL 語句會返回從偏移量為 offset 的位置開始的limit條結(jié)果。例如:LIMIT 30,10 表示從第 31 行開始返回10行結(jié)果。
在實際應(yīng)用中,我們可以將limit和 offset 抽取成兩個參數(shù),并傳入到 MyBatis 中
這種方法在這里就不怎么介紹了,這里主要介紹的是通過基于插件攔截的方式解決分頁問題
二、基于插件攔截方式
1、自定義插件
我們可以通過插件的方式來實現(xiàn), 這種方式更加靈活,支持實現(xiàn)更為復(fù)雜的分頁功能。我們需要自定義一個攔截器,實現(xiàn)Interceptor接口,并重寫其中唯一的intercept方法,在其中對 SQL 語句進行修改,添加分頁信息。具體操作如下,首先自己定義一個攔截器
下面寫的全是偽代碼,不能直接運行的,這里只是為了引出pagehelper
public class PageInterceptor implements Interceptor {
/**
* 攔截方法 * * @param invocation * @return * @throws Throwable
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 獲取原始的SQL語句
String sql = (String) invocation.getArgs()[0];
// 查詢總數(shù)并計算出總頁數(shù)和當前頁
int total = count(sql);
// 如果總數(shù)小于等于0,則直接返回空結(jié)果集
if (total <= 0) {
return Collections.emptyList();
}
// 計算出當前頁的起始位置和結(jié)束位置
int offset = getOffset(pageNo, pageSize);
int limit = pageSize;
// 構(gòu)造含分頁信息的新SQL
String newSql = getNewSql(sql, offset, limit);
// 將新SQL替換成原來的SQL,并繼續(xù)執(zhí)行原有方法
ReflectionUtils.setFieldValue(invocation, "h.sql", newSql);
Object result = invocation.proceed();
// 包裝成Page對象,并返回
Page<T> pageResult = new Page<>(pageNo,pageSize,total,(List<T>)result);
return pageResult;
}
/**
* @author Jeff Fong
* @description 合成新的sql
* @date 2023/5/22 14:03
* @param: sql
* @param: offset
* @param: limit
* @return java.lang.String
**/
private String getNewSql(String sql, int offset, int limit) {
return sql + " LIMIT " + offset + "," + limit;
}
/**
* @author Jeff Fong
* @description 獲取總的條數(shù)
* @date 2023/5/22 14:03
* @param: sql
* @return int
**/
private int count(String sql){ // code omitted
return 1;
}
/**
* @author Jeff Fong
* @description 計算出當頁的offset
* @date 2023/5/22 14:02
* @param: pageNo
* @param: pageSize
* @return int
**/
private int getOffset(int pageNo, int pageSize) {
return (pageNo - 1) * pageSize;
}
}然后,我們需要在 mybatis-config.xml 配置文件中注冊該攔截器:
<plugins> <plugin interceptor="com.example.mybatis.PageInterceptor"/></plugins>
最后,在業(yè)務(wù)代碼中就可以直接使用
public List<User> selectUserListByPage(int startRow, int pageSize){
RowBounds rowBounds = new RowBounds(startRow,pageSize);
String statement = "com.example.UserMapper.selectUserList";
return sqlSession.selectList(statement,null,rowBounds);
}2、使用第三方插件完成分頁
這里使用的插件是PageHelper, 在https://pagehelper.github.io/docs/howtouse/有關(guān)于這個插件的介紹。
1、分頁插件的配置
(1)、添加依賴
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>(2)、配置分頁插件
在MyBatis的核心配置文件中配置插件
<plugins>
<!--設(shè)置分頁插件-->
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>一定要注意plugins分頁插件在mybatis-config.xml的位置,位置如果不對的話,是會直接報錯的。

2、分頁插件的使用
在需要分頁的數(shù)據(jù)之前使用PageHelper.startPage(int pageNum, int pageSize)開啟分頁功能
pageNum:當前頁的頁碼pageSize:每頁顯示的條數(shù)
在查詢獲取list集合之后,使用PageInfo pageInfo = new PageInfo<>(List list, int navigatePages)獲取分頁相關(guān)數(shù)據(jù)。
list:分頁之后的數(shù)據(jù)navigatePages:導(dǎo)航分頁的頁碼數(shù)
看看具體的代碼實現(xiàn),對于mapper中的接口比較簡單,這里就不一一的說明;
/**
* limit index,pagesize
* index 當前頁的起始索引
* pageSize 每頁顯示的條數(shù)
* pageNum 當前頁的頁碼
* 當前頁的起始索引 = 每頁條數(shù) * 頁碼 - 1
* index = pageNum * pageSize - 1
*
* 通過索引獲得數(shù)據(jù)
*
* 使用MyBatis的分頁插件,實現(xiàn)分頁功能:
* 1。需要在查詢功能之前開啟分頁
* PageHelper.startPage(2, 4);
*
* 2。在查詢功能之后獲取分頁相關(guān)信息
* PageInfo<Emp> pages = new PageInfo<>(emps, 5); 5表示導(dǎo)航分頁的數(shù)量
*/
@Test
public void test02() throws IOException {
SqlSession sqlSession = getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
System.out.println("\n查詢功能前啟用插件.....");
PageHelper.startPage(2, 4);
List<User> all = mapper.findAll();
all.forEach(System.out::println);
System.out.println("\n");
PageInfo<User> pages = new PageInfo<User>(all,);
System.out.println("-------->" + pages);
}實際上的所有數(shù)據(jù)

查詢第二頁的數(shù)據(jù),應(yīng)該是

最后來看看最終的返回的詳細數(shù)據(jù):

看到所需要的數(shù)據(jù),都在pageinfo對象中
首先來提一嘴

這里的navigatepages是什么東西?
就是相當于前端要顯示的下面導(dǎo)航欄的東西

這里的navigatepages = [1,2,3,4,5....., 11]
到此這篇關(guān)于MyBatis中使用分頁插件PageHelper實現(xiàn)分頁功能的文章就介紹到這了,更多相關(guān)MyBatis PageHelper分頁內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Maven依賴管理之parent與dependencyManagement深入分析
首先我們來說說parent標簽,其實這個不難解釋,就是父的意思,pom也有繼承的。比方說我現(xiàn)在有A,B,C,A是B,C的父級?,F(xiàn)在就是有一個情況B,C其實有很多jar都是共同的,其實是可以放在父項目里面,這樣,讓B,C都繼承A就方便管理了2022-10-10
JSch教程使用sftp協(xié)議實現(xiàn)服務(wù)器文件載操作
這篇文章主要為大家介紹了JSch如何使用sftp協(xié)議實現(xiàn)服務(wù)器文件上傳下載操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03
SpringBoot使用FreeMarker模板發(fā)送郵件
這篇文章主要為大家詳細介紹了SpringBoot使用FreeMarker模板發(fā)送郵件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04
oracle+mybatis-plus+springboot實現(xiàn)分頁查詢的實例
本文主要介紹了oracle+mybatis-plus+springboot實現(xiàn)分頁查詢,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
IDEA基于支付寶小程序搭建springboot項目的詳細步驟
這篇文章主要介紹了IDEA基于支付寶小程序搭建springboot項目的詳細步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04
在同一個類中調(diào)用帶有@Transactional注解的方法示例
這篇文章主要為大家介紹了在同一個類中調(diào)用帶有@Transactional注解的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04

