# Mybatis分頁(yè)插件-PageHepler的使用

Mybatis分頁(yè)插件-PageHepler的使用

使用方法

1. 引入分頁(yè)插件

引入分頁(yè)插件一共有下面2種方式直秆,推薦使用Maven方式贱勃,這種方式方便更新呻粹。

1). 引入Jar包

如果你想使用本項(xiàng)目的jar包而不是直接引入類(lèi)喷屋,你可以在這里下載各個(gè)版本的jar包(點(diǎn)擊Download下的jar即可下載)

由于使用了sql解析工具杠茬,你還需要下載jsqlparser.jar(這個(gè)文件完全獨(dú)立月褥,不依賴(lài)其他):

2). 使用maven

添加如下依賴(lài):

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>3.6.4</version>
</dependency>

當(dāng)使用maven中央庫(kù)中的快照版(帶"-SNAPSHOT"的版本)時(shí)弛随,需要在pom.xml中添加如下配置:

<repositories>
    <repository>
          <id>sonatype-nexus-snapshots</id>
          <name>Sonatype Nexus Snapshots</name>
          <url>http://oss.sonatype.org/content/repositories/snapshots</url>
          <releases>
                <enabled>false</enabled>
          </releases>
          <snapshots>
                <enabled>true</enabled>
          </snapshots>
    </repository>
</repositories>

2. 在Mybatis配置xml中配置攔截器插件:

<!-- 
    plugins在配置文件中的位置必須符合要求,否則會(huì)報(bào)錯(cuò)宁赤,順序如下:
    properties?, settings?, 
    typeAliases?, typeHandlers?, 
    objectFactory?,objectWrapperFactory?, 
    plugins?, 
    environments?, databaseIdProvider?, mappers?
-->
<plugins>
    <!-- com.github.pagehelper為PageHelper類(lèi)所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageHelper">
        <property name="dialect" value="mysql"/>
        <!-- 該參數(shù)默認(rèn)為false -->
        <!-- 設(shè)置為true時(shí)舀透,會(huì)將RowBounds第一個(gè)參數(shù)offset當(dāng)成pageNum頁(yè)碼使用 -->
        <!-- 和startPage中的pageNum效果一樣-->
        <property name="offsetAsPageNum" value="true"/>
        <!-- 該參數(shù)默認(rèn)為false -->
        <!-- 設(shè)置為true時(shí),使用RowBounds分頁(yè)會(huì)進(jìn)行count查詢(xún) -->
        <property name="rowBoundsWithCount" value="true"/>
        <!-- 設(shè)置為true時(shí)决左,如果pageSize=0或者RowBounds.limit = 0就會(huì)查詢(xún)出全部的結(jié)果 -->
        <!-- (相當(dāng)于沒(méi)有執(zhí)行分頁(yè)查詢(xún)愕够,但是返回結(jié)果仍然是Page類(lèi)型)-->
        <property name="pageSizeZero" value="true"/>
        <!-- 3.3.0版本可用 - 分頁(yè)參數(shù)合理化,默認(rèn)false禁用 -->
        <!-- 啟用合理化時(shí)佛猛,如果pageNum<1會(huì)查詢(xún)第一頁(yè)惑芭,如果pageNum>pages會(huì)查詢(xún)最后一頁(yè) -->
        <!-- 禁用合理化時(shí),如果pageNum<1或pageNum>pages會(huì)返回空數(shù)據(jù) -->
        <property name="reasonable" value="true"/>
        <!-- 3.5.0版本可用 - 為了支持startPage(Object params)方法 -->
        <!-- 增加了一個(gè)`params`參數(shù)來(lái)配置參數(shù)映射继找,用于從Map或ServletRequest中取值 -->
        <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認(rèn)值 -->
        <!-- 不理解該含義的前提下遂跟,不要隨便復(fù)制該配置 -->
        <property name="params" value="pageNum=start;pageSize=limit;"/>
    </plugin>
