如果你也在用
Mybatis,建議嘗試該分頁(yè)插件,這一定是最方便使用的分頁(yè)插件。該插件支持任何復(fù)雜的單表、多表分頁(yè)。
1.引入PageHelper的jar包
在pom.xml中添加如下依賴:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>最新版本</version>
</dependency>
2.配置攔截器插件
1.在 MyBatis 配置 xml 中配置攔截器插件
在Resource文件中mybatis的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.PageInterceptor">
<!-- 使用下面的方式配置參數(shù),后面會(huì)有所有的參數(shù)介紹 -->
<property name="helperDialect" value="mysql"/>
</plugin>
</plugins>
2.分頁(yè)插件參數(shù)介紹
分頁(yè)插件提供了多個(gè)可選參數(shù),這些參數(shù)使用時(shí),按照上面兩種配置方式中的示例配置即可。
分頁(yè)插件可選參數(shù)如下:
-
dialect:默認(rèn)情況下會(huì)使用 PageHelper 方式進(jìn)行分頁(yè),如果想要實(shí)現(xiàn)自己的分頁(yè)邏輯,可以實(shí)現(xiàn)Dialect(com.github.pagehelper.Dialect) 接口,然后配置該屬性為實(shí)現(xiàn)類的全限定名稱。
下面幾個(gè)參數(shù)都是針對(duì)默認(rèn) dialect 情況下的參數(shù)。使用自定義 dialect 實(shí)現(xiàn)時(shí),下面的參數(shù)沒有任何作用。
-
helperDialect:分頁(yè)插件會(huì)自動(dòng)檢測(cè)當(dāng)前的數(shù)據(jù)庫(kù)鏈接,自動(dòng)選擇合適的分頁(yè)方式。 你可以配置helperDialect屬性來指定分頁(yè)插件使用哪種方言。配置時(shí),可以使用下面的縮寫值:
oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
特別注意:使用 SqlServer2012 數(shù)據(jù)庫(kù)時(shí),需要手動(dòng)指定為sqlserver2012,否則會(huì)使用 SqlServer2005 的方式進(jìn)行分頁(yè)。
你也可以實(shí)現(xiàn)AbstractHelperDialect,然后配置該屬性為實(shí)現(xiàn)類的全限定名稱即可使用自定義的實(shí)現(xiàn)方法。 -
offsetAsPageNum:默認(rèn)值為false,該參數(shù)對(duì)使用RowBounds作為分頁(yè)參數(shù)時(shí)有效。 當(dāng)該參數(shù)設(shè)置為true時(shí),會(huì)將RowBounds中的offset參數(shù)當(dāng)成pageNum使用,可以用頁(yè)碼和頁(yè)面大小兩個(gè)參數(shù)進(jìn)行分頁(yè)。 -
rowBoundsWithCount:默認(rèn)值為false,該參數(shù)對(duì)使用RowBounds作為分頁(yè)參數(shù)時(shí)有效。 當(dāng)該參數(shù)設(shè)置為true時(shí),使用RowBounds分頁(yè)會(huì)進(jìn)行 count 查詢。 -
pageSizeZero:默認(rèn)值為false,當(dāng)該參數(shù)設(shè)置為true時(shí),如果pageSize=0或者RowBounds.limit = 0就會(huì)查詢出全部的結(jié)果(相當(dāng)于沒有執(zhí)行分頁(yè)查詢,但是返回結(jié)果仍然是Page類型)。 -
reasonable:分頁(yè)合理化參數(shù),默認(rèn)值為false。當(dāng)該參數(shù)設(shè)置為true時(shí),pageNum<=0時(shí)會(huì)查詢第一頁(yè),pageNum>pages(超過總數(shù)時(shí)),會(huì)查詢最后一頁(yè)。默認(rèn)false時(shí),直接根據(jù)參數(shù)進(jìn)行查詢。 -
params:為了支持startPage(Object params)方法,增加了該參數(shù)來配置參數(shù)映射,用于從對(duì)象中根據(jù)屬性名取值, 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認(rèn)值, 默認(rèn)值為pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。 -
supportMethodsArguments:支持通過 Mapper 接口參數(shù)來傳遞分頁(yè)參數(shù),默認(rèn)值false,分頁(yè)插件會(huì)從查詢方法的參數(shù)值中,自動(dòng)根據(jù)上面params配置的字段中取值,查找到合適的值時(shí)就會(huì)自動(dòng)分頁(yè)。 使用方法可以參考測(cè)試代碼中的com.github.pagehelper.test.basic包下的ArgumentsMapTest和ArgumentsObjTest。 -
autoRuntimeDialect:默認(rèn)值為false。設(shè)置為true時(shí),允許在運(yùn)行時(shí)根據(jù)多數(shù)據(jù)源自動(dòng)識(shí)別對(duì)應(yīng)方言的分頁(yè) (不支持自動(dòng)選擇sqlserver2012,只能使用sqlserver),用法和注意事項(xiàng)參考下面的場(chǎng)景五。 -
closeConn:默認(rèn)值為true。當(dāng)使用運(yùn)行時(shí)動(dòng)態(tài)數(shù)據(jù)源或沒有設(shè)置helperDialect屬性自動(dòng)獲取數(shù)據(jù)庫(kù)類型時(shí),會(huì)自動(dòng)獲取一個(gè)數(shù)據(jù)庫(kù)連接, 通過該屬性來設(shè)置是否關(guān)閉獲取的這個(gè)連接,默認(rèn)true關(guān)閉,設(shè)置為false后,不會(huì)關(guān)閉獲取的連接,這個(gè)參數(shù)的設(shè)置要根據(jù)自己選擇的數(shù)據(jù)源來決定。
重要提示:
當(dāng) offsetAsPageNum=false 的時(shí)候,由于 PageNum 問題,RowBounds查詢的時(shí)候 reasonable 會(huì)強(qiáng)制為 false。使用 PageHelper.startPage 方法不受影響。
3.如何在代碼中使用(調(diào)用分頁(yè)插件)
3.1Controller層
@RequestMapping(value = "/test", method = RequestMethod.POST)
public void test(HttpServletRequest req, HttpServletResponse resp) throws IOException, SQLException {
resp.setContentType("text/html;charset=UTF-8");
String parameter = new String(StreamResolve.InputStreamTOByte(req.getInputStream()), "UTF-8");
parameter = URLDecoder.decode(parameter, "utf-8");
Environment environment = (Environment) JsonUtils.getInstance().jsonStr2Object(parameter, Environment.class);
//開始分頁(yè)
PageHelper.startPage(environment.getPage(),environment.getPageSize());
List<Environment> allInfo = environmentService.getAllInfo();
PageInfo<Environment> pageInfo = new PageInfo<Environment>(allInfo);
resp.getWriter().print(CommonLogic.jsonAssembly(Constant.SUCCESS_CODE, "SUCCESS", pageInfo));
}
}
3.2Service層
public List<Environment> getAllInfo() {
logger.info("API-getAllInfo-Service");
return environmentMapper.getAllInfo();
}
3.3編寫一個(gè)mapper.xml文件
直接使用工程中的一個(gè)栗子,一個(gè)簡(jiǎn)單的查詢。
<select id="getAllInfo" parameterType="Environment"
resultMap="BaseResultMap">
SELECT *
FROM t_module, t_company
WHERE t_module.company_sid = t_company.company_sid
</select>
對(duì)應(yīng)的Mapper.java中接口如下:
List<Environment> getAllInfo();
3.4PageInfo類
private int pageNum; //當(dāng)前頁(yè)
private int pageSize; //每頁(yè)的數(shù)量
private int size; //當(dāng)前頁(yè)的數(shù)量
private int startRow; //當(dāng)前頁(yè)面第一個(gè)元素在數(shù)據(jù)庫(kù)中的行號(hào)
private int endRow; //當(dāng)前頁(yè)面最后一個(gè)元素在數(shù)據(jù)庫(kù)中的行號(hào)
private int pages; //總頁(yè)數(shù)
private int prePage; //前面的頁(yè)數(shù)
private int nextPage; //后面的頁(yè)數(shù)
private boolean isFirstPage; //是否為第一頁(yè)
private boolean isLastPage; //是否為最后一頁(yè)
private boolean hasPreviousPage; //是否有前一頁(yè)
private boolean hasNextPage; //是否有后一頁(yè)
private int navigatePages;
private int[] navigatepageNums; //頁(yè)數(shù)導(dǎo)航
private int navigateFirstPage;
private int navigateLastPage;
參考資料
https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md