pageHelper分頁插件使用
1.摘要pageHelper:
com.github.pagehelper.PageHelper是一款好用的開源免費的Mybatis第三方物理分頁插件。
PageHelper是一款好用的開源免費的Mybatis第三方物理分頁插件,其實我並不想加上好用兩個字,但是為了表揚插件作者開源免費的崇高精神,我毫不猶豫的加上了好用一詞作為贊美。
原本以為分頁插件,應該是很簡單的,然而PageHelper比我想象的要復雜許多,它做的很強大,也很徹底,強大到使用者可能並不需要這么多功能,徹底到一參可以兩用。但是,我認為,作為分頁插件,完成物理分頁任務是根本,其它的很多智能並不是必要的,保持它夠傻夠憨,專業術語叫stupid,簡單就是美。
官方網址:https://pagehelper.github.io/
2.下面我們就是使用的方法了
2.1引入依賴
導入依賴
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.1.0</version> </dependency>
2.2增加配置文件
在你的配置文件的包(隨便什么包都行) 新建MyBatisConfig 類
@Configuration public class MyBatisConfig { @Bean public PageHelper pageHelper(){ PageHelper pageHelper = new PageHelper(); Properties p = new Properties(); /** *設置為true時,會將RowBounds第一個參數offset當成pageNum頁碼使用 */ p.setProperty("offsetAsPageNum","true"); /** *設置為true時,使用RowBounds分頁會進行count查詢 */ p.setProperty("rowBoundsWithCount","true"); p.setProperty("reasonable","true"); pageHelper.setProperties(p); return pageHelper; } }
2.3包裝類
在你查詢全部信息方法前,例如我
方法前添加這個包裝類 PageHelper.startPage(page, size);
//我的示例 /** * 分頁接口 * * @param page 當前第幾頁,默認第一頁 * @param size 每頁顯示幾條 */ @GetMapping("page") public Object TestGetVideoALl(@RequestParam(value = "page", defaultValue = "1") int page, @RequestParam(value = "size", defaultValue = "10") int size) { PageHelper.startPage(page, size); List<Video> list = videoService.GetVideoAll(); PageInfo<Video> pageInfo = new PageInfo<>(list); Map<String, Object> data = new HashMap<>(); data.put("total_size",pageInfo.getTotal());//總條數 data.put("tatal_page",pageInfo.getPages());//總頁數 data.put("current_page",page);//當前頁 data.put("data",pageInfo.getList());//數據 return data; }
2.4 PageInfo類屬性
對於該類解析摘抄於 https://blog.csdn.net/sinat_42338962/article/details/84314428
當前頁 private int pageNum; 每頁的數量 private int pageSize; 當前頁的數量 private int size; //由於startRow和endRow不常用,這里說個具體的用法 //可以在頁面中"顯示startRow到endRow 共size條數據" 當前頁面第一個元素在數據庫中的行號 private int startRow; 當前頁面最后一個元素在數據庫中的行號 private int endRow; 總記錄數 private long total; 總頁數 private int pages; 結果集 private List<T> list; 第一頁 private int firstPage; 前一頁 private int prePage; 是否為第一頁 private boolean isFirstPage = false; 是否為最后一頁 private boolean isLastPage = false; 是否有前一頁 private boolean hasPreviousPage = false; 是否有下一頁 private boolean hasNextPage = false; 導航頁碼數 private int navigatePages; 所有導航頁號 private int[] navigatepageNums; 后台分頁 服務器端 service public PageInfo<T> methodName(int pageNum, int pageSize) { //1 設置分頁 PageHelper.startPage(pageNum, pageSize); //2 查詢 List<T> list =TMapper.mapperMethod(); //3 返回 return new PageInfo<>(list); } Web public @ResponseBody DataGridResultInfo methodName (Vovo){ //1 查詢 PageInfo<T> pageInfo = service. methodName (vo.getPage(), vo.getRows()); //2 封裝 return new DataGridBean(pageInfo.getTotal() , pageInfo.getList() ); } 瀏覽器端 Datagrid $(function(){ //繪制datagrid //1 准備數據 // 1.1 列列表 var columnArr = [[ {field:'字段名1',title:'標題1',width:80}, {field:'字段名2',title:'標題2',width:80, formatter:function(value,rows,index){ //filed匹配值(當前的值),當前行,當前行號 return value.info; } } ]]; // 1.2 工具條 var toolbarArr = [ { iconCls: 'icon-add',//按鈕圖標 text : '添加用戶', handler: showadduser//方法名 } ]; // 1.3 請求路徑 var url = "……"; //2 准備參數 var options = { "columns":columnArr, "toolbar":toolbarArr, "striped":true, //隔行換色 "idField":"id", //標識字段 "url":url, //請求路徑 "pagination":true, "rownumbers":true, "pageSize":2, "pageList":[2,4,6,8] }; //3 繪制 $("#id值").datagrid( options ); }); 感覺這個很簡單,沒什么好寫的 不用工具 <c:forEach items="${pageInfo.list}" var="p"> <tr> <td>${p.屬性1}</td> <td>${p.屬性2}</td> <td>${p.屬性…}</td> </tr> </c:forEach>
2.5基本原理
sqlsessionFactory -> sqlSession-> executor -> mybatis sql statement
通過mybatis plugin 增加攔截器,然后拼裝分頁 org.apache.ibatis.plugin.Interceptor
所以我們想做分頁就很簡單了很多,避開了很繁瑣的代碼