PageHelper是一個Mybatis的分頁插件, 負責將已經寫好的sql語句, 進行分頁加工.
設置
現在使用的是PageHelper 5.0 版本 :
在build.gradle先引用jar包:
// https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper
compile group: 'com.github.pagehelper', name: 'pagehelper', version: '5.0.0'
然后在mybatis的config文件中增加配置項, 我的config文件是 mybatis_general_config.xml:
注意里面的順序非常重要一定要放在正確的位置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引用db.properties配置文件 -->
<!--<properties resource="config/mybatis/jdbc-mysql.properties"/>-->
<properties resource="config/mybatis/jdbc-mssql.properties"/>
<plugins>
<!-- PageHelper4.1.1 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="sqlserver"/>
<property name="offsetAsPageNum" value="false"/>
<property name="rowBoundsWithCount" value="false"/>
<property name="pageSizeZero" value="true"/>
<property name="reasonable" value="false"/>
<property name="supportMethodsArguments" value="true"/>
<property name="returnPageInfo" value="none"/>
</plugin>
</plugins>
<!--
development : 開發模式
work : 工作模式
-->
<environments default="mssql_dev">
<!--<environment id="development">-->
<!--<transactionManager type="JDBC"/>-->
<!--<!– 配置數據庫連接信息 –>-->
<!--<dataSource type="POOLED">-->
<!--<property name="driver" value="${jdbc.driverClassName}"/>-->
<!--<property name="url" value="${jdbc.url}"/>-->
<!--<property name="username" value="${jdbc.user}"/>-->
<!--<property name="password" value="${jdbc.pass}"/>-->
<!--</dataSource>-->
<!--</environment>-->
<environment id="mssql_dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--<!– 注冊userMapper.xml文件,-->
<!--userMapper.xml位於me.gacl.mapping這個包下,所以resource寫成me/gacl/mapping/userMapper.xml–>-->
<!--<mapper resource="resources/mapper/studentMapper.xml"/>-->
<!--<mapper class="lyb.anno_mapper.StudentMapper"/>-->
<!--<mapper class="lyb.mapper.StudentMapper"/>-->
<!--<mapper resource="resources/mapper/classesMapper.xml"/>-->
<!--<mapper resource="mybatis_mapper/StudentMapper.xml"/>-->
<!--<mapper resource="mybatis_mapper/PosInReportMapper.xml"/>-->
<mapper class="lyb.mapper.PosInReportMapper"/>
<mapper class="lyb.mapper.SalesOutReportMapper"/>
<mapper class="lyb.mapper.TransVouchMapper"/>
<mapper class="lyb.mapper.CurrentStockMapper"/>
<mapper class="lyb.mapper.Wcc_User_Customer_ConnMapper"/>
</mappers>
</configuration>
**這里有個坑 : **
<plugin interceptor="com.github.pagehelper.PageInterceptor">
這里的4.X版本的interceptor是PageHelper, 但是5.0版本后改成了PageInterceptor
如果設置的不對會報錯.
有關具體設置詳見:
https://pagehelper.github.io/docs/howtouse/
<!--
plugins在配置文件中的位置必須符合要求,否則會報錯,順序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<plugins>
<!-- com.github.pagehelper為PageHelper類所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 使用下面的方式配置參數,后面會有所有的參數介紹 -->
<property name="param1" value="value1"/>
</plugin>
</plugins>
如果順序放置的不對, 也會出現不能初始化sqlSessionFactory的錯誤
代碼里的使用方法 :
直接加上一個PageHelper的靜態方法
PageHelper.startPage(2,10);
List<CurrentStockReport> reportList = mapper.getReport(params.getCustomer_code(),
params.getRegion_name(),
params.getInv_class_code(),
params.getInvcode(),
params.getBarcode());
僅有PageHelper.startPage(int pageNum, int pageSize) 后面的一個查詢是會分頁的, 我在這里使用的對應的mapper中的查詢語句是:
SELECT
CurrentStock.AutoID,
Customer.cCusName,
DistrictClass.cDCName,
Customer.cCusCode,
CurrentStock.cWhCode,
CurrentStock.iQuantity as stock,
CurrentStock.cBatch,
Inventory.cInvStd,
Inventory.cInvName,
Inventory.cInvAddCode
FROM CurrentStock
INNER JOIN Customer ON SUBSTRING(CurrentStock.cWhCode, 1, 6) = Customer.cCusCode
INNER JOIN DistrictClass ON customer.cdccode = DistrictClass.cdccode
INNER JOIN Inventory ON Inventory.cInvCode = CurrentStock.cInvCode;
而由plugin產生的sql語句是 :
SELECT TOP 10
cCusName,
AutoID,
cDCName,
cWhCode,
stock,
cBatch,
cInvStd,
cInvName,
cInvAddCode
FROM (SELECT
ROW_NUMBER()
OVER (
ORDER BY RAND() ) PAGE_ROW_NUMBER,
cCusName,
AutoID,
cDCName,
cWhCode,
stock,
cBatch,
cInvStd,
cInvName,
cInvAddCode
FROM (SELECT
Customer.cCusName,
CurrentStock.AutoID,
DistrictClass.cDCName,
CurrentStock.cWhCode,
CurrentStock.iQuantity AS stock,
CurrentStock.cBatch,
Inventory.cInvStd,
Inventory.cInvName,
Inventory.cInvAddCode
FROM CurrentStock
LEFT OUTER JOIN Customer ON SUBSTRING(CurrentStock.cWhCode, 1, 6) = Customer.cCusCode
LEFT OUTER JOIN DistrictClass ON customer.cdccode = DistrictClass.cdccode
LEFT OUTER JOIN Inventory ON Inventory.cInvCode = CurrentStock.cInvCode
WHERE (Customer.cCusCode = '100001')) AS PAGE_TABLE_ALIAS) AS PAGE_TABLE_ALIAS
WHERE PAGE_ROW_NUMBER > 10
ORDER BY PAGE_ROW_NUMBER
這里可以看出, 本質上對於我們自己的sql插件做的事就是在外面套了一層select, 其中增加了一個column作為排序的依據.
關鍵在於這一句:
ROW_NUMBER() OVER (ORDER BY RAND())
ROW_NUMBER() 函數就是根據OVER之中的條件, 不斷給出一個從1開始自增1的序列, 如果條件正確就一直生成.
這里通過RAND() 生成隨機數, 來進行生成ROW_NUMBER(), 然后再在外面套一層SELECT作為選擇分頁的條件, 如PAGE_ROW_NUMBER > x 就是根據從某一頁開始取, TOP y就是取多少個. 這些都是根據剛才的調用 **PageHelper.startPage(int pageNum, int pageSize) ** 計算得到的.
所以可以對任意的sql語句來進行構建分頁, 以后可以看下這個插件源碼.