Mybatis分頁(yè)插件的使用流程

如果你也在用Mybatis,建議嘗試該分頁(yè)插件,這一定是最方便使用的分頁(yè)插件。該插件支持任何復(fù)雜的單表、多表分頁(yè)。

1.引入PageHelper的jar包

在pom.xml中添加如下依賴:

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>最新版本</version>
</dependency>

2.配置攔截器插件

1.在 MyBatis 配置 xml 中配置攔截器插件

Resource文件中mybatismybatis.xml配置文件中添加如下信息:

<!-- 
    plugins在配置文件中的位置必須符合要求,否則會(huì)報(bào)錯(cuò),順序如下:
    properties?, settings?, 
    typeAliases?, typeHandlers?, 
    objectFactory?,objectWrapperFactory?, 
    plugins?, 
    environments?, databaseIdProvider?, mappers?
-->
<plugins>
    <!-- com.github.pagehelper為PageHelper類所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- 使用下面的方式配置參數(shù),后面會(huì)有所有的參數(shù)介紹 -->
        <property name="helperDialect" value="mysql"/>
    </plugin>
</plugins>

2.分頁(yè)插件參數(shù)介紹

分頁(yè)插件提供了多個(gè)可選參數(shù),這些參數(shù)使用時(shí),按照上面兩種配置方式中的示例配置即可。

分頁(yè)插件可選參數(shù)如下:

  • dialect:默認(rèn)情況下會(huì)使用 PageHelper 方式進(jìn)行分頁(yè),如果想要實(shí)現(xiàn)自己的分頁(yè)邏輯,可以實(shí)現(xiàn) Dialect(com.github.pagehelper.Dialect) 接口,然后配置該屬性為實(shí)現(xiàn)類的全限定名稱。

下面幾個(gè)參數(shù)都是針對(duì)默認(rèn) dialect 情況下的參數(shù)。使用自定義 dialect 實(shí)現(xiàn)時(shí),下面的參數(shù)沒有任何作用。

  1. helperDialect:分頁(yè)插件會(huì)自動(dòng)檢測(cè)當(dāng)前的數(shù)據(jù)庫(kù)鏈接,自動(dòng)選擇合適的分頁(yè)方式。 你可以配置helperDialect屬性來指定分頁(yè)插件使用哪種方言。配置時(shí),可以使用下面的縮寫值:
    oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
    特別注意:使用 SqlServer2012 數(shù)據(jù)庫(kù)時(shí),需要手動(dòng)指定為 sqlserver2012,否則會(huì)使用 SqlServer2005 的方式進(jìn)行分頁(yè)。
    你也可以實(shí)現(xiàn) AbstractHelperDialect,然后配置該屬性為實(shí)現(xiàn)類的全限定名稱即可使用自定義的實(shí)現(xiàn)方法。
  2. offsetAsPageNum:默認(rèn)值為 false,該參數(shù)對(duì)使用 RowBounds 作為分頁(yè)參數(shù)時(shí)有效。 當(dāng)該參數(shù)設(shè)置為 true 時(shí),會(huì)將 RowBounds 中的 offset 參數(shù)當(dāng)成 pageNum 使用,可以用頁(yè)碼和頁(yè)面大小兩個(gè)參數(shù)進(jìn)行分頁(yè)。
  3. rowBoundsWithCount:默認(rèn)值為false,該參數(shù)對(duì)使用 RowBounds 作為分頁(yè)參數(shù)時(shí)有效。 當(dāng)該參數(shù)設(shè)置為true時(shí),使用 RowBounds 分頁(yè)會(huì)進(jìn)行 count 查詢。
  4. pageSizeZero:默認(rèn)值為 false,當(dāng)該參數(shù)設(shè)置為 true 時(shí),如果 pageSize=0 或者 RowBounds.limit = 0 就會(huì)查詢出全部的結(jié)果(相當(dāng)于沒有執(zhí)行分頁(yè)查詢,但是返回結(jié)果仍然是 Page 類型)。
  5. reasonable:分頁(yè)合理化參數(shù),默認(rèn)值為false。當(dāng)該參數(shù)設(shè)置為 true 時(shí),pageNum<=0 時(shí)會(huì)查詢第一頁(yè),pageNum>pages(超過總數(shù)時(shí)),會(huì)查詢最后一頁(yè)。默認(rèn)false 時(shí),直接根據(jù)參數(shù)進(jìn)行查詢。
  6. params:為了支持startPage(Object params)方法,增加了該參數(shù)來配置參數(shù)映射,用于從對(duì)象中根據(jù)屬性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認(rèn)值, 默認(rèn)值為pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
  7. supportMethodsArguments:支持通過 Mapper 接口參數(shù)來傳遞分頁(yè)參數(shù),默認(rèn)值false,分頁(yè)插件會(huì)從查詢方法的參數(shù)值中,自動(dòng)根據(jù)上面 params 配置的字段中取值,查找到合適的值時(shí)就會(huì)自動(dòng)分頁(yè)。 使用方法可以參考測(cè)試代碼中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTestArgumentsObjTest。
  8. autoRuntimeDialect:默認(rèn)值為 false。設(shè)置為 true 時(shí),允許在運(yùn)行時(shí)根據(jù)多數(shù)據(jù)源自動(dòng)識(shí)別對(duì)應(yīng)方言的分頁(yè) (不支持自動(dòng)選擇sqlserver2012,只能使用sqlserver),用法和注意事項(xiàng)參考下面的場(chǎng)景五。
  9. closeConn:默認(rèn)值為 true。當(dāng)使用運(yùn)行時(shí)動(dòng)態(tài)數(shù)據(jù)源或沒有設(shè)置 helperDialect 屬性自動(dòng)獲取數(shù)據(jù)庫(kù)類型時(shí),會(huì)自動(dòng)獲取一個(gè)數(shù)據(jù)庫(kù)連接, 通過該屬性來設(shè)置是否關(guān)閉獲取的這個(gè)連接,默認(rèn)true關(guān)閉,設(shè)置為 false 后,不會(huì)關(guān)閉獲取的連接,這個(gè)參數(shù)的設(shè)置要根據(jù)自己選擇的數(shù)據(jù)源來決定。

