Mybatis分頁插件的使用流程

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

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

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

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

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

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

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

  1. helperDialect:分頁插件會自動檢測當(dāng)前的數(shù)據(jù)庫鏈接赞厕,自動選擇合適的分頁方式。 你可以配置helperDialect屬性來指定分頁插件使用哪種方言定硝。配置時皿桑,可以使用下面的縮寫值:
    oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
    特別注意:使用 SqlServer2012 數(shù)據(jù)庫時,需要手動指定為 sqlserver2012蔬啡,否則會使用 SqlServer2005 的方式進(jìn)行分頁诲侮。
    你也可以實現(xiàn) AbstractHelperDialect,然后配置該屬性為實現(xiàn)類的全限定名稱即可使用自定義的實現(xiàn)方法箱蟆。
  2. offsetAsPageNum:默認(rèn)值為 false沟绪,該參數(shù)對使用 RowBounds 作為分頁參數(shù)時有效。 當(dāng)該參數(shù)設(shè)置為 true 時空猜,會將 RowBounds 中的 offset 參數(shù)當(dāng)成 pageNum 使用绽慈,可以用頁碼和頁面大小兩個參數(shù)進(jìn)行分頁。
  3. rowBoundsWithCount:默認(rèn)值為false辈毯,該參數(shù)對使用 RowBounds 作為分頁參數(shù)時有效坝疼。 當(dāng)該參數(shù)設(shè)置為true時,使用 RowBounds 分頁會進(jìn)行 count 查詢谆沃。
  4. pageSizeZero:默認(rèn)值為 false钝凶,當(dāng)該參數(shù)設(shè)置為 true 時,如果 pageSize=0 或者 RowBounds.limit = 0 就會查詢出全部的結(jié)果(相當(dāng)于沒有執(zhí)行分頁查詢唁影,但是返回結(jié)果仍然是 Page 類型)耕陷。
  5. reasonable:分頁合理化參數(shù),默認(rèn)值為false据沈。當(dāng)該參數(shù)設(shè)置為 true 時啃炸,pageNum<=0 時會查詢第一頁,pageNum>pages(超過總數(shù)時)卓舵,會查詢最后一頁南用。默認(rèn)false 時,直接根據(jù)參數(shù)進(jìn)行查詢掏湾。
  6. params:為了支持startPage(Object params)方法裹虫,增加了該參數(shù)來配置參數(shù)映射,用于從對象中根據(jù)屬性名取值融击, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable筑公,不配置映射的用默認(rèn)值, 默認(rèn)值為pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero尊浪。
  7. supportMethodsArguments:支持通過 Mapper 接口參數(shù)來傳遞分頁參數(shù)匣屡,默認(rèn)值false封救,分頁插件會從查詢方法的參數(shù)值中,自動根據(jù)上面 params 配置的字段中取值捣作,查找到合適的值時就會自動分頁誉结。 使用方法可以參考測試代碼中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTestArgumentsObjTest
  8. autoRuntimeDialect:默認(rèn)值為 false券躁。設(shè)置為 true 時惩坑,允許在運行時根據(jù)多數(shù)據(jù)源自動識別對應(yīng)方言的分頁 (不支持自動選擇sqlserver2012,只能使用sqlserver)也拜,用法和注意事項參考下面的場景五以舒。
  9. closeConn:默認(rèn)值為 true。當(dāng)使用運行時動態(tài)數(shù)據(jù)源或沒有設(shè)置 helperDialect 屬性自動獲取數(shù)據(jù)庫類型時慢哈,會自動獲取一個數(shù)據(jù)庫連接蔓钟, 通過該屬性來設(shè)置是否關(guān)閉獲取的這個連接,默認(rèn)true關(guān)閉卵贱,設(shè)置為 false 后奋刽,不會關(guān)閉獲取的連接,這個參數(shù)的設(shè)置要根據(jù)自己選擇的數(shù)據(jù)源來決定艰赞。

重要提示:

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

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

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);
            //開始分頁
            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編寫一個mapper.xml文件

直接使用工程中的一個栗子,一個簡單的查詢党觅。

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

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

List<Environment> getAllInfo();

3.4PageInfo類

    private int pageNum;    //當(dāng)前頁
    private int pageSize;   //每頁的數(shù)量
    private int size;       //當(dāng)前頁的數(shù)量
    private int startRow;   //當(dāng)前頁面第一個元素在數(shù)據(jù)庫中的行號
    private int endRow;     //當(dāng)前頁面最后一個元素在數(shù)據(jù)庫中的行號
    private int pages;      //總頁數(shù)
    private int prePage;    //前面的頁數(shù)
    private int nextPage;   //后面的頁數(shù)
    private boolean isFirstPage;    //是否為第一頁
    private boolean isLastPage;     //是否為最后一頁
    private boolean hasPreviousPage;    //是否有前一頁
    private boolean hasNextPage;        //是否有后一頁
    private int navigatePages;      
    private int[] navigatepageNums;     //頁數(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)容合作請聯(lián)系作者
  • 序言:七十年代末雌澄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子杯瞻,更是在濱河造成了極大的恐慌镐牺,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魁莉,死亡現(xiàn)場離奇詭異睬涧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)旗唁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門畦浓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人检疫,你說我怎么就攤上這事讶请。” “怎么了屎媳?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵夺溢,是天一觀的道長论巍。 經(jīng)常有香客問我,道長风响,這世上最難降的妖魔是什么嘉汰? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮钞诡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘湃崩。我一直安慰自己荧降,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布攒读。 她就那樣靜靜地躺著朵诫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪薄扁。 梳的紋絲不亂的頭發(fā)上剪返,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機(jī)與錄音邓梅,去河邊找鬼脱盲。 笑死,一個胖子當(dāng)著我的面吹牛日缨,可吹牛的內(nèi)容都是我干的钱反。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼匣距,長吁一口氣:“原來是場噩夢啊……” “哼面哥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起毅待,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤尚卫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后尸红,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吱涉,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年外里,在試婚紗的時候發(fā)現(xiàn)自己被綠了邑飒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡级乐,死狀恐怖疙咸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情风科,我是刑警寧澤撒轮,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布乞旦,位于F島的核電站,受9級特大地震影響题山,放射性物質(zhì)發(fā)生泄漏兰粉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一顶瞳、第九天 我趴在偏房一處隱蔽的房頂上張望玖姑。 院中可真熱鬧,春花似錦慨菱、人聲如沸焰络。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闪彼。三九已至,卻和暖如春协饲,著一層夾襖步出監(jiān)牢的瞬間畏腕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工茉稠, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留描馅,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓而线,卻偏偏與公主長得像流昏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吞获,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

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