pageHelper分页插件使用
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
所以我们想做分页就很简单了很多,避开了很繁琐的代码