引入pagehelper依賴
<!--pagehelper分頁插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
Springboot配置文件配置pagehelper屬性和Mybatis屬性
#分頁插件 pagehelper
#pagehelper:
# #定義數據庫語言
# helper-dialect: mysql
# #分頁參數合理化
# reasonable: true
# support-methods-arguments: true
# #支持通過Mapper接口參數來傳遞分頁參數
# params: count=countSql
mybatis:
#指定mapper.xml路徑
mapper-locations: classpath:mapper/*Mapper.xml
#指定mybatis配置文件
config-location: classpath:mybatis-config.xml
#:mybatis允許設置別名
# type-aliases-package: com.springboot.agriculture.entity
#打印sql
# configuration.log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
在config-location: classpath:mybatis-config.xml 指定自定義的XML格式的配置
mybatis-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>
<settings>
<setting name="cacheEnabled" value="true" /> <!-- 全局映射器啓用緩存 -->
<setting name="lazyLoadingEnabled" value="true" /> <!-- 查詢時,關閉關聯對象即時加載以提高性能 -->
<setting name="aggressiveLazyLoading" value="false" /> <!-- 設置關聯對象加載的形態,此處爲按需加載字段(加載字段由SQL指 定),不會加載關聯表的所有字段,以提高性能 -->
<setting name="multipleResultSetsEnabled" value="true" /> <!-- 對於未知的SQL查詢,允許返回不同的結果集以達到通用的效果 -->
<setting name="useColumnLabel" value="true" /> <!-- 允許使用列標籤代替列名 -->
<setting name="useGeneratedKeys" value="true" /> <!-- 允許使用自定義的主鍵值(比如由程序生成的UUID 32位編碼作爲鍵值),數據表的PK生成策略將被覆蓋 -->
<setting name="autoMappingBehavior" value="FULL" /> <!-- 給予被嵌套的resultMap以字段-屬性的映射支持 -->
<setting name="defaultExecutorType" value="REUSE" /> <!-- 對於批量更新操作緩存SQL以提高性能 -->
<setting name="defaultStatementTimeout" value="25000" /><!-- 數據庫超過25000秒仍未響應則超時 -->
<setting name="logImpl" value="STDOUT_LOGGING" /><!-- 控制檯打印sql -->
</settings>
<plugins>
<!-- com.github.pagehelper爲PageHelper類所在包名 -->
<!-- <plugin interceptor="com.github.pagehelper.PageHelper"> -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- <property name="dialect" value="mysql"/> --> <!-- 高版本自動識別所用數據庫 -->
<!-- 該參數默認爲false -->
<!-- 設置爲true時,會將RowBounds第一個參數offset當成pageNum頁碼使用 -->
<!-- 和startPage中的pageNum效果一樣-->
<property name="offsetAsPageNum" value="true"/>
<!-- 該參數默認爲false -->
<!-- 設置爲true時,使用RowBounds分頁會進行count查詢 -->
<property name="rowBoundsWithCount" value="true"/>
<!-- 設置爲true時,如果pageSize=0或者RowBounds.limit = 0就會查詢出全部的結果 -->
<!-- (相當於沒有執行分頁查詢,但是返回結果仍然是Page類型)-->
<property name="pageSizeZero" value="false"/>
<!-- 3.3.0版本可用 - 分頁參數合理化,默認false禁用 -->
<!-- 啓用合理化時,如果pageNum<1會查詢第一頁,如果pageNum>pages會查詢最後一頁 -->
<!-- 禁用合理化時,如果pageNum<1或pageNum>pages會返回空數據 -->
<property name="reasonable" value="false"/>
<!-- 3.5.0版本可用 - 爲了支持startPage(Object params)方法 -->
<!-- 增加了一個`params`參數來配置參數映射,用於從Map或ServletRequest中取值 -->
</plugin>
</plugins>
</configuration>
至此PageHelper插件就配置成功了,下面我們進行測試:
簡單的分頁查詢
Controller
@RequestMapping(value = "/getListPage")
@ResponseBody
public CommonResponse getListPage(Model model, HttpServletRequest request,
@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(value = "pageSize", defaultValue = "2") Integer pageSize) {
// 自動查詢總條數/自動分頁
PageInfo<User> pageInfo = userService.findAll(pageNum, pageSize);
return CommonResponseUtil.success(pageInfo);
}
ServiceImpl
/**
* pageNum 當前頁碼 pageSize 每頁條數
*/
@Override
public PageInfo<User> findAll(Integer pageNum, Integer pageSize) {
// PageHelper開啓分頁查詢,根據下一條sql添加查詢條件查詢出總數量
PageHelper.startPage(pageNum, pageSize);
// 自定義查詢數據結果集,PageHelper自動加上Limit pageSize
List<User> userAll = usermapper.findAll();
PageInfo<User> pageInfo = new PageInfo<>(userAll);
return pageInfo;
}
這裏需要注意:
PageHelper.startPage(pageNum, pageSize);開啓分頁查詢,並且根據下一條sql語句的查詢條件查詢總總數量,所以下一條語句必須是分頁查詢數據
分頁計算公式:select * from User Limit (pageNum-1)*pageSize,pageSize
PageInfo結果集對象
{
"code": 1000,
"data": {
"total": 5,
"list": [
{
"id": 41,
"caseCode": "11111111111111111111",
"companyCode": "1142011500000144",
"punish": "420122196910198730",
"punishCode": "11111111111111111111",
"caseType": "0",
"violation": "1",
"punishResult": "4",
"punishDate": "2019-12-23",
"createCode": "100536",
"indCate": "2",
"bz": "1",
"createDate": "2019-12-04 14:00:08"
},
{
"id": 28,
"caseCode": "12313232323232323232",
"companyCode": "1142011500000144",
"punish": "420122196910198730",
"punishCode": "12313232323232323232",
"caseType": "1",
"violation": "2121ghgk",
"punishResult": "3",
"punishDate": "2019-12-17",
"createCode": "100536",
"indCate": "1",
"bz": "221"
}
],
"pageNum": 1,
"pageSize": 2,
"size": 2,
"startRow": 1,
"endRow": 2,
"pages": 3,
"prePage": 0,
"nextPage": 2,
"isFirstPage": true,
"isLastPage": false,
如果是複雜分頁查詢:
在當前分頁數據查詢條件中有可能存在其它對象數據條件,例如對當前登錄用戶的企業處罰信息查詢分頁,那麼我們就必須首先查詢出所有當前登錄用戶的企業信息,根據企業信息篩選查詢出有處罰的企業信息
- 用戶在分頁查詢條件選擇了企業信息,那麼查詢指定企業的處罰信息
- 沒有勾選分選查詢條件,則查詢當前用戶所有的企業處罰信息
針對沒有勾選查詢條件,需要查詢出所有數據的情況,首先要遍歷當前登錄用戶企業List com 查詢出單位處罰信息並保存在list集合,在根據list結果集通過foreach遍歷查詢出最終的企業處罰分頁信息,封裝到PageHelper
一定要注意:PageHelper.startPage(pageNum, pageSize);纔是開啓分頁查詢,緊跟下一個sql語句就是分頁條件查詢
/**
* CompanyCase : 當前企業處罰條件查詢封裝對象
* List<Company> com : 當前登錄用戶的企業信息列
*/
@Override
public PageInfo<CompanyCase> findAllMan(Integer pageNum, Integer pageSize, CompanyCase comCase, List<Company> com) {
// PageHelper.startPage(pageNum, pageSize);
// List<CompanyCase> caseList = new ArrayList<CompanyCase>();
List<Integer> list = new ArrayList<Integer>();
PageInfo<CompanyCase> pageInfo = new PageInfo<>();
if (StringUtils.isEmpty(comCase.getCompanyCode())) {
// 查詢條件中沒有企業信息,查詢登錄用戶下所有企業的單位處罰
for (Company company : com) {
//查詢出企業信息設置到企業處罰對象
comCase.setCompanyCode(company.getCompanyCode());
//companyAll 企業處罰可能有多條記錄
List<CompanyCase> companyAll = companyCaseMapper.findAllMan(comCase);
for (CompanyCase companyCase : companyAll) {
list.add(companyCase.getId());
}
}
if (list.size() > 0 && list != null) {
//這裏纔是真正的分頁查詢
PageHelper.startPage(pageNum, pageSize);
List<CompanyCase> cs = companyCaseMapper.selectList(list);
PageInfo<CompanyCase> pageInfos = new PageInfo<>(cs);
return pageInfos;
} else {
PageInfo<CompanyCase> pageInfos = new PageInfo<>();
return pageInfos;
}
} else {
PageHelper.startPage(pageNum, pageSize);
// 查詢條件中有企業編碼,查詢指定企業的單位處罰
List<CompanyCase> companyAll = companyCaseMapper.findAllMan(comCase);// 自動查詢總條數/自動分頁
pageInfo.setList(companyAll);
}
return pageInfo;
}
Sql語句,篩選出來的企業處罰信息對象通過In查詢封裝到PageHelper
<select id="selectList" resultMap="BaseResultMap" parameterType="java.util.List">
select
*
from company_case where id in
<foreach collection="list" item="item" index="index" open="("
separator="," close=") order by create_date desc">
#{item}
</foreach>
</select>