pageHelper_筆記

pom.xml里先添加依賴

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

在Mybatis配置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.PageHelper">
        <property name="dialect" value="mysql"/>
        <!-- 該參數(shù)默認(rèn)為false -->
        <!-- 設(shè)置為true時(shí),會(huì)將RowBounds第一個(gè)參數(shù)offset當(dāng)成pageNum頁碼使用 -->
        <!-- 和startPage中的pageNum效果一樣-->
        <property name="offsetAsPageNum" value="true"/>
        <!-- 該參數(shù)默認(rèn)為false -->
        <!-- 設(shè)置為true時(shí),使用RowBounds分頁會(huì)進(jìn)行count查詢 -->
        <property name="rowBoundsWithCount" value="true"/>
        <!-- 設(shè)置為true時(shí),如果pageSize=0或者RowBounds.limit = 0就會(huì)查詢出全部的結(jié)果 -->
        <!-- (相當(dāng)于沒有執(zhí)行分頁查詢,但是返回結(jié)果仍然是Page類型)-->
        <property name="pageSizeZero" value="true"/>
        <!-- 3.3.0版本可用 - 分頁參數(shù)合理化,默認(rèn)false禁用 -->
        <!-- 啟用合理化時(shí),如果pageNum<1會(huì)查詢第一頁,如果pageNum>pages會(huì)查詢最后一頁 -->
        <!-- 禁用合理化時(shí),如果pageNum<1或pageNum>pages會(huì)返回空數(shù)據(jù) -->
        <property name="reasonable" value="true"/>
        <!-- 3.5.0版本可用 - 為了支持startPage(Object params)方法 -->
        <!-- 增加了一個(gè)`params`參數(shù)來配置參數(shù)映射,用于從Map或ServletRequest中取值 -->
        <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認(rèn)值 -->
        <property name="params" value="pageNum=start;pageSize=limit;pageSizeZero=zero;reasonable=heli;count=contsql"/>
    </plugin>
</plugins>

這里的com.github.pagehelper.PageHelper使用完整的類路徑。

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

增加dialect屬性,使用時(shí)必須指定該屬性,可選值為oracle,mysql,mariadb,sqlite,hsqldb,postgresql,sqlserver,沒有默認(rèn)值,必須指定該屬性。
增加offsetAsPageNum屬性,默認(rèn)值為false,使用默認(rèn)值時(shí)不需要增加該配置,需要設(shè)為true時(shí),需要配置該參數(shù)。當(dāng)該參數(shù)設(shè)置為true時(shí),使用RowBounds分頁時(shí),會(huì)將offset參數(shù)當(dāng)成pageNum使用,可以用頁碼和頁面大小兩個(gè)參數(shù)進(jìn)行分頁。
增加rowBoundsWithCount屬性,默認(rèn)值為false,使用默認(rèn)值時(shí)不需要增加該配置,需要設(shè)為true時(shí),需要配置該參數(shù)。當(dāng)該參數(shù)設(shè)置為true時(shí),使用RowBounds分頁會(huì)進(jìn)行count查詢。
增加pageSizeZero屬性,默認(rèn)值為false,使用默認(rèn)值時(shí)不需要增加該配置,需要設(shè)為true時(shí),需要配置該參數(shù)。當(dāng)該參數(shù)設(shè)置為true時(shí),如果pageSize=0或者RowBounds.limit = 0就會(huì)查詢出全部的結(jié)果(相當(dāng)于沒有執(zhí)行分頁查詢,但是返回結(jié)果仍然是Page類型)。
增加reasonable屬性,默認(rèn)值為false,使用默認(rèn)值時(shí)不需要增加該配置,需要設(shè)為true時(shí),需要配置該參數(shù)。具體作用請看上面配置文件中的注釋內(nèi)容。
為了支持startPage(Object params)方法,增加了一個(gè)params參數(shù)來配置參數(shù)映射,用于從Map或ServletRequest中取值,可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認(rèn)值

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

單獨(dú)看每個(gè)參數(shù)的說明可能是一件讓人不爽的事情,這里列舉一些可能會(huì)用到某些參數(shù)的情況。
首先dialect
屬性是必須的,不需要解釋。其他的參數(shù)一般情況下我們都不必去管,如果想了解何時(shí)使用合適,你可以參考以下場景:
場景一

如果你仍然在用類似ibatis式的命名空間調(diào)用方式,你也許會(huì)用到rowBoundsWithCount
,分頁插件對RowBounds
支持和Mybatis默認(rèn)的方式是一致,默認(rèn)情況下不會(huì)進(jìn)行count查詢,如果你想在分頁查詢時(shí)進(jìn)行count查詢,以及使用更強(qiáng)大的PageInfo
類,你需要設(shè)置該參數(shù)為true
。
場景二
如果你仍然在用類似ibatis式的命名空間調(diào)用方式,你覺得RowBounds中的兩個(gè)參數(shù)offset,limit
不如pageNum,pageSize
容易理解,你可以使用offsetAsPageNum
參數(shù),將該參數(shù)設(shè)置為true
后,offset
會(huì)當(dāng)成pageNum
使用,limit
和pageSize
含義相同。
場景三
如果覺得某個(gè)地方使用分頁后,你仍然想通過控制參數(shù)查詢?nèi)康慕Y(jié)果,你可以配置pageSizeZero
為true
,配置后,如可以通過設(shè)置pageSize=0
或者RowBounds.limit = 0
就會(huì)查詢出全部的結(jié)果。
場景四
如果你分頁插件使用于類似分頁查看列表式的數(shù)據(jù),如新聞列表,軟件列表,你希望用戶輸入的頁數(shù)不在合法范圍(第一頁到最后一頁之外)時(shí)能夠正確的響應(yīng)到正確的結(jié)果頁面,那么你可以配置reasonable
為true
,這時(shí)如果pageNum<1
會(huì)查詢第一頁,如果pageNum>總頁數(shù)
會(huì)查詢最后一頁。

使用spring的屬性配置方式

注意:請不用同時(shí)使用spring配置方式和mybatis-config.xml配置方式,只需要選擇其中一個(gè)就行。配置多個(gè)分頁插件時(shí),會(huì)拋出異常提示。
分頁插件配置錯(cuò)誤:請不要在系統(tǒng)中配置多個(gè)分頁插件(使用Spring時(shí),mybatis-config.xml和Spring配置方式,請選擇其中一種,不要同時(shí)配置多個(gè)分頁插件)!
使用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>

如何在代碼中使用:

//第一種,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);

本人現(xiàn)在所在項(xiàng)目的示例代碼:

這個(gè)項(xiàng)目是springBoot,mybatis,shiro搭建的,所以mybatis-config.xml配置文件改成這樣了。

@Bean
    public PageHelper pageHelper(){
        logger.info("------pageHelper");
        PageHelper pageHelper = new PageHelper();
        Properties p = new Properties();
        p.setProperty("offsetAsPageNum", "true");
        p.setProperty("rowBoundsWithCount", "true");
        p.setProperty("reasonable", "true");
        pageHelper.setProperties(p);
        return pageHelper;
    }

這個(gè)是controller里的代碼

