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

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

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

一、前言

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

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

對于參數(shù)的改造,可以直接使用通過添加參數(shù)limitoffset就可以實(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)用中,我們可以將limitoffset 抽取成兩個(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深入分析

    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-10
  • Java詳細(xì)講解堆排序與時(shí)間復(fù)雜度的概念

    Java詳細(xì)講解堆排序與時(shí)間復(fù)雜度的概念

    本文主要介紹了java實(shí)現(xiàn)堆排序以及時(shí)間復(fù)雜度,堆排序這種排序算法是我們經(jīng)常用到的,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • JSch教程使用sftp協(xié)議實(shí)現(xiàn)服務(wù)器文件載操作

    JSch教程使用sftp協(xié)議實(shí)現(xiàn)服務(wù)器文件載操作

    這篇文章主要為大家介紹了JSch如何使用sftp協(xié)議實(shí)現(xiàn)服務(wù)器文件上傳下載操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • springboot相關(guān)面試題匯總詳解

    springboot相關(guān)面試題匯總詳解

    這篇文章主要介紹了springboot相關(guān)面試題匯總詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • SpringBoot使用FreeMarker模板發(fā)送郵件

    SpringBoot使用FreeMarker模板發(fā)送郵件

    這篇文章主要為大家詳細(xì)介紹了SpringBoot使用FreeMarker模板發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • oracle+mybatis-plus+springboot實(shí)現(xiàn)分頁查詢的實(shí)例

    oracle+mybatis-plus+springboot實(shí)現(xiàn)分頁查詢的實(shí)例

    本文主要介紹了oracle+mybatis-plus+springboot實(shí)現(xiàn)分頁查詢,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • IDEA基于支付寶小程序搭建springboot項(xiàng)目的詳細(xì)步驟

    IDEA基于支付寶小程序搭建springboot項(xiàng)目的詳細(xì)步驟

    這篇文章主要介紹了IDEA基于支付寶小程序搭建springboot項(xiàng)目的詳細(xì)步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-04-04
  • tomcat部署java web項(xiàng)目遇到的問題及解決方法

    tomcat部署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注解的方法示例

    這篇文章主要為大家介紹了在同一個(gè)類中調(diào)用帶有@Transactional注解的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • selenium+java環(huán)境搭建過程推薦

    selenium+java環(huán)境搭建過程推薦

    這篇文章主要介紹了selenium+java環(huán)境搭建過程推薦,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10

最新評論