一 自己封裝Page對象實現(xiàn)
博客鏈接
二 使用sql實現(xiàn)分頁
2.1 場景分析
- 前段傳遞給給后臺什么參數(shù)?
- 當(dāng)前頁碼
currentPage
- 每頁顯示條數(shù)
pageSize
- 當(dāng)前頁碼
- 后臺給前端返回什么數(shù)據(jù)?
- 當(dāng)前頁數(shù)據(jù)
List
- 總記錄數(shù)
totalCount
- 當(dāng)前頁數(shù)據(jù)
2.2 前段代碼
<template>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[5, 10, 15, 20]"
:page-size="5"
layout="total, sizes, prev, pager, next, jumper"
:total="totalCount">
</el-pagination>
</template>
<script>
export default {
methods: {
handleSizeChange(val) {
//console.log(`每頁 ${val} 條`);
// 重新設(shè)置每頁顯示的條數(shù)
this.pageSize = val;
this.selectAll();
},
handleCurrentChange(val) {
// console.log(`當(dāng)前頁: ${val}`);
// 重新設(shè)置當(dāng)前頁碼
this.currentPage = val;
this.selectAll();
}
},
data() {
return {
// 當(dāng)前頁碼
currentPage: 1,
// 總記錄數(shù)
totalCount: 100,
// 每頁顯示條數(shù)
pageSize: 5,
//接收當(dāng)前頁數(shù)據(jù)集合
tableData:[]
};
},
methods:{
// 分頁查詢
selectAll(){
axios({
method:"get",
url:'后端接口地址',
}).then(response => {
//設(shè)置表格數(shù)據(jù)
this.tableData = response.data.rows;
//設(shè)置總記錄數(shù)
this.totalCount = response.data.totalCount
})
}
}
}
</script>
2.3 后端代碼
PageBean
// 分頁查詢JavaBean
public class PageBean<T> {
// 總記錄數(shù)
private int totalCount;
// 當(dāng)前頁數(shù)據(jù)
private List<T> rows;
get,set...
}
mapper
// 分頁查詢
@Select("select * from 表名 limit #{begin} , #{size}")
List<T> selectByPage(@Param("begin") int begin,@Param("size") int size);
// 查詢總記錄數(shù)
@Select("select count(*) from 表名")
int selectTotalCount();
service
// 分頁查詢 currentPage:當(dāng)前頁碼 pageSize:每頁展示條數(shù)
PageBean<T> selectByPage(int currentPage,int pageSize);
impl
@Override
public PageBean<T> selectByPage(int currentPage,int pageSize){
// 計算開始索引
int begin = (currentPage - 1) * pageSize;
// 計算查詢條目數(shù)
int size = pageSize;
// 查詢當(dāng)前頁數(shù)據(jù)
List<T> rows = mapper.selectByPage(begin,size);
// 查詢總記錄數(shù)
int totalCount = mapper.selectTotalCount();
// 封裝PageBean對象
PageBean<T> pageBean = new PageBean<>();
pageBean.setRows(rows);
pageBean.setTotalCount(totalCount);
return pageBean;
}
controller
@GetMapping("/selectAll")
public AjaxResult getApproveDataRes(ImportDataGetDto importDataGetDto){
//接收前段傳遞請求參數(shù)實體importDataGetDto
int currentPage = importDataGetDto.getCurrentPage();
int pageSize = importDataGetDto.getPageSize();
PageBean<T> pageBean = mapper.selectByPage(currentPage,pageSize)
return pageBean;
}
三 使用PageHelper插件
PageHelper官網(wǎng)
3.1 導(dǎo)入依賴
<dependencies>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
3.2 application.yml
pagehelper:
# 設(shè)置方言,此處指定 MySQL 數(shù)據(jù)庫
helper-dialect: mysql
# 是否啟動合理化,默認(rèn)是 false。
# 啟用合理化時,如果pageNum<1會查詢第一頁,如果pageNum>pages(最大頁數(shù))會查詢最后一頁。
# 禁用合理化時,如果pageNum<1或pageNum>pages會返回空數(shù)據(jù)
reasonable: true
# 是否支持接口參數(shù)來傳遞分頁參數(shù),默認(rèn)false
support-methods-arguments: true
# 為了支持startPage(Object params)方法,增加了該參數(shù)來配置參數(shù)映射,用于從對象中根據(jù)屬性名取值
params: count=countSql
# 默認(rèn)值為 false,當(dāng)該參數(shù)設(shè)置為 true 時,如果 pageSize=0 或者 RowBounds.limit = 0 就會查詢出全部的結(jié)果(相當(dāng)于沒有執(zhí)行分頁查詢,但是返回結(jié)果仍然是 Page 類型)
page-size-zero: true
3.3 使用
/**
* service實現(xiàn)類
* @param pageNumber 頁碼
* @param pageSize 每頁顯示數(shù)目
*/
public PageInfo<T> list(Integer pageNumber, Integer pageSize) {
// 設(shè)置分頁
PageHelper.startPage(pageNumber, pageSize);
// 查詢用戶角色列表(需要分頁的查詢)
List<T> list = userRoleService.queryList();
PageInfo<T> pageInfo = new PageInfo<>(list);
return pageInfo;
)
注意:PageHelper.startPage(頁碼, 每頁顯示數(shù)目); 這一句代碼,必須放在需要分頁的查詢語句之前,否則會分頁不生效
3.4 分頁失效情況
分頁設(shè)置與需要分頁的查詢之間存在其他查詢,如下代碼是一個錯誤示范,雖然在方法的開頭設(shè)置了分頁,但因為在
【查詢用戶角色列表】
之前,多查了一步【查詢用戶信息】
,此時實際上分頁針對的是【查詢用戶信息】進行分頁,而并非對【查詢用戶角色列表】進行分頁。
public PageInfo<UserRole> list(Integer pageNumber, Integer pageSize, String userId) {
// 設(shè)置分頁
PageHelper.startPage(pageNumber, pageSize);
// 查詢用戶信息
User user = userService.findById(userId);
// 查詢用戶角色列表(需要分頁的查詢)
List<UserRole> list = userRoleService.queryList();
PageInfo<UserRole> pageInfo = new PageInfo<UserRole>(list);
return pageInfo;
)
注意:startPage會尋找最近的一個查詢方法執(zhí)行分頁
在需要分頁的查詢后才設(shè)置分頁,如下代碼是一個錯誤示范,在【查詢用戶角色列表】后才進行分頁設(shè)置,因為已進行的所有數(shù)據(jù)的查詢,所以此時再設(shè)置分頁已無任何意義,自然會分頁失效
public PageInfo<UserRole> list(Integer pageNumber, Integer pageSize) {
// 查詢用戶角色列表(需要分頁的查詢)
List<UserRole> list = userRoleService.queryList();
// 設(shè)置分頁
PageHelper.startPage(pageNumber, pageSize);
PageInfo<UserRole> pageInfo = new PageInfo<UserRole>(list);
return pageInfo;
)
3.5 返回參數(shù)說明
//當(dāng)前頁
private int pageNum;
//每頁的數(shù)量
private int pageSize;
//當(dāng)前頁的數(shù)量
private int size;
//當(dāng)前頁面第一個元素在數(shù)據(jù)庫中的行號
private int startRow;
//當(dāng)前頁面最后一個元素在數(shù)據(jù)庫中的行號
private int endRow;
//總記錄數(shù)
private long total;
//總頁數(shù)
private int pages;
//結(jié)果集重要,通過getList獲取結(jié)果集
private List<T> list;
//前一頁
private int prePage;
//下一頁
private int nextPage;
//是否為第一頁
private boolean isFirstPage = false;
//是否為最后一頁
private boolean isLastPage = false;
//是否有前一頁
private boolean hasPreviousPage = false;
//是否有下一頁
private boolean hasNextPage = false;
//導(dǎo)航頁碼數(shù)
private int navigatePages;
//所有導(dǎo)航頁號
private int[] navigatepageNums;
//導(dǎo)航條上的第一頁
private int navigateFirstPage;
//導(dǎo)航條上的最后一頁
private int navigateLastPage;
3.6 自定義返回參數(shù)
//使用默認(rèn)分頁時
PageHelper.startPage(page, size);
List<DataBean> beans = mapper.selectByQuery(express);
return new PageInfo<>(beans);
根據(jù)上述代碼可以發(fā)現(xiàn),想要進行自定義分頁的話,只需要重新定義一個
PageInfo
就可以了。保留當(dāng)前頁、每頁數(shù)量、當(dāng)前頁數(shù)量、總記錄數(shù)、總頁數(shù)字段,其他參數(shù)全部干掉,拷貝下PageInfo,在實體目錄下新建個PageBean
,把PageInfo源碼丟進去,刪掉多余的參數(shù)就OK了
public class PageBean<T> {
private static final long serialVersionUID = 1L;
//當(dāng)前頁
private int pageNum;
//每頁的數(shù)量
private int pageSize;
//當(dāng)前頁的數(shù)量
private int size;
//總記錄數(shù)
private long total;
//總頁數(shù)
private int pages;
//結(jié)果集
private List<T> list;
get,set...
}
然后分頁代碼把PageInfo改成自己的PageBean
PageHelper.startPage(page, size);
List<DataBean> beans = mapper.selectByQuery(express);
return new PageBean<>(beans);
四 使用PagedListHolder類
PagedListHolder
是Spring Framework
中的一個分頁輔助類
,用于對列表進行分頁顯示和管理。它可以將一個列表對象進行分頁處理,并提供了一些方法,用于管理分頁的相關(guān)信息。使用PagedListHolder可以方便地對列表進行分頁處理,包括獲取當(dāng)前頁的數(shù)據(jù)、切換到下一頁或上一頁、設(shè)置每頁顯示的記錄數(shù)
等操作。它還提供了一些其他的方法,如獲取總頁數(shù)、獲取當(dāng)前頁碼
等。
代碼演示
前端(ElmentUI分頁組件)
<template>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[5, 10, 15, 20]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalCount">
</el-pagination>
</template>
<script>
export default {
methods: {
handleSizeChange(val) {
//console.log(`每頁 ${val} 條`);
// 重新設(shè)置每頁顯示的條數(shù)
this.pageSize = val;
this.selectAll();
},
handleCurrentChange(val) {
// console.log(`當(dāng)前頁: ${val}`);
// 重新設(shè)置當(dāng)前頁碼
this.currentPage = val;
this.selectAll();
}
},
data() {
return {
// 當(dāng)前頁碼
currentPage: 1,
// 總記錄數(shù)
totalCount: 0,
// 每頁顯示條數(shù)
pageSize: 5,
//接收當(dāng)前頁數(shù)據(jù)集合
tableData:[]
};
},
methods:{
/*
分頁查詢
*/
handleSizeChange(val) {
console.log(`每頁 ${val} 條`);
// 重新設(shè)置每頁顯示的條數(shù)
this.pageSize = val;
this.selectAll();
},
handleCurrentChange(val) {
console.log(`當(dāng)前頁: ${val}`);
// 重新設(shè)置當(dāng)前頁碼
this.currentPage = val;
this.selectAll();
},
// 分頁查詢
selectAll(){
axios({
method:"get",
url:'后端接口地址',
}).then(response => {
//設(shè)置表格數(shù)據(jù)
this.tableData = response.data.rows;
//設(shè)置總記錄數(shù)
this.totalCount = response.data.total
})
}
}
}
</script>
后端
dto實體
@Data
public class ApproveGetDto {
...
// 當(dāng)前頁碼
private Integer currentPage;
// 每頁展示條數(shù)
private Integer pageSize;
}
vo實體
@Data
public class ApproveGetRes<T> {
...
//分頁查詢:總記錄數(shù)
private Long total;
//分頁查詢:當(dāng)前頁數(shù)據(jù)
private T rows;
}
controller文章來源:http://www.zghlxwxcb.cn/news/detail-688378.html
@GetMapping("/getApproveDataRes")
public AjaxResult getApproveDataRes(ApproveGetDto approveGetDto ){
// 通過前端傳遞參數(shù)調(diào)用service獲取數(shù)據(jù)
List<ApproveGetRes> approveGetRes= lsjsService.getApproveDataRes(approveGetDto);
// 設(shè)置要進行分頁處理的數(shù)據(jù)源
PagedListHolder<ApproveGetRes> plh = new PagedListHolder<>(approveGetRes);
// 設(shè)置每頁顯示的記錄數(shù)
plh.setPageSize(approveGetDto.getPageSize());
// 設(shè)置當(dāng)前顯示的頁碼,0代表第一頁
plh.setPage(approveGetDto.getCurrentPage()-1);
// 創(chuàng)建vo對象
ApproveGetRes dataRes = new ApproveGetRes();
// 設(shè)置vo對象的總條數(shù)
dataRes.setTotal(Long.valueOf(approveDataRes.size()));
// plh.getPageList():獲取當(dāng)前頁的數(shù)據(jù)列表
dataRes.setRows(plh.getPageList());
return AjaxResult.success("返回成功", dataRes);
}
方法解釋文章來源地址http://www.zghlxwxcb.cn/news/detail-688378.html
// 1. 設(shè)置要進行分頁處理的源列表
List<ApproveGetRes> approveGetRes= lsjsService.getApproveDataRes(approveGetDto);
PagedListHolder<ApproveGetRes> pagedListHolder = new PagedListHolder<>(approveGetRes);
// 2. 設(shè)置每頁顯示的記錄數(shù)
pagedListHolder.setPageSize(2);
// 3. 設(shè)置當(dāng)前顯示的頁碼
pagedListHolder.setPage(0);
// 4. 獲取當(dāng)前頁的數(shù)據(jù)列表
List<String> currentPageData = pagedListHolder.getPageList();
// 5. 切換到下一頁
pagedListHolder.nextPage();
// 6. 切換到上一頁
pagedListHolder.previousPage();
// 7. 獲取總頁數(shù)
int totalPages = pagedListHolder.getPageCount();
// 8. 獲取當(dāng)前頁碼
int currentPage = pagedListHolder.getPage();
// 9. 判斷當(dāng)前頁是否為第一頁
boolean isFirstPage = pagedListHolder.isFirstPage();
// 10. 判斷當(dāng)前頁是否為最后一頁
boolean isLastPage = pagedListHolder.isLastPage();
到了這里,關(guān)于SpringBoot實現(xiàn)分頁的三種方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!