</plugins>

這里的com.github.pagehelper.PageHelper使用完整的類(lèi)路徑。

其他五個(gè)參數(shù)說(shuō)明:

  1. 增加dialect屬性婴渡,使用時(shí)必須指定該屬性幻锁,可選值為oracle,mysql,mariadb,sqlite,hsqldb,postgresql,sqlserver,沒(méi)有默認(rèn)值,必須指定該屬性边臼。

  2. 增加offsetAsPageNum屬性越败,默認(rèn)值為false,使用默認(rèn)值時(shí)不需要增加該配置硼瓣,需要設(shè)為true時(shí),需要配置該參數(shù)置谦。當(dāng)該參數(shù)設(shè)置為true時(shí)堂鲤,使用RowBounds分頁(yè)時(shí),會(huì)將offset參數(shù)當(dāng)成pageNum使用媒峡,可以用頁(yè)碼和頁(yè)面大小兩個(gè)參數(shù)進(jìn)行分頁(yè)瘟栖。

  3. 增加rowBoundsWithCount屬性,默認(rèn)值為false谅阿,使用默認(rèn)值時(shí)不需要增加該配置半哟,需要設(shè)為true時(shí),需要配置該參數(shù)签餐。當(dāng)該參數(shù)設(shè)置為true時(shí)寓涨,使用RowBounds分頁(yè)會(huì)進(jìn)行count查詢(xún)。

  4. 增加pageSizeZero屬性氯檐,默認(rèn)值為false戒良,使用默認(rèn)值時(shí)不需要增加該配置,需要設(shè)為true時(shí)冠摄,需要配置該參數(shù)糯崎。當(dāng)該參數(shù)設(shè)置為true時(shí)几缭,如果pageSize=0或者RowBounds.limit = 0就會(huì)查詢(xún)出全部的結(jié)果(相當(dāng)于沒(méi)有執(zhí)行分頁(yè)查詢(xún),但是返回結(jié)果仍然是Page類(lèi)型)沃呢。

  5. 增加reasonable屬性年栓,默認(rèn)值為false,使用默認(rèn)值時(shí)不需要增加該配置薄霜,需要設(shè)為true時(shí)某抓,需要配置該參數(shù)。具體作用請(qǐng)看上面配置文件中的注釋內(nèi)容黄锤。

  6. 為了支持startPage(Object params)方法搪缨,增加了一個(gè)params參數(shù)來(lái)配置參數(shù)映射,用于從Map或ServletRequest中取值鸵熟,可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認(rèn)值副编。

重要提示:

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

另外使用RowBounds在這種情況下返回的Page對(duì)象由于沒(méi)有正確的pageNum屬性打月,所以也不能使用PageInfo處理队腐。

如果你不理解為什么,可以看這樣一個(gè)例子:查詢(xún)offset=7,limit=10奏篙,這個(gè)時(shí)候pageNum=?柴淘,這種情況沒(méi)法計(jì)算pageNum,沒(méi)法判斷當(dāng)前是第幾頁(yè)秘通。

3. 如何選擇配置這些參數(shù)

單獨(dú)看每個(gè)參數(shù)的說(shuō)明可能是一件讓人不爽的事情为严,這里列舉一些可能會(huì)用到某些參數(shù)的情況。

首先dialect屬性是必須的肺稀,不需要解釋第股。其他的參數(shù)一般情況下我們都不必去管,如果想了解何時(shí)使用合適话原,你可以參考以下場(chǎng)景:

場(chǎng)景一

如果你仍然在用類(lèi)似ibatis式的命名空間調(diào)用方式夕吻,你也許會(huì)用到rowBoundsWithCount,分頁(yè)插件對(duì)RowBounds支持和Mybatis默認(rèn)的方式是一致繁仁,默認(rèn)情況下不會(huì)進(jìn)行count查詢(xún)涉馅,如果你想在分頁(yè)查詢(xún)時(shí)進(jìn)行count查詢(xún),以及使用更強(qiáng)大的PageInfo類(lèi)黄虱,你需要設(shè)置該參數(shù)為true控漠。

