pageHelper的用法(基於mybatis,maven)


pom.xml里先添加依賴

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

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

<!-- plugins在配置文件中的位置必須符合要求,否則會報錯,順序如下: 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"/>
        <!-- 該參數默認為false -->
        <!-- 設置為true時,會將RowBounds第一個參數offset當成pageNum頁碼使用 -->
        <!-- 和startPage中的pageNum效果一樣-->
        <property name="offsetAsPageNum" value="true"/>
        <!-- 該參數默認為false -->
        <!-- 設置為true時,使用RowBounds分頁會進行count查詢 -->
        <property name="rowBoundsWithCount" value="true"/>
        <!-- 設置為true時,如果pageSize=0或者RowBounds.limit = 0就會查詢出全部的結果 -->
        <!-- (相當於沒有執行分頁查詢,但是返回結果仍然是Page類型)-->
        <property name="pageSizeZero" value="true"/>
        <!-- 3.3.0版本可用 - 分頁參數合理化,默認false禁用 -->
        <!-- 啟用合理化時,如果pageNum<1會查詢第一頁,如果pageNum>pages會查詢最后一頁 -->
        <!-- 禁用合理化時,如果pageNum<1或pageNum>pages會返回空數據 -->
        <property name="reasonable" value="true"/>
        <!-- 3.5.0版本可用 - 為了支持startPage(Object params)方法 -->
        <!-- 增加了一個`params`參數來配置參數映射,用於從Map或ServletRequest中取值 -->
        <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認值 -->
        <property name="params" value="pageNum=start;pageSize=limit;pageSizeZero=zero;reasonable=heli;count=contsql"/>
    </plugin>
</plugins>

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

其他五個參數說明:

  1. 增加dialect屬性,使用時必須指定該屬性,可選值為oracle,mysql,mariadb,sqlite,hsqldb,postgresql,sqlserver,沒有默認值,必須指定該屬性

  2. 增加offsetAsPageNum屬性,默認值為false,使用默認值時不需要增加該配置,需要設為true時,需要配置該參數。當該參數設置為true時,使用RowBounds分頁時,會將offset參數當成pageNum使用,可以用頁碼和頁面大小兩個參數進行分頁。

  3. 增加rowBoundsWithCount屬性,默認值為false,使用默認值時不需要增加該配置,需要設為true時,需要配置該參數。當該參數設置為true時,使用RowBounds分頁會進行count查詢。

  4. 增加pageSizeZero屬性,默認值為false,使用默認值時不需要增加該配置,需要設為true時,需要配置該參數。當該參數設置為true時,如果pageSize=0或者RowBounds.limit = 0就會查詢出全部的結果(相當於沒有執行分頁查詢,但是返回結果仍然是Page類型)。

  5. 增加reasonable屬性,默認值為false,使用默認值時不需要增加該配置,需要設為true時,需要配置該參數。具體作用請看上面配置文件中的注釋內容。

  6. 為了支持startPage(Object params)方法,增加了一個params參數來配置參數映射,用於從Map或ServletRequest中取值,可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認值。

3. 如何選擇配置這些參數

單獨看每個參數的說明可能是一件讓人不爽的事情,這里列舉一些可能會用到某些參數的情況。

首先dialect屬性是必須的,不需要解釋。其他的參數一般情況下我們都不必去管,如果想了解何時使用合適,你可以參考以下場景:

場景一

如果你仍然在用類似ibatis式的命名空間調用方式,你也許會用到rowBoundsWithCount,分頁插件對RowBounds支持和Mybatis默認的方式是一致,默認情況下不會進行count查詢,如果你想在分頁查詢時進行count查詢,以及使用更強大的PageInfo類,你需要設置該參數為true

場景二

如果你仍然在用類似ibatis式的命名空間調用方式,你覺得RowBounds中的兩個參數offset,limit不如pageNum,pageSize容易理解,你可以使用offsetAsPageNum參數,將該參數設置為true后,offset會當成pageNum使用,limitpageSize含義相同。

場景三

如果覺得某個地方使用分頁后,你仍然想通過控制參數查詢全部的結果,你可以配置pageSizeZerotrue,配置后,如可以通過設置pageSize=0或者RowBounds.limit = 0就會查詢出全部的結果。

場景四

如果你分頁插件使用於類似分頁查看列表式的數據,如新聞列表,軟件列表,你希望用戶輸入的頁數不在合法范圍(第一頁到最后一頁之外)時能夠正確的響應到正確的結果頁面,那么你可以配置reasonabletrue,這時如果pageNum<1會查詢第一頁,如果pageNum>總頁數會查詢最后一頁。

 

使用spring的屬性配置方式

注意:請不用同時使用spring配置方式和mybatis-config.xml配置方式,只需要選擇其中一個就行。配置多個分頁插件時,會拋出異常提示。

分頁插件配置錯誤:請不要在系統中配置多個分頁插件(使用Spring時,mybatis-config.xml和Spring配置方式,請選擇其中一種,不要同時配置多個分頁插件)!

使用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方式的調用
List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(1, 10)); //第二種,Mapper接口方式的調用,推薦這種使用方式。 PageHelper.startPage(1, 10); List<Country> list = countryMapper.selectIf(1);

=============================本人現在所在項目的示例代碼============================
這個項目是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; }

這個是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實現類
@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,先設置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>("這里的參數是從數據庫查詢出來的List");
OK了



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM