Mybatis分頁插件PageHelper實現自動分頁

今天嘗試向項目中添加了一項新的功能——分頁查詢,查詢了很多資料,最後發現使用Mybatis分頁插件Pagehelper來實現最爲方便。

pagehelper插件實現分頁查詢十分方便,主要通過以下幾個步驟:

1.引入分頁插件

由於項目採用maven來管理jar包,所以可以在pom.xml 中添加如下依賴:

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>${mybatis-pagehelper.version}</version>
</dependency>

mybatis-pagehelper.version爲該插件的最新版本號。

2.配置攔截插件

在MyBatis的xml配置文件中添加如下配置信息:
<plugins>
    <!-- com.github.pagehelper爲PageHelper類所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageHelper">

      <!-- 4.0.0以後版本可以不設置該參數 -->
      <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="false" />

      <!-- 3.5.0版本可用 - 爲了支持startPage(Object params)方法 -->
      <!-- 增加了一個`params`參數來配置參數映射,用於從Map或ServletRequest中取值 -->
      <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默認值 -->
      <!-- 不理解該含義的前提下,不要隨便複製該配置 -->
      <property name="params" value="pageNum=pageHelperStart;pageSize=pageHelperRows;" />

      <!-- 支持通過Mapper接口參數來傳遞分頁參數 -->
      <property name="supportMethodsArguments" value="false" />

      <!-- always總是返回PageInfo類型,check檢查返回類型是否爲PageInfo,none返回Page -->
      <property name="returnPageInfo" value="none" />
    </plugin>
  </plugins>
分頁插件參數的具體介紹可見Pagehelper官方文檔

3.在代碼中使用該插件

在sql執行前引入該插件,完成分頁操作,即在mapper接口方法執行之前。
@RestController
public class IndexHistoryEndpoint {

  @Resource
  private IndexHistoryMapper indexHistoryMapper;

  @ResponseBody
  @RequestMapping(value = { "api/v1/indexhistory" }, method = RequestMethod.GET)
  public PageInfo listIndexHistory(
      @RequestParam(value = "pageNum", required = false, defaultValue = "1") Integer pageNum,
      @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize) {
    PageHelper.startPage(pageNum, pageSize);
    List list = indexHistoryMapper.listindexHistory();
    PageInfo pageInfo = new PageInfo(list);
    return  pageInfo;
  }
}
這樣便可以完成了該插件的全部配置。

爲何要用此插件?

mybatis提供的分頁效率低

Select * from user limit #{p1},#{p2}傳統的分頁有何不足之處?

Select * from user limit #{p1},#{p2} mybatis內部在看到jdbc的Resultset對象時,用遊標定位offset的位置,只處理limit條記錄。

場景:當數據庫105萬條數據,1萬1頁,我要查第一百頁,那就是第1000001到條1010000條,使用這種分頁查詢,先是查詢全部105萬條,然後截取所對應頁碼的記錄,效率不行。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章