MyBatis中使用分頁插件PageHelper實(shí)現(xiàn)分頁功能
一、前言
分頁是web
應(yīng)用程序非常重要的一個(gè)技術(shù)。數(shù)據(jù)庫中的數(shù)據(jù)可能是成千上萬的,不可能把這么多的數(shù)據(jù)一次顯示在瀏覽器上面。一般根據(jù)每行數(shù)據(jù)在頁面上所占的空間每頁顯示若干行,比如一般20
行是一個(gè)比較理想的顯示狀態(tài)。
對于MyBatis中分頁的操作其實(shí)是有兩種,一種是基于參數(shù)的改造, 還有一種是基于插件的攔截。
對于參數(shù)的改造,可以直接使用通過添加參數(shù)limit
和offset
就可以實(shí)現(xiàn)查詢從某個(gè)位置開始的若干記錄,代碼實(shí)現(xiàn)如下所示:
<select id="selectSomeData" parameterType="map" resultType="com.somedata"> SELECT * FROM sometable ORDER BY somecolumn LIMIT #{limit} OFFSET #{offset} </select>
這段 SQL
語句會(huì)返回從偏移量為 offset
的位置開始的limit
條結(jié)果。例如:LIMIT 30,10
表示從第 31
行開始返回10
行結(jié)果。
在實(shí)際應(yīng)用中,我們可以將limit
和 offset
抽取成兩個(gè)參數(shù),并傳入到 MyBatis
中
這種方法在這里就不怎么介紹了,這里主要介紹的是通過基于插件攔截的方式解決分頁問題
二、基于插件攔截方式
1、自定義插件
我們可以通過插件的方式來實(shí)現(xiàn), 這種方式更加靈活,支持實(shí)現(xiàn)更為復(fù)雜的分頁功能。我們需要自定義一個(gè)攔截器,實(shí)現(xiàn)Interceptor
接口,并重寫其中唯一的intercept
方法,在其中對 SQL
語句進(jìn)行修改,添加分頁信息。具體操作如下,首先自己定義一個(gè)攔截器
下面寫的全是偽代碼,不能直接運(yùn)行的,這里只是為了引出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ù)并計(jì)算出總頁數(shù)和當(dāng)前頁 int total = count(sql); // 如果總數(shù)小于等于0,則直接返回空結(jié)果集 if (total <= 0) { return Collections.emptyList(); } // 計(jì)算出當(dāng)前頁的起始位置和結(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 計(jì)算出當(dāng)頁的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)于這個(gè)插件的介紹。
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
的位置,位置如果不對的話,是會(huì)直接報(bào)錯(cuò)的。
2、分頁插件的使用
在需要分頁的數(shù)據(jù)之前使用PageHelper.startPage(int pageNum, int pageSize)
開啟分頁功能
pageNum
:當(dāng)前頁的頁碼pageSize
:每頁顯示的條數(shù)
在查詢獲取list
集合之后,使用PageInfo pageInfo = new PageInfo<>(List list, int navigatePages)
獲取分頁相關(guān)數(shù)據(jù)。
list
:分頁之后的數(shù)據(jù)navigatePages
:導(dǎo)航分頁的頁碼數(shù)
看看具體的代碼實(shí)現(xiàn),對于mapper
中的接口比較簡單,這里就不一一的說明;
/** * limit index,pagesize * index 當(dāng)前頁的起始索引 * pageSize 每頁顯示的條數(shù) * pageNum 當(dāng)前頁的頁碼 * 當(dāng)前頁的起始索引 = 每頁條數(shù) * 頁碼 - 1 * index = pageNum * pageSize - 1 * * 通過索引獲得數(shù)據(jù) * * 使用MyBatis的分頁插件,實(shí)現(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í)際上的所有數(shù)據(jù)
查詢第二頁的數(shù)據(jù),應(yīng)該是
最后來看看最終的返回的詳細(xì)數(shù)據(jù):
看到所需要的數(shù)據(jù),都在pageinfo
對象中
首先來提一嘴
這里的navigatepages
是什么東西?
就是相當(dāng)于前端要顯示的下面導(dǎo)航欄的東西
這里的navigatepages = [1,2,3,4,5....., 11]
到此這篇關(guān)于MyBatis中使用分頁插件PageHelper實(shí)現(xiàn)分頁功能的文章就介紹到這了,更多相關(guān)MyBatis PageHelper分頁內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Maven依賴管理之parent與dependencyManagement深入分析
首先我們來說說parent標(biāo)簽,其實(shí)這個(gè)不難解釋,就是父的意思,pom也有繼承的。比方說我現(xiàn)在有A,B,C,A是B,C的父級(jí)。現(xiàn)在就是有一個(gè)情況B,C其實(shí)有很多jar都是共同的,其實(shí)是可以放在父項(xiàng)目里面,這樣,讓B,C都繼承A就方便管理了2022-10-10Java詳細(xì)講解堆排序與時(shí)間復(fù)雜度的概念
本文主要介紹了java實(shí)現(xiàn)堆排序以及時(shí)間復(fù)雜度,堆排序這種排序算法是我們經(jīng)常用到的,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04JSch教程使用sftp協(xié)議實(shí)現(xiàn)服務(wù)器文件載操作
這篇文章主要為大家介紹了JSch如何使用sftp協(xié)議實(shí)現(xiàn)服務(wù)器文件上傳下載操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03SpringBoot使用FreeMarker模板發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了SpringBoot使用FreeMarker模板發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04oracle+mybatis-plus+springboot實(shí)現(xiàn)分頁查詢的實(shí)例
本文主要介紹了oracle+mybatis-plus+springboot實(shí)現(xiàn)分頁查詢,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08IDEA基于支付寶小程序搭建springboot項(xiàng)目的詳細(xì)步驟
這篇文章主要介紹了IDEA基于支付寶小程序搭建springboot項(xiàng)目的詳細(xì)步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04tomcat部署java web項(xiàng)目遇到的問題及解決方法
這篇文章主要介紹了tomcat部署java web項(xiàng)目遇到的問題及解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07在同一個(gè)類中調(diào)用帶有@Transactional注解的方法示例
這篇文章主要為大家介紹了在同一個(gè)類中調(diào)用帶有@Transactional注解的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04