SpringMvc+Mybatis+Pagehelper分頁詳解
最近公司需要做一個告警頁面的功能,需要分頁,查了很多資料發(fā)現(xiàn)PageHelper比較合適
故寫一篇從零開始的PageHelper使用的教程,也記錄下忙活一天的東西
1.首先需要在項目中添加PageHelper的依賴,這里我用的Maven添加
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.1.6</version> </dependency>
2.在mybatis的配置文件中添加對pagehelper 的配置
<configuration>
<plugins>
<!-- com.github.pagehelper為PageHelper類所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 4.0.0以后版本可以不設置該參數(shù) -->
<property name="dialect" value="mysql"/>
<!-- 該參數(shù)默認為false -->
<!-- 設置為true時,會將RowBounds第一個參數(shù)offset當成pageNum頁碼使用 -->
<!-- 和startPage中的pageNum效果一樣-->
<property name="offsetAsPageNum" value="true"/>
<!-- 該參數(shù)默認為false -->
<!-- 設置為true時,使用RowBounds分頁會進行count查詢 -->
<property name="rowBoundsWithCount" value="true"/>
<!-- 設置為true時,如果pageSize=0或者RowBounds.limit = 0就會查詢出全部的結果 -->
<!-- (相當于沒有執(zhí)行分頁查詢,但是返回結果仍然是Page類型)-->
<property name="pageSizeZero" value="true"/>
<!-- 3.3.0版本可用 - 分頁參數(shù)合理化,默認false禁用 -->
<!-- 啟用合理化時,如果pageNum<1會查詢第一頁,如果pageNum>pages會查詢最后一頁 -->
<!-- 禁用合理化時,如果pageNum<1或pageNum>pages會返回空數(shù)據(jù) -->
<property name="reasonable" value="true"/>
<!-- 3.5.0版本可用 - 為了支持startPage(Object params)方法 -->
<!-- 增加了一個`params`參數(shù)來配置參數(shù)映射,用于從Map或ServletRequest中取值 -->
<!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默認值 -->
<!-- 不理解該含義的前提下,不要隨便復制該配置 -->
<!-- <property name="params" value="pageNum=start;pageSize=limit;"/> -->
<!-- 支持通過Mapper接口參數(shù)來傳遞分頁參數(shù) -->
<property name="supportMethodsArguments" value="true"/>
<!-- always總是返回PageInfo類型,check檢查返回類型是否為PageInfo,none返回Page -->
<property name="returnPageInfo" value="check"/>
</plugin>
</plugins>
</configuration>
3.添加一個PageBean的類來儲存分頁的信息
public class PageBean<T> implements Serializable {
private static final long serialVersionUID = 1L;
private long total; //總記錄數(shù)
private List<T> list; //結果集
private int pageNum; //第幾頁
private int pageSize; //每頁記錄數(shù)
private int pages; // 總頁數(shù)
private int size; //當前頁的數(shù)量<=pageSize
public PageBean(List<T> list){
if (list instanceof Page){
Page<T> page = (Page<T>) list;
this.pageNum = page.getPageNum();
this.pageSize = page.getPageSize();
this.total = page.getTotal();
this.pages = page.getPages();
this.list = page;
this.size = page.size();
}
}
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPages() {
return pages;
}
public void setPages(int pages) {
this.pages = pages;
}
}
下面就是業(yè)務邏輯的代碼了
4.首先從mapper.xml文件寫起,操作數(shù)據(jù)庫的sql,查出我們所需要的數(shù)據(jù)
<select id="selectallList" parameterType="com.alarm.bean.AlarmParamModel" resultMap="AlarmMap"> select message_id, seqnum, message_type, process_status, distribute_status, processor, occur_time, close_time, system_id, group_id, warn_level, message_content from td_alarm_info </select>
5.mapper的接口方法
public List<AlarmParamModel> selectallList(AlarmParamModel model);
6.service的接口方法
Datagrid selectallList(AlarmParamModel model,int pageNum, int pageSize);
7.service的實現(xiàn)類
這里需要注意下,是分頁的主要邏輯。pageNum表示頁碼,pageSize表示每頁顯示的數(shù)目,startPag方法是初始的頁面,orderBy方法是將數(shù)據(jù)按某個字段進行排序,這里我用的是occr_time的降序(desc)
public Datagrid selectallList(AlarmParamModel model,int pageNum, int pageSize){
PageHelper.startPage(pageNum, pageSize);
PageHelper.orderBy("occur_time desc");
List<AlarmParamModel> list = this.alarmMgrMapper.selectallList(model);
PageInfo<AlarmParamModel> pageInfo = new PageInfo<AlarmParamModel>(list);
Datagrid datagrid = new Datagrid(pageInfo.getTotal(),pageInfo.getList());
return datagrid;
}
8.注意到我這邊用了一個Datagrid類,是用于向前臺傳數(shù)據(jù)用的類,包括total(總數(shù))和rows(數(shù)據(jù))
public class Datagrid {
private long total;
private List rows = new ArrayList<>();
public Datagrid() {
super();
}
public Datagrid(long total, List rows) {
super();
this.total = total;
this.rows = rows;
}
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
public List getRows() {
return rows;
}
public void setRows(List rows) {
this.rows = rows;
}
}
9.開始寫controller層,調(diào)用之前寫的方法
這里需要注意的是,offset和limit 是前臺傳來的頁碼和每頁顯示的數(shù)量,區(qū)別于bootstraptable 的offset和limit,那個offset表示的是偏移量,即如果每頁顯示10條數(shù)據(jù),那么bootstrap中的第二頁表示的offset就是10,第一頁和第三頁分別是0和20。而我這里的offset就是指代的pageNum。
@RequestMapping(value = "/AlarmInfo/list", method = {RequestMethod.GET,RequestMethod.POST})
@ResponseBody
public Datagrid alarmInfo(AlarmParamModel model,@RequestParam(value="offset",defaultValue="0",required=false)Integer pageNum,
@RequestParam(value="limit",defaultValue="10",required=false)Integer pageSize)
{
Datagrid datagrid = this.alarmMgrService.selectallList(model,pageNum, pageSize);
return datagrid;
}
10. 到現(xiàn)在前臺的請求已經(jīng)可以獲取后臺的數(shù)據(jù)并且分頁了,我再將我的前臺bootstrap table 的配置貼一下
$('#tb_departments').bootstrapTable({
url: 'http://10.1.234.134:8088/api/AlarmInfo/list', //請求后臺的URL(*)
method: 'get', //請求方式(*)
striped: false, //是否顯示行間隔色
cache: false, //是否使用緩存,默認為true,所以一般情況下需要設置一下這個屬性(*)
pagination: true, //是否顯示分頁(*)
onlyInfoPagination:true, //設置為 true 只顯示總數(shù)據(jù)數(shù),而不顯示分頁按鈕。需要 pagination='True'
sortable: true, //是否啟用排序
sortOrder: "asc", //排序方式
queryParams: oTableInit.queryParams,//傳遞參數(shù)(*)
sidePagination: "server", //分頁方式:client客戶端分頁,server服務端分頁(*)
pageNumber:1, //初始化加載第一頁,默認第一頁
pageSize: 10, //每頁的記錄行數(shù)(*)
pageList: [10, 25, 50, 100], //可供選擇的每頁的行數(shù)(*)
search: false, //是否顯示表格搜索,此搜索是客戶端搜索,不會進服務端,所以,個人感覺意義不大
strictSearch: true,
showColumns: false, //是否顯示所有的列
showRefresh: false, //是否顯示刷新按鈕
minimumCountColumns: 2, //最少允許的列數(shù)
clickToSelect: true, //是否啟用點擊選中行
checkboxHeader:true, //add
height: 500, //行高,如果沒有設置height屬性,表格自動根據(jù)記錄條數(shù)覺得表格高度
uniqueId: "id", //每一行的唯一標識,一般為主鍵列
showToggle:false, //是否顯示詳細視圖和列表視圖的切換按鈕
cardView: false, //是否顯示詳細視圖
detailView: true,
detailFormatter:detailFormatter ,
paginationHAlign:"left",
paginationDetailHAlign:"right",
這里我沒有用bootstrap自帶的分頁按鈕,我是自己用jq寫的按鈕組,在下一篇文章我會把按鈕代碼貼出來,這樣可自定義的程度會高一些~ 你也可以直接用bootstraptable子帶的分頁按鈕,把配置改下就好。
以上所述是小編給大家介紹的SpringMvc+Mybatis+Pagehelper分頁詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
詳解在SpringBoot中@Transactional事物操作和事物無效問題排查
這篇文章主要介紹了詳解在SpringBoot中@Transactional事物操作和事物無效問題排查,本文詳細的介紹了SpringBoot中集成使用@Transactional注解操作事物以及事物開啟后無效的問題排查,需要的朋友可以參考下2021-06-06
Java實戰(zhàn)之在線寄查快遞系統(tǒng)的實現(xiàn)
這篇文章主要介紹了如何利用Java制作一個在線寄查快遞系統(tǒng),文中采用的技術有java、SpringBoot、FreeMarker、Mysql,需要的可以參考一下2022-02-02
Java8新特性之Collectors.joining()實例詳解
在項目中我們常常要對list集合的數(shù)據(jù)做一些字符串拼接/處理等相關操作,下面這篇文章主要給大家介紹了關于Java8新特性之Collectors.joining()的相關資料,需要的朋友可以參考下2023-01-01
Maven+Tomcat8 實現(xiàn)自動化部署的方法
本篇文章主要介紹了Maven+Tomcat8 實現(xiàn)自動化部署的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
SpringDataJpa如何使用union多表分頁條件查詢
這篇文章主要介紹了SpringDataJpa如何使用union多表分頁條件查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
解決Mybatis在IDEA中找不到mapper映射文件的問題
這篇文章主要介紹了解決Mybatis在IDEA中找不到mapper映射文件的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10