@ResponseBody
    @RequestMapping(value = "list.json",method = RequestMethod.GET,produces = {"application/json;charset=UTF-8"})
    public String getNews(Integer pageNum, Integer size, String orderBy, String title,String state){
        try {
            PageHelper.startPage(pageNum == null ? 1 : pageNum, size == null ? 5 : size);
            Map<String, Object> map = null;
            PageInfo<News> newsPageInfo = null;
                map = new HashMap<String, Object>();
                map.put("orderBy", orderBy);
                map.put("title", title);
                map.put("state", state);
                newsPageInfo = newsService.listAll(map);
            return SUCCESS_FAIL_N(newsPageInfo.getSize() > 0, newsPageInfo, "30035");
        } catch (Exception e) {
            logger.error("查詢失敗", e);
            return SUCCESS_FAIL_N(false, null, "30036");
        }

service接口

public interface NewsService extends BaseService<News,Long> {
    PageInfo<News> listAll(Map<String,Object> map);

}

service實(shí)現(xiàn)類

@Service
public class NewsServiceImpl extends BaseServiceImpl<News,Long> implements NewsService {
    @Autowired
    private NewsMapper newsMapper;

    @Override
    public BaseMapper getMapper() {
        return newsMapper;
    }

    @Transactional
    @Override
    public PageInfo<News> listAll(Map<String, Object> map) {
        List<News> newsList =  newsMapper.listAll(map);
        return new PageInfo<News>(newsList);
    }
}

mapper接口

public interface NewsMapper extends BaseMapper<News,Long> {
    List<News> listAll(Map<String,Object> map);

}

簡單的理解:

1,先設(shè)置pageHelper
@Bean
public PageHelper pageHelper(){
logger.info("------pageHelper");
PageHelper pageHelper = new PageHelper();
Properties p = new Properties();
p.setProperty("offsetAsPageNum", "true");
p.setProperty("rowBoundsWithCount", "true");
p.setProperty("reasonable", "true");
pageHelper.setProperties(p);
return pageHelper;
}
2,
PageHelper.startPage(pageNum == null ? 1 : pageNum,size == null ? 10 : size)
3,
PageInfo<T> pageInfo = new PageInfo<T>("這里的參數(shù)是從數(shù)據(jù)庫查詢出來的List");

OK了

配置說明:

!--分頁插件-->
    <plugins>
        <!-- com.github.pagehelper為PageHelper類所在包名 -->
        <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頁碼使用 -->
            <!-- 和startPage中的pageNum效果一樣-->
            <property name="offsetAsPageNum" value="true"/>
            <!-- 該參數(shù)默認(rèn)為false -->
            <!-- 設(shè)置為true時(shí),使用RowBounds分頁會(huì)進(jìn)行count查詢 -->
            <property name="rowBoundsWithCount" value="true"/>
            <!-- 設(shè)置為true時(shí),如果pageSize=0或者RowBounds.limit = 0就會(huì)查詢出全部的結(jié)果 -->
            <!-- (相當(dāng)于沒有執(zhí)行分頁查詢,但是返回結(jié)果仍然是Page類型)-->
            <property name="pageSizeZero" value="true"/>
            <!-- 3.3.0版本可用 - 分頁參數(shù)合理化,默認(rèn)false禁用 -->
            <!-- 啟用合理化時(shí),如果pageNum<1會(huì)查詢第一頁,如果pageNum>pages會(huì)查詢最后一頁 -->
            <!-- 禁用合理化時(shí),如果pageNum<1或pageNum>pages會(huì)返回空數(shù)據(jù) -->
            <property name="reasonable" value="true"/>
            <!-- 3.5.0版本可用 - 為了支持startPage(Object params)方法 -->
            <!-- 增加了一個(gè)`params`參數(shù)來配置參數(shù)映射,用于從Map或ServletRequest中取值 -->
            <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認(rèn)值 -->
            <!--<property name="params" value="pageNum=start;pageSize=limit;pageSizeZero=zero;reasonable=heli;count=contsql"/>-->
        </plugin>
    </plugins>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 本文部分內(nèi)容摘選自PageHelper GitHub,可按照文中步驟進(jìn)行插件快速集成 一、Maven配置 <val...
    蔓越莓餅干閱讀 3,340評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,626評論 18 399
  • 感恩父母養(yǎng)育之恩 感恩老師四個(gè)力量的講解 有了這個(gè)工具對未來不再恐懼 感恩公司員工辛苦工作 激情飽滿 感恩客戶對我...
    秀W閱讀 255評論 0 1
  • 關(guān)于過去內(nèi)心的一點(diǎn)小心事 第一次寫推送,感覺特別奇妙,把我的第一次獻(xiàn)給了關(guān)于對過去小心事的一點(diǎn)點(diǎn)回憶吧,如果...
    coraline111閱讀 526評論 0 1

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