SpringMvc+Mybatis+Pagehelper分頁詳解
最近公司需要做一個(gè)告警頁面的功能,需要分頁,查了很多資料發(fā)現(xiàn)PageHelper比較合適
故寫一篇從零開始的PageHelper使用的教程,也記錄下忙活一天的東西
1.首先需要在項(xiàng)目中添加PageHelper的依賴,這里我用的Maven添加
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.1.6</version> </dependency>
2.在mybatis的配置文件中添加對(duì)pagehelper 的配置
<configuration> <plugins> <!-- com.github.pagehelper為PageHelper類所在包名 --> <plugin interceptor="com.github.pagehelper.PageHelper"> <!-- 4.0.0以后版本可以不設(shè)置該參數(shù) --> <property name="dialect" value="mysql"/> <!-- 該參數(shù)默認(rèn)為false --> <!-- 設(shè)置為true時(shí),會(huì)將RowBounds第一個(gè)參數(shù)offset當(dāng)成pageNum頁碼使用 --> <!-- 和startPage中的pageNum效果一樣--> <property name="offsetAsPageNum" value="true"/> <!-- 該參數(shù)默認(rèn)為false --> <!-- 設(shè)置為true時(shí),使用RowBounds分頁會(huì)進(jìn)行count查詢 --> <property name="rowBoundsWithCount" value="true"/> <!-- 設(shè)置為true時(shí),如果pageSize=0或者RowBounds.limit = 0就會(huì)查詢出全部的結(jié)果 --> <!-- (相當(dāng)于沒有執(zhí)行分頁查詢,但是返回結(jié)果仍然是Page類型)--> <property name="pageSizeZero" value="true"/> <!-- 3.3.0版本可用 - 分頁參數(shù)合理化,默認(rèn)false禁用 --> <!-- 啟用合理化時(shí),如果pageNum<1會(huì)查詢第一頁,如果pageNum>pages會(huì)查詢最后一頁 --> <!-- 禁用合理化時(shí),如果pageNum<1或pageNum>pages會(huì)返回空數(shù)據(jù) --> <property name="reasonable" value="true"/> <!-- 3.5.0版本可用 - 為了支持startPage(Object params)方法 --> <!-- 增加了一個(gè)`params`參數(shù)來配置參數(shù)映射,用于從Map或ServletRequest中取值 --> <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默認(rèn)值 --> <!-- 不理解該含義的前提下,不要隨便復(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.添加一個(gè)PageBean的類來儲(chǔ)存分頁的信息
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ù)
<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的實(shí)現(xiàn)類
這里需要注意下,是分頁的主要邏輯。pageNum表示頁碼,pageSize表示每頁顯示的數(shù)目,startPag方法是初始的頁面,orderBy方法是將數(shù)據(jù)按某個(gè)字段進(jìn)行排序,這里我用的是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.注意到我這邊用了一個(gè)Datagrid類,是用于向前臺(tái)傳數(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 是前臺(tái)傳來的頁碼和每頁顯示的數(shù)量,區(qū)別于bootstraptable 的offset和limit,那個(gè)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)在前臺(tái)的請(qǐng)求已經(jīng)可以獲取后臺(tái)的數(shù)據(jù)并且分頁了,我再將我的前臺(tái)bootstrap table 的配置貼一下
$('#tb_departments').bootstrapTable({ url: 'http://10.1.234.134:8088/api/AlarmInfo/list', //請(qǐng)求后臺(tái)的URL(*) method: 'get', //請(qǐng)求方式(*) striped: false, //是否顯示行間隔色 cache: false, //是否使用緩存,默認(rèn)為true,所以一般情況下需要設(shè)置一下這個(gè)屬性(*) 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, //初始化加載第一頁,默認(rèn)第一頁 pageSize: 10, //每頁的記錄行數(shù)(*) pageList: [10, 25, 50, 100], //可供選擇的每頁的行數(shù)(*) search: false, //是否顯示表格搜索,此搜索是客戶端搜索,不會(huì)進(jìn)服務(wù)端,所以,個(gè)人感覺意義不大 strictSearch: true, showColumns: false, //是否顯示所有的列 showRefresh: false, //是否顯示刷新按鈕 minimumCountColumns: 2, //最少允許的列數(shù) clickToSelect: true, //是否啟用點(diǎn)擊選中行 checkboxHeader:true, //add height: 500, //行高,如果沒有設(shè)置height屬性,表格自動(dòng)根據(jù)記錄條數(shù)覺得表格高度 uniqueId: "id", //每一行的唯一標(biāo)識(shí),一般為主鍵列 showToggle:false, //是否顯示詳細(xì)視圖和列表視圖的切換按鈕 cardView: false, //是否顯示詳細(xì)視圖 detailView: true, detailFormatter:detailFormatter , paginationHAlign:"left", paginationDetailHAlign:"right",
這里我沒有用bootstrap自帶的分頁按鈕,我是自己用jq寫的按鈕組,在下一篇文章我會(huì)把按鈕代碼貼出來,這樣可自定義的程度會(huì)高一些~ 你也可以直接用bootstraptable子帶的分頁按鈕,把配置改下就好。
以上所述是小編給大家介紹的SpringMvc+Mybatis+Pagehelper分頁詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
學(xué)習(xí)SpringMVC——國際化+上傳+下載詳解
本篇文章主要介紹了學(xué)習(xí)SpringMVC——國際化+上傳+下載,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。2016-12-12詳解在SpringBoot中@Transactional事物操作和事物無效問題排查
這篇文章主要介紹了詳解在SpringBoot中@Transactional事物操作和事物無效問題排查,本文詳細(xì)的介紹了SpringBoot中集成使用@Transactional注解操作事物以及事物開啟后無效的問題排查,需要的朋友可以參考下2021-06-06Java實(shí)戰(zhàn)之在線寄查快遞系統(tǒng)的實(shí)現(xiàn)
這篇文章主要介紹了如何利用Java制作一個(gè)在線寄查快遞系統(tǒng),文中采用的技術(shù)有java、SpringBoot、FreeMarker、Mysql,需要的可以參考一下2022-02-02Java8新特性之Collectors.joining()實(shí)例詳解
在項(xiàng)目中我們常常要對(duì)list集合的數(shù)據(jù)做一些字符串拼接/處理等相關(guān)操作,下面這篇文章主要給大家介紹了關(guān)于Java8新特性之Collectors.joining()的相關(guān)資料,需要的朋友可以參考下2023-01-01Maven+Tomcat8 實(shí)現(xiàn)自動(dòng)化部署的方法
本篇文章主要介紹了Maven+Tomcat8 實(shí)現(xiàn)自動(dòng)化部署的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10SpringDataJpa如何使用union多表分頁條件查詢
這篇文章主要介紹了SpringDataJpa如何使用union多表分頁條件查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02解決Mybatis在IDEA中找不到mapper映射文件的問題
這篇文章主要介紹了解決Mybatis在IDEA中找不到mapper映射文件的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10