SpringBoot使用PageHelper分頁詳解
pagehelper
我們在任何的系統(tǒng)中,分頁功能是必不可少的。然而,對于這個功能如果有一種快速開發(fā)的實現(xiàn)方式,當然可以節(jié)省我們很多的時間了。接下來,我就給大家基于不同的環(huán)境來說說如何使用一個分頁插件:pagehelper,它是Mybatis的一個分頁插件。 這里使用一個簡單的springboot的demo項目來實現(xiàn),前臺頁面使用的Thymeleaf模板引擎。
首先加入pageHelper的依賴
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
然后在配置文件中加入pageHelper的相關(guān)配置
# pageHelper配置 # 指定數(shù)據(jù)庫 pagehelper.helper-dialect=mysql # 頁碼<=0 查詢第一頁,頁碼>=總頁數(shù)查詢最后一頁 pagehelper.reasonable=true # 支持通過 Mapper 接口參數(shù)來傳遞分頁參數(shù) pagehelper.support-methods-arguments=true
使用
pageHelper就可以使用了。 (基本的springboot的搭建步驟就不說了,之前已經(jīng)寫過文章) 簡單的去數(shù)據(jù)庫查一張表,達到分頁效果。
dao層
@Select(value = "select * from address")
List<Map> pageListss();
service層和serviceImpl層
List<Map> pageListss( Integer pn);
@Override
public List<Map> pageListss(Integer pn) {
//判斷的目的是前臺訪問的路徑?jīng)]有pn參數(shù),則pn當前頁參數(shù)默認為1(第一頁)
if(pn==null){
pn=1;
}
//參數(shù)(當前頁,一頁展示多少條)
PageHelper.startPage(pn,3);
//只有在startPage下面的第一個select動作會被分頁
List<Map> pageList=selectMapper.pageListss();
//把查到的list列表進行pageInfo處理,返回一個分頁列表
PageInfo<Map> pageInfo=new PageInfo(pageList);
return pageList;
}
controller層
@Controller
@RequestMapping(value = "/page")
public class PageController {
@Autowired
SelectService selectService;
@RequestMapping("list")//pn是當前頁,頁面?zhèn)鹘o后臺
public String list(Integer pn,Model model){
//這時,從service返回來的列表list已經(jīng)是被分頁后的列表了
List<Map> list=selectService.pageListss(pn);
//把分頁后的list放到model中,在頁面展示信息(thymeleaf模板引擎使用model放置信息)
model.addAttribute("list",list);
return "test";
}
}
test.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>pageHelper練習</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>地址</th>
<th>詳細地址</th>
<th>電話</th>
<th>賬號</th>
</tr>
</thead>
<tbody>
<tr th:each="user : ${list}">
<!-- 將用戶的主鍵 uId 存在在 name 屬性中-->
<td th:text="${user.id}"></td>
<td th:text="${user.location}"></td>
<!-- 使用dates對象格式化日期-->
<td th:text="${user.detail}"></td>
<!-- 三運運算判斷是否已婚-->
<td th:text="${user.phone}"></td>
<td th:text="${user.account}"></td>
</tr>
</tbody>
</table>
當前第 <span th:text="${list.pageNum}"></span> 頁.
總共 <span th:text="${list.pages}"></span> 頁.
一共 <span th:text="${list.total}"></span> 條記錄
<a th:href="@{/page/list?pn=1}" rel="external nofollow" >首頁</a>
<a th:href="@{'/page/list?pn='+${list.pageNum-1}}" rel="external nofollow" >上一頁</a>
<a th:href="@{'/page/list?pn='+${list.pageNum+1}}" rel="external nofollow" >下一頁</a>
<a th:href="@{'/page/list?pn='+${list.pages}}" rel="external nofollow" >尾頁</a>
</body>
</html>
訪問路徑//localhost:8082/page/list pn參數(shù)會默認會1 結(jié)果

