最近公司需要做一個告警頁面的功能,需要分頁,查了很多資料發(fā)現(xiàn)PageHelper比較合適
故寫一篇從零開始的PageHelper使用的教程,也記錄下忙活一天的東西
1.首先需要在項目中添加PageHelper的依賴,這里我用的Maven添加
1
2
3
4
5
|
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version> 4.1 . 6 </version> </dependency> |
2.在mybatis的配置文件中添加對pagehelper 的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<configuration> <plugins> <!-- com.github.pagehelper為PageHelper類所在包名 --> <plugin interceptor= "com.github.pagehelper.PageHelper" > <!-- 4.0 . 0 以后版本可以不設(shè)置該參數(shù) --> <property name= "dialect" value= "mysql" /> <!-- 該參數(shù)默認為 false --> <!-- 設(shè)置為 true 時,會將RowBounds第一個參數(shù)offset當(dāng)成pageNum頁碼使用 --> <!-- 和startPage中的pageNum效果一樣--> <property name= "offsetAsPageNum" value= "true" /> <!-- 該參數(shù)默認為 false --> <!-- 設(shè)置為 true 時,使用RowBounds分頁會進行count查詢 --> <property name= "rowBoundsWithCount" value= "true" /> <!-- 設(shè)置為 true 時,如果pageSize= 0 或者RowBounds.limit = 0 就會查詢出全部的結(jié)果 --> <!-- (相當(dāng)于沒有執(zhí)行分頁查詢,但是返回結(jié)果仍然是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,不配置映射的用默認值 --> <!-- 不理解該含義的前提下,不要隨便復(fù)制該配置 --> <!-- <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的類來儲存分頁的信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
public class PageBean<T> implements Serializable { private static final long serialVersionUID = 1L; private long total; //總記錄數(shù) private List<T> list; //結(jié)果集 private int pageNum; //第幾頁 private int pageSize; //每頁記錄數(shù) private int pages; // 總頁數(shù) private int size; //當(dāng)前頁的數(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è)務(wù)邏輯的代碼了
4.首先從mapper.xml文件寫起,操作數(shù)據(jù)庫的sql,查出我們所需要的數(shù)據(jù)
1
2
3
4
5
6
7
|
<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的接口方法
1
|
public List<AlarmParamModel> selectallList(AlarmParamModel model); |
6.service的接口方法
1
|
Datagrid selectallList(AlarmParamModel model, int pageNum, int pageSize); |
7.service的實現(xiàn)類
這里需要注意下,是分頁的主要邏輯。pageNum表示頁碼,pageSize表示每頁顯示的數(shù)目,startPag方法是初始的頁面,orderBy方法是將數(shù)據(jù)按某個字段進行排序,這里我用的是occr_time的降序(desc)
1
2
3
4
5
6
7
8
|
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ù))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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。
1
2
3
4
5
6
7
8
|
@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 的配置貼一下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
$( '#tb_departments' ).bootstrapTable({ url: 'http://10.1.234.134:8088/api/AlarmInfo/list' , //請求后臺的URL(*) method: 'get' , //請求方式(*) striped: false , //是否顯示行間隔色 cache: false , //是否使用緩存,默認為true,所以一般情況下需要設(shè)置一下這個屬性(*) pagination: true , //是否顯示分頁(*) onlyInfoPagination: true , //設(shè)置為 true 只顯示總數(shù)據(jù)數(shù),而不顯示分頁按鈕。需要 pagination='True' sortable: true , //是否啟用排序 sortOrder: "asc" , //排序方式 queryParams: oTableInit.queryParams, //傳遞參數(shù)(*) sidePagination: "server" , //分頁方式:client客戶端分頁,server服務(wù)端分頁(*) pageNumber: 1 , //初始化加載第一頁,默認第一頁 pageSize: 10 , //每頁的記錄行數(shù)(*) pageList: [ 10 , 25 , 50 , 100 ], //可供選擇的每頁的行數(shù)(*) search: false , //是否顯示表格搜索,此搜索是客戶端搜索,不會進服務(wù)端,所以,個人感覺意義不大 strictSearch: true , showColumns: false , //是否顯示所有的列 showRefresh: false , //是否顯示刷新按鈕 minimumCountColumns: 2 , //最少允許的列數(shù) clickToSelect: true , //是否啟用點擊選中行 checkboxHeader: true , //add height: 500 , //行高,如果沒有設(shè)置height屬性,表格自動根據(jù)記錄條數(shù)覺得表格高度 uniqueId: "id" , //每一行的唯一標(biāo)識,一般為主鍵列 showToggle: false , //是否顯示詳細視圖和列表視圖的切換按鈕 cardView: false , //是否顯示詳細視圖 detailView: true , detailFormatter:detailFormatter , paginationHAlign: "left" , paginationDetailHAlign: "right" , |
這里我沒有用bootstrap自帶的分頁按鈕,我是自己用jq寫的按鈕組,在下一篇文章我會把按鈕代碼貼出來,這樣可自定義的程度會高一些~ 你也可以直接用bootstraptable子帶的分頁按鈕,把配置改下就好。
以上所述是小編給大家介紹的SpringMvc+Mybatis+Pagehelper分頁詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對服務(wù)器之家網(wǎng)站的支持!
原文鏈接:http://blog.csdn.net/qq_32715873/article/details/54016797