Mybatis 的分頁插件PageHelper-4.1.1的使用

Mybatis 的分頁插件 PageHelperjava

項目地址:http://git.oschina.net/free/Mybatis_PageHelper git

文檔地址:http://git.oschina.net/free/Mybatis_PageHelper/blob/master/wikis/HowToUse.markdowngithub

 

我用的版本是PageHelper-4.1.一、Mybatis-3.3.0sql

PageHelper 依賴於 jsqlparser-0.9.4.jarmarkdown

 

使用方法:多線程

一、根據Mybatis的版本下載對應版本的PageHelper ( Mybatis最低版本不能低於3.3 )oracle

二、在Mybatis的配置文件 Mybatis-Configu.xml中配置PageHelper插件,配置示例:學習

   plugins插件的配置在 settings以後 在environments以前.net

   settings中設置Mybatis的一些額外的運行參數 如是否開啓延遲加載,動態代理使用CG-LIB,或JAVALIB等插件

 <plugins>

         <!-- PageHelper4.1.1 --> 

        <plugin interceptor="com.github.pagehelper.PageHelper">

            <property name="dialect" value="oracle"/>

            <property name="offsetAsPageNum" value="false"/>

            <property name="rowBoundsWithCount" value="false"/>

            <property name="pageSizeZero" value="true"/>

            <property name="reasonable" value="false"/>

            <property name="supportMethodsArguments" value="false"/>

            <property name="returnPageInfo" value="none"/>

        </plugin>

    </plugins>  

三、使用方法

pageHelper會使用ThreadLocal獲取到同一線程中的變量信息,各個線程之間的Threadlocal不會相互干擾,也就是Thread1中的ThreadLocal1以後獲取到Tread1中的變量的信息,不會獲取到Thread2中的信息

因此在多線程環境下,各個Threadlocal之間相互隔離,能夠實現,不一樣thread使用不一樣的數據源或不一樣的Thread中執行不一樣的SQL語句

因此,PageHelper利用這一點經過攔截器獲取到同一線程中的預編譯好的SQL語句以後將SQL語句包裝成具備分頁功能的SQL語句,並將其再次賦值給下一步操做,因此實際執行的SQL語句就是有了分頁功能的SQL語句

PageHelper只對緊跟着的第一個SQL語句起做用

如上:因此若一個方法中涉及到多個查詢,須要當心,避免爲不須要分頁的添加了分頁,而真正須要分頁的卻沒有被分頁

1)、統計總數,(將SQL語句變爲 select count(0) from xxx,只對簡單SQL語句其效果,複雜SQL語句須要本身寫)   

Page<?> page = PageHelper.startPage(1,-1);

    long count = page.getTotal();

2)、分頁,pageNum - 第N頁, pageSize - 每頁M條數

    A、只分頁不統計(每次只執行分頁語句)    

PageHelper.startPage([pageNum],[pageSize]);

    List<?> pagelist = queryForList( xxx.class, "queryAll" , param);

    //pagelist就是分頁以後的結果

    B、分頁並統計(每次執行2條語句,一條select count語句,一條分頁語句)適用於查詢分頁時數據發生變更,須要將實時的變更信息反映到分頁結果上   

Page<?> page = PageHelper.startPage([pageNum],[pageSize],[iscount]);

    List<?> pagelist = queryForList( xxx.class , "queryAll" , param);

    long count = page.getTotal();

    //也能夠 List<?> pagelist = page.getList();  獲取分頁後的結果集

3)、使用PageHelper查所有(不分頁)   

PageHelper.startPage(1,0);

    List<?> alllist = queryForList( xxx.class , "queryAll" , param);

4)、PageHelper的其餘API    

String orderBy = PageHelper.getOrderBy();    //獲取orderBy語句

    Page<?> page = PageHelper.startPage(Object params);

    Page<?> page = PageHelper.startPage(int pageNum, int pageSize);

    Page<?> page = PageHelper.startPage(int pageNum, int pageSize, boolean isCount);

    Page<?> page = PageHelper.startPage(pageNum, pageSize, orderBy);

    Page<?> page = PageHelper.startPage(pageNum, pageSize, isCount, isReasonable);    //isReasonable分頁合理化,null時用默認配置

    Page<?> page = PageHelper.startPage(pageNum, pageSize, isCount, isReasonable, isPageSizeZero);    //isPageSizeZero是否支持PageSize爲0,true且pageSize=0時返回所有結果,false時分頁,null時用默認配置

5)、默認值    

//RowBounds參數offset做爲PageNum使用 - 默認不使用

    private boolean offsetAsPageNum = false;

    //RowBounds是否進行count查詢 - 默認不查詢

    private boolean rowBoundsWithCount = false;

    //當設置爲true的時候,若是pagesize設置爲0(或RowBounds的limit=0),就不執行分頁,返回所有結果

    private boolean pageSizeZero = false;

    //分頁合理化

    private boolean reasonable = false;

    //是否支持接口參數來傳遞分頁參數,默認false

    private boolean supportMethodsArguments = false;  

 

=========================== 以上爲轉載內容 ================================

留着學習

相關文章
相關標籤/搜索