說明:上面的${list.pageNum},${list.pages},${list.total}等這些屬性都是屬于list的,此時這個list是被分頁后的列表,是從service層傳回來的pageInfo分頁列表。

而這個被pageHelper插件處理后的pageInfo列表具有諸多屬性。
pageInfo類說明(源碼分析)
public class PageInfo<T> implements Serializable {
private static final long serialVersionUID = 1L;
//當前頁
private int pageNum;
//每頁的數(shù)量
private int pageSize;
//當前頁的數(shù)量
private int size;
//由于startRow和endRow不常用,這里說個具體的用法
//可以在頁面中"顯示startRow到endRow 共size條數(shù)據(jù)"
//當前頁面第一個元素在數(shù)據(jù)庫中的行號
private int startRow;
//當前頁面最后一個元素在數(shù)據(jù)庫中的行號
private int endRow;
//總記錄數(shù)
private long total;
//總頁數(shù)
private int pages;
//結(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;
//導航頁碼數(shù)
private int navigatePages;
//所有導航頁號
private int[] navigatepageNums;
//導航條上的第一頁
private int navigateFirstPage;
//導航條上的最后一頁
private int navigateLastPage;
public PageInfo() {
}
/**
* 包裝Page對象
*
* @param list
*/
public PageInfo(List<T> list) {
this(list, 8);
}
/**
* 包裝Page對象
*
* @param list page結(jié)果
* @param navigatePages 頁碼數(shù)量
*/
public PageInfo(List<T> list, int navigatePages) {
if (list instanceof Page) {
Page page = (Page) list;
this.pageNum = page.getPageNum();
this.pageSize = page.getPageSize();
this.pages = page.getPages();
this.list = page;
this.size = page.size();
this.total = page.getTotal();
//由于結(jié)果是>startRow的,所以實際的需要+1
if (this.size == 0) {
this.startRow = 0;
this.endRow = 0;
} else {
this.startRow = page.getStartRow() + 1;
//計算實際的endRow(最后一頁的時候特殊)
this.endRow = this.startRow - 1 + this.size;
}
} else if (list instanceof Collection) {
this.pageNum = 1;
this.pageSize = list.size();
this.pages = this.pageSize > 0 ? 1 : 0;
this.list = list;
this.size = list.size();
this.total = list.size();
this.startRow = 0;
this.endRow = list.size() > 0 ? list.size() - 1 : 0;
}
if (list instanceof Collection) {
this.navigatePages = navigatePages;
//計算導航頁
calcNavigatepageNums();
//計算前后頁,第一頁,最后一頁
calcPage();
//判斷頁面邊界
judgePageBoudary();
}
}
.......
}
這里只列出所有屬性和構(gòu)造方法,那么可以清晰的看到一些屬性的含義,一些屬性是如何初始化,并且初始化值是怎樣的,更多詳細情況可以自己去查看源碼。
以上的分頁需求,可以非常方便的使用。 項目經(jīng)理再也不用擔心我的分頁了!
到此這篇關(guān)于SpringBoot使用PageHelper分頁詳解的文章就介紹到這了,更多相關(guān)SpringBoot使用PageHelper內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java讀寫文件,在文件中搜索內(nèi)容,并輸出含有該內(nèi)容的所有行方式
這篇文章主要介紹了Java讀寫文件,在文件中搜索內(nèi)容,并輸出含有該內(nèi)容的所有行方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
springboot?vue項目管理后端實現(xiàn)接口新增
這篇文章主要為大家介紹了springboot?vue項目管理后端實現(xiàn)接口新增,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
詳解SpringSecurity中的Authentication信息與登錄流程
這篇文章主要介紹了SpringSecurity中的Authentication信息與登錄流程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
Java使用itext5實現(xiàn)生成多個PDF并合并
這篇文章主要為大家詳細介紹了Java如何使用itext5實現(xiàn)生成多個PDF并合并,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2025-04-04