場(chǎng)景二

如果你仍然在用類(lèi)似ibatis式的命名空間調(diào)用方式,你覺(jué)得RowBounds中的兩個(gè)參數(shù)offset,limit不如pageNum,pageSize容易理解,你可以使用offsetAsPageNum參數(shù)盐捷,將該參數(shù)設(shè)置為true后偶翅,offset會(huì)當(dāng)成pageNum使用,limitpageSize含義相同碉渡。

場(chǎng)景三

如果覺(jué)得某個(gè)地方使用分頁(yè)后聚谁,你仍然想通過(guò)控制參數(shù)查詢(xún)?nèi)康慕Y(jié)果,你可以配置pageSizeZerotrue滞诺,配置后形导,如可以通過(guò)設(shè)置pageSize=0或者RowBounds.limit = 0就會(huì)查詢(xún)出全部的結(jié)果。

場(chǎng)景四

如果你分頁(yè)插件使用于類(lèi)似分頁(yè)查看列表式的數(shù)據(jù)习霹,如新聞列表朵耕,軟件列表,你希望用戶(hù)輸入的頁(yè)數(shù)不在合法范圍(第一頁(yè)到最后一頁(yè)之外)時(shí)能夠正確的響應(yīng)到正確的結(jié)果頁(yè)面淋叶,那么你可以配置reasonabletrue阎曹,這時(shí)如果pageNum<1會(huì)查詢(xún)第一頁(yè),如果pageNum>總頁(yè)數(shù)會(huì)查詢(xún)最后一頁(yè)煞檩。

4. Spring配置方法

首先需要在Spring中配置org.mybatis.spring.SqlSessionFactoryBean处嫌。然后配置配置Mybatis的具體配置有兩種方式,一種是用mybatis默認(rèn)的xml配置斟湃,另一種就是完全使用spring的屬性配置方式熏迹。

1.mybatis默認(rèn)的xml配置

配置configLocation屬性指向上面的mybatis-config.xml文件。有關(guān)分頁(yè)插件的配置都在mybatis-config.xml凝赛,具體配置內(nèi)容參考上面的mybatis-config.xml注暗。

2.使用spring的屬性配置方式

注意:請(qǐng)不用同時(shí)使用spring配置方式和mybatis-config.xml配置方式,只需要選擇其中一個(gè)就行墓猎。配置多個(gè)分頁(yè)插件時(shí)友存,會(huì)拋出異常提示。

分頁(yè)插件配置錯(cuò)誤:請(qǐng)不要在系統(tǒng)中配置多個(gè)分頁(yè)插件(使用Spring時(shí),mybatis-config.xml和Spring配置方式陶衅,請(qǐng)選擇其中一種,不要同時(shí)配置多個(gè)分頁(yè)插件)直晨!

