最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis中使用分頁插件PageHelper實現(xiàn)分頁功能

 更新時間:2023年06月12日 09:14:14   作者:fckey  
分頁是經(jīng)常使用的功能,本文主要介紹了Mybatis中處理特殊SQL處理邏輯,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、前言

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

對于MyBatis中分頁的操作其實是有兩種,一種是基于參數(shù)的改造, 還有一種是基于插件的攔截。

對于參數(shù)的改造,可以直接使用通過添加參數(shù)limitoffset就可以實現(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條結果。例如:LIMIT 30,10 表示從第 31 行開始返回10行結果。

在實際應用中,我們可以將limitoffset 抽取成兩個參數(shù),并傳入到 MyBatis
這種方法在這里就不怎么介紹了,這里主要介紹的是通過基于插件攔截的方式解決分頁問題

二、基于插件攔截方式

1、自定義插件

我們可以通過插件的方式來實現(xiàn), 這種方式更加靈活,支持實現(xiàn)更為復雜的分頁功能。我們需要自定義一個攔截器,實現(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,則直接返回空結果集
        if (total <= 0) {
            return Collections.emptyList();
        }
        // 計算出當前頁的起始位置和結束位置
        int offset = getOffset(pageNo, pageSize);
        int limit = pageSize;
        // 構造含分頁信息的新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è)務代碼中就可以直接使用

 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/有關于這個插件的介紹。

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>
<!--設置分頁插件-->
    <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)獲取分頁相關數(shù)據(jù)。

  • list:分頁之后的數(shù)據(jù)
  • navigatePages:導航分頁的頁碼數(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。在查詢功能之后獲取分頁相關信息
     *   PageInfo<Emp> pages = new PageInfo<>(emps, 5); 5表示導航分頁的數(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ù),應該是

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

看到所需要的數(shù)據(jù),都在pageinfo對象中

首先來提一嘴

這里的navigatepages是什么東西?

就是相當于前端要顯示的下面導航欄的東西

這里的navigatepages = [1,2,3,4,5....., 11]

到此這篇關于MyBatis中使用分頁插件PageHelper實現(xiàn)分頁功能的文章就介紹到這了,更多相關MyBatis PageHelper分頁內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java?executor包參數(shù)處理功能?

    java?executor包參數(shù)處理功能?

    這篇文章主要介紹了java?executor包參數(shù)處理功能,sql語句中的參數(shù)賦值是有由executor包中的parameter子包完成的。parameter子包其實只有一個parameterHandler接口并且它定義了兩個方法,下面我們就來看詳細內容吧,需要的朋友可以參考一下
    2022-02-02
  • Java利用ip2region實現(xiàn)獲取IP地址詳情

    Java利用ip2region實現(xiàn)獲取IP地址詳情

    ip2region是一個離線IP地址定位庫和IP定位數(shù)據(jù)管理框架,10微秒級別的查詢效率,提供了眾多主流編程語言的?xdb?數(shù)據(jù)生成和查詢客戶端實現(xiàn)。本文將利用ip2region實現(xiàn)獲取IP地址詳情,感興趣的可以了解一下
    2022-07-07
  • SpringBoot讀取properties文件配置項過程解析

    SpringBoot讀取properties文件配置項過程解析

    這篇文章主要介紹了SpringBoot讀取properties文件配置項過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • SpringMVC找不到Controller路徑的解決方案

    SpringMVC找不到Controller路徑的解決方案

    這篇文章主要介紹了SpringMVC找不到Controller路徑的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 使用redisTemplate從redis獲取所有數(shù)據(jù)

    使用redisTemplate從redis獲取所有數(shù)據(jù)

    這篇文章主要介紹了使用redisTemplate從redis獲取所有數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Spring?MVC請求轉發(fā)與請求重定向的示例詳解

    Spring?MVC請求轉發(fā)與請求重定向的示例詳解

    轉發(fā)指服務器接收請求后,從一個資源跳轉到另一個資源中,請求轉發(fā)是一次請求,不會改變?yōu)g覽器的請求地址,這篇文章主要介紹了Spring?MVC請求轉發(fā)與請求重定向的相關知識,需要的朋友可以參考下
    2023-09-09
  • JPA實現(xiàn)多表連接查詢過程

    JPA實現(xiàn)多表連接查詢過程

    這篇文章主要介紹了JPA實現(xiàn)多表連接查詢過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2026-06-06
  • Spring?Cloud微服務架構Sentinel數(shù)據(jù)雙向同步

    Spring?Cloud微服務架構Sentinel數(shù)據(jù)雙向同步

    這篇文章主要為大家介紹了Spring?Cloud微服務架構Sentinel數(shù)據(jù)雙向同步示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Java基礎精講方法的使用

    Java基礎精講方法的使用

    方法,也稱函數(shù),如果想要重復一段或者多段代碼塊的使用,可以將這些代碼封裝成一個方法,方法具體表現(xiàn)為某種行為,使用方法可以提高代碼的復用性
    2022-05-05
  • SpringBoot多數(shù)據(jù)源的兩種實現(xiàn)方式實例

    SpringBoot多數(shù)據(jù)源的兩種實現(xiàn)方式實例

    最近在項目開發(fā)中,需要為一個使用MySQL數(shù)據(jù)庫的SpringBoot項目,新添加一個PLSQL數(shù)據(jù)庫數(shù)據(jù)源,下面這篇文章主要給大家介紹了關于SpringBoot多數(shù)據(jù)源的兩種實現(xiàn)方式,需要的朋友可以參考下
    2022-04-04

最新評論

靖宇县| 托里县| 丘北县| 崇文区| 昭通市| 永丰县| 邵武市| 江口县| 博乐市| 兖州市| 进贤县| 泗水县| 当涂县| 荣成市| 瑞金市| 河津市| 酉阳| 锦州市| 黎城县| 察哈| 濉溪县| 陕西省| 蒙阴县| 阳高县| 会理县| 丰都县| 顺平县| 南澳县| 尉氏县| 浮梁县| 井研县| 漯河市| 乌拉特前旗| 高州市| 西乌珠穆沁旗| 亳州市| 托克逊县| 玉山县| 吉隆县| 许昌市| 丰顺县|