如果你也在用
Mybatis
,建議嘗試該分頁插件,這一定是最方便使用的分頁插件。該插件支持任何復(fù)雜的單表幢炸、多表分頁。
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在配置文件中的位置必須符合要求拒贱,否則會報錯宛徊,順序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<plugins>
<!-- com.github.pagehelper為PageHelper類所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 使用下面的方式配置參數(shù),后面會有所有的參數(shù)介紹 -->
<property name="helperDialect" value="mysql"/>
</plugin>
</plugins>
2.分頁插件參數(shù)介紹
分頁插件提供了多個可選參數(shù)逻澳,這些參數(shù)使用時闸天,按照上面兩種配置方式中的示例配置即可。
分頁插件可選參數(shù)如下:
-
dialect
:默認(rèn)情況下會使用 PageHelper 方式進(jìn)行分頁斜做,如果想要實現(xiàn)自己的分頁邏輯苞氮,可以實現(xiàn)Dialect
(com.github.pagehelper.Dialect
) 接口,然后配置該屬性為實現(xiàn)類的全限定名稱陨享。
下面幾個參數(shù)都是針對默認(rèn) dialect 情況下的參數(shù)葱淳。使用自定義 dialect 實現(xiàn)時,下面的參數(shù)沒有任何作用抛姑。
-
helperDialect
:分頁插件會自動檢測當(dāng)前的數(shù)據(jù)庫鏈接赞厕,自動選擇合適的分頁方式。 你可以配置helperDialect
屬性來指定分頁插件使用哪種方言定硝。配置時皿桑,可以使用下面的縮寫值:
oracle
,mysql
,mariadb
,sqlite
,hsqldb
,postgresql
,db2
,sqlserver
,informix
,h2
,sqlserver2012
,derby
特別注意:使用 SqlServer2012 數(shù)據(jù)庫時,需要手動指定為sqlserver2012
蔬啡,否則會使用 SqlServer2005 的方式進(jìn)行分頁诲侮。
你也可以實現(xiàn)AbstractHelperDialect
,然后配置該屬性為實現(xiàn)類的全限定名稱即可使用自定義的實現(xiàn)方法箱蟆。 -
offsetAsPageNum
:默認(rèn)值為false
沟绪,該參數(shù)對使用RowBounds
作為分頁參數(shù)時有效。 當(dāng)該參數(shù)設(shè)置為true
時空猜,會將RowBounds
中的offset
參數(shù)當(dāng)成pageNum
使用绽慈,可以用頁碼和頁面大小兩個參數(shù)進(jìn)行分頁。 -
rowBoundsWithCount
:默認(rèn)值為false
辈毯,該參數(shù)對使用RowBounds
作為分頁參數(shù)時有效坝疼。 當(dāng)該參數(shù)設(shè)置為true
時,使用RowBounds
分頁會進(jìn)行 count 查詢谆沃。 -
pageSizeZero
:默認(rèn)值為false
钝凶,當(dāng)該參數(shù)設(shè)置為true
時,如果pageSize=0
或者RowBounds.limit = 0
就會查詢出全部的結(jié)果(相當(dāng)于沒有執(zhí)行分頁查詢唁影,但是返回結(jié)果仍然是Page
類型)耕陷。 -
reasonable
:分頁合理化參數(shù),默認(rèn)值為false
据沈。當(dāng)該參數(shù)設(shè)置為true
時啃炸,pageNum<=0
時會查詢第一頁,pageNum>pages
(超過總數(shù)時)卓舵,會查詢最后一頁南用。默認(rèn)false
時,直接根據(jù)參數(shù)進(jìn)行查詢掏湾。 -
params
:為了支持startPage(Object params)
方法裹虫,增加了該參數(shù)來配置參數(shù)映射,用于從對象中根據(jù)屬性名取值融击, 可以配置pageNum,pageSize,count,pageSizeZero,reasonable
筑公,不配置映射的用默認(rèn)值, 默認(rèn)值為pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
尊浪。 -
supportMethodsArguments
:支持通過 Mapper 接口參數(shù)來傳遞分頁參數(shù)匣屡,默認(rèn)值false
封救,分頁插件會從查詢方法的參數(shù)值中,自動根據(jù)上面params
配置的字段中取值捣作,查找到合適的值時就會自動分頁誉结。 使用方法可以參考測試代碼中的com.github.pagehelper.test.basic
包下的ArgumentsMapTest
和ArgumentsObjTest
。 -
autoRuntimeDialect
:默認(rèn)值為false
券躁。設(shè)置為true
時惩坑,允許在運行時根據(jù)多數(shù)據(jù)源自動識別對應(yīng)方言的分頁 (不支持自動選擇sqlserver2012
,只能使用sqlserver
)也拜,用法和注意事項參考下面的場景五以舒。 -
closeConn
:默認(rèn)值為true
。當(dāng)使用運行時動態(tài)數(shù)據(jù)源或沒有設(shè)置helperDialect
屬性自動獲取數(shù)據(jù)庫類型時慢哈,會自動獲取一個數(shù)據(jù)庫連接蔓钟, 通過該屬性來設(shè)置是否關(guān)閉獲取的這個連接,默認(rèn)true
關(guān)閉卵贱,設(shè)置為false
后奋刽,不會關(guān)閉獲取的連接,這個參數(shù)的設(shè)置要根據(jù)自己選擇的數(shù)據(jù)源來決定艰赞。
重要提示:
當(dāng) offsetAsPageNum=false
的時候佣谐,由于 PageNum
問題,RowBounds
查詢的時候 reasonable
會強(qiáng)制為 false
方妖。使用 PageHelper.startPage
方法不受影響狭魂。
3.如何在代碼中使用(調(diào)用分頁插件)
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);
//開始分頁
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編寫一個mapper.xml文件
直接使用工程中的一個栗子,一個簡單的查詢党觅。
<select id="getAllInfo" parameterType="Environment"
resultMap="BaseResultMap">
SELECT *
FROM t_module, t_company
WHERE t_module.company_sid = t_company.company_sid
</select>
對應(yīng)的Mapper.java中接口如下:
List<Environment> getAllInfo();
3.4PageInfo類
private int pageNum; //當(dāng)前頁
private int pageSize; //每頁的數(shù)量
private int size; //當(dāng)前頁的數(shù)量
private int startRow; //當(dāng)前頁面第一個元素在數(shù)據(jù)庫中的行號
private int endRow; //當(dāng)前頁面最后一個元素在數(shù)據(jù)庫中的行號
private int pages; //總頁數(shù)
private int prePage; //前面的頁數(shù)
private int nextPage; //后面的頁數(shù)
private boolean isFirstPage; //是否為第一頁
private boolean isLastPage; //是否為最后一頁
private boolean hasPreviousPage; //是否有前一頁
private boolean hasNextPage; //是否有后一頁
private int navigatePages;
private int[] navigatepageNums; //頁數(shù)導(dǎo)航
private int navigateFirstPage;
private int navigateLastPage;
參考資料
https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md