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;
=========================== 以上爲轉載內容 ================================
留着學習