使用spring的屬性配置方式搀军,可以使用plugins屬性像下面這樣配置:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource"/>
  <property name="mapperLocations">
    <array>
      <value>classpath:mapper/*.xml</value>
    </array>
  </property>
  <property name="typeAliasesPackage" value="com.isea533.ssm.model"/>
  <property name="plugins">
    <array>
      <bean class="com.github.pagehelper.PageHelper">
        <property name="properties">
          <value>
            dialect=hsqldb
            reasonable=true
          </value>
        </property>
      </bean>
    </array>
  </property>
</bean>

屬性配置按照上面的方式配置,每個(gè)配置獨(dú)立一行即可勇皇。

5. 如何在代碼中使用

閱讀前后請(qǐng)注意看重要提示

首先該分頁(yè)插件支持以下兩種調(diào)用方式:

//第一種罩句,RowBounds方式的調(diào)用
List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(1, 10));

//第二種,Mapper接口方式的調(diào)用敛摘,推薦這種使用方式门烂。
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectIf(1);

下面分別對(duì)這兩種方式進(jìn)行詳細(xì)介紹

1). RowBounds方式的調(diào)用

List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(1, 10));

使用這種調(diào)用方式時(shí),你可以使用RowBounds參數(shù)進(jìn)行分頁(yè),這種方式侵入性最小屯远,我們可以看到蔓姚,通過(guò)RowBounds方式調(diào)用只是使用了這個(gè)參數(shù),并沒(méi)有增加其他任何內(nèi)容慨丐。

分頁(yè)插件檢測(cè)到使用了RowBounds參數(shù)時(shí)坡脐,就會(huì)對(duì)該查詢(xún)進(jìn)行物理分頁(yè)。

關(guān)于這種方式的調(diào)用房揭,有兩個(gè)特殊的參數(shù)是針對(duì)RowBounds的备闲,你可以參看上面的場(chǎng)景一場(chǎng)景二

注:不只有命名空間方式可以用RowBounds,使用接口的時(shí)候也可以增加RowBounds參數(shù)捅暴,例如:

//這種情況下也會(huì)進(jìn)行物理分頁(yè)查詢(xún)
List<Country> selectAll(RowBounds rowBounds);  

2). PageHelper.startPage靜態(tài)方法調(diào)用

在你需要進(jìn)行分頁(yè)的Mybatis方法前調(diào)用PageHelper.startPage靜態(tài)方法即可恬砂,緊跟在這個(gè)方法后的第一個(gè)Mybatis查詢(xún)方法會(huì)被進(jìn)行分頁(yè)。

例一:
SqlSession sqlSession = MybatisHelper.getSqlSession();
CountryMapper countryMapper = sqlSession.getMapper(CountryMapper.class);
try {
    //獲取第1頁(yè)蓬痒,10條內(nèi)容泻骤,默認(rèn)查詢(xún)總數(shù)count
    PageHelper.startPage(1, 10);

    //緊跟著的第一個(gè)select方法會(huì)被分頁(yè)
    List<Country> list = countryMapper.selectIf(1);
    assertEquals(2, list.get(0).getId());
    assertEquals(10, list.size());
    //分頁(yè)時(shí),實(shí)際返回的結(jié)果list類(lèi)型是Page<E>乳幸,如果想取出分頁(yè)信息瞪讼,需要強(qiáng)制轉(zhuǎn)換為Page<E>,
    //或者使用PageInfo類(lèi)(下面的例子有介紹)
    assertEquals(182, ((Page) list).getTotal());
} finally {
    sqlSession.close();
}
例二:
SqlSession sqlSession = MybatisHelper.getSqlSession();
CountryMapper countryMapper = sqlSession.getMapper(CountryMapper.class);
try {
    //獲取第1頁(yè)粹断,10條內(nèi)容符欠,默認(rèn)查詢(xún)總數(shù)count
    PageHelper.startPage(1, 10);

    //緊跟著的第一個(gè)select方法會(huì)被分頁(yè)
    List<Country> list = countryMapper.selectIf(1);

    //后面的不會(huì)被分頁(yè),除非再次調(diào)用PageHelper.startPage
    List<Country> list2 = countryMapper.selectIf(null);
    //list1
    assertEquals(2, list.get(0).getId());
    assertEquals(10, list.size());
    //分頁(yè)時(shí)瓶埋,實(shí)際返回的結(jié)果list類(lèi)型是Page<E>希柿,如果想取出分頁(yè)信息,需要強(qiáng)制轉(zhuǎn)換為Page<E>养筒,
    //或者使用PageInfo類(lèi)(下面的例子有介紹)
    assertEquals(182, ((Page) list).getTotal());
    //list2
    assertEquals(1, list2.get(0).getId());
    assertEquals(182, list2.size());
} finally {
    sqlSession.close();
}
例三曾撤,使用PageInfo的用法:
//獲取第1頁(yè),10條內(nèi)容晕粪,默認(rèn)查詢(xún)總數(shù)count
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectAll();
//用PageInfo對(duì)結(jié)果進(jìn)行包裝
PageInfo page = new PageInfo(list);
//測(cè)試PageInfo全部屬性
//PageInfo包含了非常全面的分頁(yè)屬性
assertEquals(1, page.getPageNum());
assertEquals(10, page.getPageSize());
assertEquals(1, page.getStartRow());
assertEquals(10, page.getEndRow());
assertEquals(183, page.getTotal());
assertEquals(19, page.getPages());
assertEquals(1, page.getFirstPage());
assertEquals(8, page.getLastPage());
assertEquals(true, page.isFirstPage());
assertEquals(false, page.isLastPage());
assertEquals(false, page.isHasPreviousPage());
assertEquals(true, page.isHasNextPage());
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挤悉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子巫湘,更是在濱河造成了極大的恐慌装悲,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尚氛,死亡現(xiàn)場(chǎng)離奇詭異诀诊,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)阅嘶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)属瓣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)载迄,“玉大人,你說(shuō)我怎么就攤上這事抡蛙』っ粒” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵溜畅,是天一觀的道長(zhǎng)捏卓。 經(jīng)常有香客問(wèn)我,道長(zhǎng)慈格,這世上最難降的妖魔是什么怠晴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮浴捆,結(jié)果婚禮上蒜田,老公的妹妹穿的比我還像新娘。我一直安慰自己选泻,他們只是感情好冲粤,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著页眯,像睡著了一般梯捕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窝撵,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天傀顾,我揣著相機(jī)與錄音,去河邊找鬼碌奉。 笑死短曾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赐劣。 我是一名探鬼主播嫉拐,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼魁兼!你這毒婦竟也來(lái)了婉徘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咐汞,失蹤者是張志新(化名)和其女友劉穎盖呼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體碉考,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年挺身,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侯谁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖墙贱,靈堂內(nèi)的尸體忽然破棺而出热芹,到底是詐尸還是另有隱情,我是刑警寧澤惨撇,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布伊脓,位于F島的核電站,受9級(jí)特大地震影響魁衙,放射性物質(zhì)發(fā)生泄漏报腔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一剖淀、第九天 我趴在偏房一處隱蔽的房頂上張望纯蛾。 院中可真熱鬧,春花似錦纵隔、人聲如沸翻诉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至撼港,卻和暖如春绅作,著一層夾襖步出監(jiān)牢的瞬間芦圾,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工棚蓄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堕扶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓梭依,卻偏偏與公主長(zhǎng)得像稍算,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子役拴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • 如果你也在用Mybatis糊探,建議嘗試該分頁(yè)插件,這一定是最方便使用的分頁(yè)插件河闰。該插件支持任何復(fù)雜的單表科平、多表分頁(yè)。...
    Michaelhbjian閱讀 1,165評(píng)論 0 2
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理姜性,服務(wù)發(fā)現(xiàn)瞪慧,斷路器,智...
    卡卡羅2017閱讀 134,715評(píng)論 18 139
  • 這個(gè)公式方便你有效的完成塑形目標(biāo) 不要被標(biāo)題蒙蔽了部念。我們這里不是強(qiáng)調(diào)“快速減肥!“不是呆在桑拿房或者穿著發(fā)汗服弃酌。這...
    f69b661ee123閱讀 3,897評(píng)論 3 112
  • 1 注冊(cè)成為開(kāi)發(fā)者 http://lbs.amap.com/ 2 進(jìn)入開(kāi)發(fā)者中心控制臺(tái) 3 創(chuàng)建新應(yīng)用 4 添加新key
    喵嗚Yuri閱讀 3,968評(píng)論 0 0