重要提示:

當(dāng) offsetAsPageNum=false 的時(shí)候,由于 PageNum 問題,RowBounds查詢的時(shí)候 reasonable 會(huì)強(qiáng)制為 false。使用 PageHelper.startPage 方法不受影響。

3.如何在代碼中使用(調(diào)用分頁(yè)插件)

3.1Controller層

   @RequestMapping(value = "/test", method = RequestMethod.POST)
    public void test(HttpServletRequest req, HttpServletResponse resp) throws IOException, SQLException {
        resp.setContentType("text/html;charset=UTF-8");
        String parameter = new String(StreamResolve.InputStreamTOByte(req.getInputStream()), "UTF-8");
        parameter = URLDecoder.decode(parameter, "utf-8");
        Environment environment = (Environment) JsonUtils.getInstance().jsonStr2Object(parameter, Environment.class);
            //開始分頁(yè)
            PageHelper.startPage(environment.getPage(),environment.getPageSize());
            List<Environment> allInfo = environmentService.getAllInfo();
            PageInfo<Environment> pageInfo = new PageInfo<Environment>(allInfo);
            resp.getWriter().print(CommonLogic.jsonAssembly(Constant.SUCCESS_CODE, "SUCCESS", pageInfo));
        }

    }

3.2Service層

public  List<Environment> getAllInfo() {
       logger.info("API-getAllInfo-Service");
      return environmentMapper.getAllInfo();
    }

3.3編寫一個(gè)mapper.xml文件

直接使用工程中的一個(gè)栗子,一個(gè)簡(jiǎn)單的查詢。

<select id="getAllInfo" parameterType="Environment"
            resultMap="BaseResultMap">
      SELECT *
      FROM t_module, t_company
      WHERE t_module.company_sid = t_company.company_sid
</select>

對(duì)應(yīng)的Mapper.java中接口如下:

List<Environment> getAllInfo();

3.4PageInfo類

    private int pageNum;    //當(dāng)前頁(yè)
    private int pageSize;   //每頁(yè)的數(shù)量
    private int size;       //當(dāng)前頁(yè)的數(shù)量
    private int startRow;   //當(dāng)前頁(yè)面第一個(gè)元素在數(shù)據(jù)庫(kù)中的行號(hào)
    private int endRow;     //當(dāng)前頁(yè)面最后一個(gè)元素在數(shù)據(jù)庫(kù)中的行號(hào)
    private int pages;      //總頁(yè)數(shù)
    private int prePage;    //前面的頁(yè)數(shù)
    private int nextPage;   //后面的頁(yè)數(shù)
    private boolean isFirstPage;    //是否為第一頁(yè)
    private boolean isLastPage;     //是否為最后一頁(yè)
    private boolean hasPreviousPage;    //是否有前一頁(yè)
    private boolean hasNextPage;        //是否有后一頁(yè)
    private int navigatePages;      
    private int[] navigatepageNums;     //頁(yè)數(shù)導(dǎo)航
    private int navigateFirstPage;
    private int navigateLastPage;

參考資料

https://pagehelper.github.io/

https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

https://blog.csdn.net/qq_33624284/article/details/72828977

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文部分內(nèi)容摘選自PageHelper GitHub,可按照文中步驟進(jìn)行插件快速集成 一、Maven配置 <val...
    蔓越莓餅干閱讀 3,349評(píng)論 0 2
  • 在Mybatis配置xml中配置攔截器插件: 這里的com.github.pagehelper.PageHelpe...
    bboymonk閱讀 3,580評(píng)論 6 2
  • 先初步了解mybatis的原理圖: 從圖中可以看出,mybatis中首先要在配置文件中配置一些東西,然后根據(jù)這些配...
    彷徨是你吧閱讀 980評(píng)論 0 1
  • 書整體分為三部分《夏之過往》,《夏之流年》,《夏之未至》。整本書講的是男主人公顧艾哲(小艾)與莫晨(晨晨)之...
    thinkgamer閱讀 412評(píng)論 0 0
  • 遙遠(yuǎn)的沉睡被喚醒 奔向那有著夢(mèng)的遠(yuǎn)方 去追尋 去尋找 遠(yuǎn)方是夢(mèng) 遠(yuǎn)方有家 寂靜迷離了雙眼 仰望那無墾的荒蕪 夢(mèng)...
    思倆閱讀 196評(píng)論 0 0

友情鏈接更多精彩內(nèi)容