转载:https://blog.csdn.net/sinat_42338962/article/details/84314428
https://docs.qq.com/doc/DZkhaZWRKc2VGa3l3
1.参考封装PageInfo类
package com.github.pagehelper; import java.io.Serializable; import java.util.Collection; import java.util.List; /** * 对Page<E>结果进行包装 * <p/> * 新增分页的多项属性,主要参考:http://bbs.csdn.net/topics/360010907 * * @author liuzh/abel533/isea533 * @version 3.3.0 * @since 3.2.2 * 项目地址 : http://git.oschina.net/free/Mybatis_PageHelper */ @SuppressWarnings({"rawtypes", "unchecked"}) public class PageInfo<T> implements Serializable { private static final long serialVersionUID = 1L; //当前页 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 prePage; //下一页 private int nextPage; //是否为第一页 private boolean isFirstPage = false; //是否为最后一页 private boolean isLastPage = false; //是否有前一页 private boolean hasPreviousPage = false; //是否有下一页 private boolean hasNextPage = false; //导航页码数 private int navigatePages; //所有导航页号 private int[] navigatepageNums; //导航条上的第一页 private int navigateFirstPage; //导航条上的最后一页 private int navigateLastPage; public PageInfo() { } /** * 包装Page对象 * * @param list */ public PageInfo(List<T> list) { this(list, 8); } /** * 包装Page对象 * * @param list page结果 * @param navigatePages 页码数量 */ public PageInfo(List<T> list, int navigatePages) { if (list instanceof Page) { Page page = (Page) list; this.pageNum = page.getPageNum(); this.pageSize = page.getPageSize(); this.pages = page.getPages(); this.list = page; this.size = page.size(); this.total = page.getTotal(); //由于结果是>startRow的,所以实际的需要+1 if (this.size == 0) { this.startRow = 0; this.endRow = 0; } else { this.startRow = page.getStartRow() + 1; //计算实际的endRow(最后一页的时候特殊) this.endRow = this.startRow - 1 + this.size; } } else if (list instanceof Collection) { this.pageNum = 1; this.pageSize = list.size(); this.pages = this.pageSize > 0 ? 1 : 0; this.list = list; this.size = list.size(); this.total = list.size(); this.startRow = 0; this.endRow = list.size() > 0 ? list.size() - 1 : 0; } if (list instanceof Collection) { this.navigatePages = navigatePages; //计算导航页 calcNavigatepageNums(); //计算前后页,第一页,最后一页 calcPage(); //判断页面边界 judgePageBoudary(); } } /** * 计算导航页 */ private void calcNavigatepageNums() { //当总页数小于或等于导航页码数时 if (pages <= navigatePages) { navigatepageNums = new int[pages]; for (int i = 0; i < pages; i++) { navigatepageNums[i] = i + 1; } } else { //当总页数大于导航页码数时 navigatepageNums = new int[navigatePages]; int startNum = pageNum - navigatePages / 2; int endNum = pageNum + navigatePages / 2; if (startNum < 1) { startNum = 1; //(最前navigatePages页 for (int i = 0; i < navigatePages; i++) { navigatepageNums[i] = startNum++; } } else if (endNum > pages) { endNum = pages; //最后navigatePages页 for (int i = navigatePages - 1; i >= 0; i--) { navigatepageNums[i] = endNum--; } } else { //所有中间页 for (int i = 0; i < navigatePages; i++) { navigatepageNums[i] = startNum++; } } } } /** * 计算前后页,第一页,最后一页 */ private void calcPage() { if (navigatepageNums != null && navigatepageNums.length > 0) { navigateFirstPage = navigatepageNums[0]; navigateLastPage = navigatepageNums[navigatepageNums.length - 1]; if (pageNum > 1) { prePage = pageNum - 1; } if (pageNum < pages) { nextPage = pageNum + 1; } } } /** * 判定页面边界 */ private void judgePageBoudary() { isFirstPage = pageNum == 1; isLastPage = pageNum == pages || pages == 0;; hasPreviousPage = pageNum > 1; hasNextPage = pageNum < pages; } 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 getSize() { return size; } public void setSize(int size) { this.size = size; } public int getStartRow() { return startRow; } public void setStartRow(int startRow) { this.startRow = startRow; } public int getEndRow() { return endRow; } public void setEndRow(int endRow) { this.endRow = endRow; } public long getTotal() { return total; } public void setTotal(long total) { this.total = total; } public int getPages() { return pages; } public void setPages(int pages) { this.pages = pages; } public List<T> getList() { return list; } public void setList(List<T> list) { this.list = list; } @Deprecated // firstPage就是1, 此函数获取的是导航条上的第一页, 容易产生歧义 public int getFirstPage() { return navigateFirstPage; } @Deprecated public void setFirstPage(int firstPage) { this.navigateFirstPage = firstPage; } public int getPrePage() { return prePage; } public void setPrePage(int prePage) { this.prePage = prePage; } public int getNextPage() { return nextPage; } public void setNextPage(int nextPage) { this.nextPage = nextPage; } @Deprecated // 请用getPages()来获取最后一页, 此函数获取的是导航条上的最后一页, 容易产生歧义. public int getLastPage() { return navigateLastPage; } @Deprecated public void setLastPage(int lastPage) { this.navigateLastPage = lastPage; } public boolean isIsFirstPage() { return isFirstPage; } public void setIsFirstPage(boolean isFirstPage) { this.isFirstPage = isFirstPage; } public boolean isIsLastPage() { return isLastPage; } public void setIsLastPage(boolean isLastPage) { this.isLastPage = isLastPage; } public boolean isHasPreviousPage() { return hasPreviousPage; } public void setHasPreviousPage(boolean hasPreviousPage) { this.hasPreviousPage = hasPreviousPage; } public boolean isHasNextPage() { return hasNextPage; } public void setHasNextPage(boolean hasNextPage) { this.hasNextPage = hasNextPage; } public int getNavigatePages() { return navigatePages; } public void setNavigatePages(int navigatePages) { this.navigatePages = navigatePages; } public int[] getNavigatepageNums() { return navigatepageNums; } public void setNavigatepageNums(int[] navigatepageNums) { this.navigatepageNums = navigatepageNums; } public int getNavigateFirstPage() { return navigateFirstPage; } public int getNavigateLastPage() { return navigateLastPage; } public void setNavigateFirstPage(int navigateFirstPage) { this.navigateFirstPage = navigateFirstPage; } public void setNavigateLastPage(int navigateLastPage) { this.navigateLastPage = navigateLastPage; } @Override public String toString() { final StringBuffer sb = new StringBuffer("PageInfo{"); sb.append("pageNum=").append(pageNum); sb.append(", pageSize=").append(pageSize); sb.append(", size=").append(size); sb.append(", startRow=").append(startRow); sb.append(", endRow=").append(endRow); sb.append(", total=").append(total); sb.append(", pages=").append(pages); sb.append(", list=").append(list); sb.append(", prePage=").append(prePage); sb.append(", nextPage=").append(nextPage); sb.append(", isFirstPage=").append(isFirstPage); sb.append(", isLastPage=").append(isLastPage); sb.append(", hasPreviousPage=").append(hasPreviousPage); sb.append(", hasNextPage=").append(hasNextPage); sb.append(", navigatePages=").append(navigatePages); sb.append(", navigateFirstPage=").append(navigateFirstPage); sb.append(", navigateLastPage=").append(navigateLastPage); sb.append(", navigatepageNums="); if (navigatepageNums == null) sb.append("null"); else { sb.append('['); for (int i = 0; i < navigatepageNums.length; ++i) sb.append(i == 0 ? "" : ", ").append(navigatepageNums[i]); sb.append(']'); } sb.append('}'); return sb.toString(); } }
2.PageInfo属性表
1 当前页 2 private int pageNum; 3 每页的数量 4 private int pageSize; 5 当前页的数量 6 private int size; 7 //由于startRow和endRow不常用,这里说个具体的用法 8 //可以在页面中"显示startRow到endRow 共size条数据" 9 10 当前页面第一个元素在数据库中的行号 11 private int startRow; 12 当前页面最后一个元素在数据库中的行号 13 private int endRow; 14 总记录数 15 private long total; 16 总页数 17 private int pages; 18 结果集 19 private List<T> list; 20 21 第一页 22 private int firstPage; 23 前一页 24 private int prePage; 25 26 是否为第一页 27 private boolean isFirstPage = false; 28 是否为最后一页 29 private boolean isLastPage = false; 30 是否有前一页 31 private boolean hasPreviousPage = false; 32 是否有下一页 33 private boolean hasNextPage = false; 34 导航页码数 35 private int navigatePages; 36 所有导航页号 37 private int[] navigatepageNums; 38 后台分页 39 40 服务器端 41 service 42 public PageInfo<T> methodName(int pageNum, int pageSize) { 43 //1 设置分页 44 PageHelper.startPage(pageNum, pageSize); 45 //2 查询 46 List<T> list =TMapper.mapperMethod(); 47 //3 返回 48 return new PageInfo<>(list); 49 } 50 Web 51 public @ResponseBody DataGridResultInfo methodName (Vovo){ 52 //1 查询 53 PageInfo<T> pageInfo = service. methodName (vo.getPage(), vo.getRows()); 54 //2 封装 55 return new DataGridBean(pageInfo.getTotal() , pageInfo.getList() ); 56 } 57 58 浏览器端 59 Datagrid 60 61 $(function(){ 62 //绘制datagrid 63 //1 准备数据 64 // 1.1 列列表 65 var columnArr = [[ 66 {field:'字段名1',title:'标题1',width:80}, 67 {field:'字段名2',title:'标题2',width:80, 68 formatter:function(value,rows,index){ 69 //filed匹配值(当前的值),当前行,当前行号 70 return value.info; 71 } 72 } 73 ]]; 74 // 1.2 工具条 75 var toolbarArr = [ 76 { 77 iconCls: 'icon-add',//按钮图标 78 text : '添加用户', 79 handler: showadduser//方法名 80 } 81 ]; 82 // 1.3 请求路径 83 var url = "……"; 84 85 //2 准备参数 86 var options = { 87 "columns":columnArr, 88 "toolbar":toolbarArr, 89 "striped":true, //隔行换色 90 "idField":"id", //标识字段 91 "url":url, //请求路径 92 "pagination":true, 93 "rownumbers":true, 94 "pageSize":2, 95 "pageList":[2,4,6,8] 96 }; 97 98 //3 绘制 99 $("#id值").datagrid( options ); 100 101 }); 102 103 感觉这个很简单,没什么好写的 104 不用工具 105 <c:forEach items="${pageInfo.list}" var="p"> 106 <tr> 107 <td>${p.属性1}</td> 108 <td>${p.属性2}</td> 109 <td>${p.属性…}</td> 110 </tr> 111 </c:forEach>
3.MyBatis分页插件-PageHelper的配置与应用
以下转载于:https://www.cnblogs.com/li150dan/p/9706585.html
下载地址:https://github.com/pagehelper/Mybatis-PageHelper
Pagehelper 下载地址:
http://repo1.maven.org/maven2/com/github/pagehelper/pagehelper/
jsqlparser 下载地址:
http://repo1.maven.org/maven2/com/github/jsqlparser/jsqlparser/
使用步骤:
pom.xml 引入依赖:
<!-- pagehelper :分页插件 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency> <!-- pagehelper的依赖包:jsqlparser --> <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId>jsqlparser</artifactId> <version>0.9.5</version> </dependency>
1、导入相关包 pagehelper-x.x.x.jar 和 jsqlparser-x.x.x.jar。
2、在MyBatis全局配置文件中配置分页插件。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!-- 注意 <plugins> 在xml文件中的位置,必须要符合 http://mybatis.org/dtd/mybatis-3-config.dtd 中指定的顺序:--> <!-- configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, plugins?, environments?, databaseIdProvider?, mappers?) --> <configuration> <!-- 为SQL定义部分的parameterType或resultType属性指定自定义类型的别名 --> <typeAliases> <typeAlias alias="ServiceStation" type="com.mybatis.models.ServiceStation" /> <typeAlias alias="InspectorInfo" type="com.mybatis.models.InspectorInfo" /> <typeAlias alias="StationInspector" type="com.mybatis.models.StationInspector" /> </typeAliases> <!-- 配置分页拦截器 --> <plugins> <!-- 配置分页插件 --> <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin> <!-- com.mybatis.util为PageHelper类所在包名 --> <!-- <plugin interceptor="com.mybatis.util.PagePlugin"> --> <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库--> <!-- <property name="dialect" value="SQLite" /> --> <!-- <property name="pageSqlId" value=".*Page.*" /> --> <!-- </plugin> --> </plugins> <!-- 设置数据库连接参数 --> <!-- 与spring 集成之后,这些可以完全删除,数据库连接的管理交给 spring 去管理 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> <property name="url" value="jdbc:sqlserver://mssql-rw-cyp-coopbusiness.vip.test.suixinhuan.com;DatabaseName=CYP_CoopBusiness" /> <property name="username" value="Umanager" /> <property name="password" value="ASD123asd!1" /> </dataSource> </environment> </environments> <!-- 加载SQL定义文件 --> <!-- 这里交给sqlSessionFactory 的 mapperLocations属性去得到所有配置信息 --> <mappers> <mapper resource="com/mybatis/sql/ServiceStation.xml" /> <mapper resource="com/mybatis/sql/InspectorInfo.xml" /> <mapper resource="com/mybatis/sql/StationInspector.xml" /> </mappers> </configuration>
3、使用PageHelper提供的方法进行分页
1 package com.mybatis; 2 3 import java.util.List; 4 5 import org.apache.ibatis.session.SqlSession; 6 7 import com.github.pagehelper.Page; 8 import com.github.pagehelper.PageHelper; 9 import com.github.pagehelper.PageInfo; 10 import com.mybatis.dao.InspectorInfoMapper; 11 import com.mybatis.dao.MyBatisUtil; 12 import com.mybatis.dao.ServiceStationMapper; 13 import com.mybatis.dao.StationInspectorMapper; 14 import com.mybatis.models.ServiceStation; 15 import com.mybatis.models.InspectorInfo; 16 import com.mybatis.models.StationInspector; 17 //import com.mybatis.util.Page; 18 19 /* 20 * 测试类 21 */ 22 public class HelloMyBatisProgram { 23 public static void main(String[] args) { 24 SqlSession session = MyBatisUtil.getSession(); 25 //由框架生成ServiceStationMapper接口实现对象 26 ServiceStationMapper ssDaoMaper = session.getMapper(ServiceStationMapper.class); 27 InspectorInfoMapper iiDaoMaper = session.getMapper(InspectorInfoMapper.class); 28 StationInspectorMapper siDaoMaper = session.getMapper(StationInspectorMapper.class); 29 //System.out.println(ssDaoMaper.getClass().getName()); 30 System.out.println("===========分页获取所有服务站列表============"); 31 32 //分页设置放在查询之前 33 Page<Object> page = PageHelper.startPage(1, 5, "StationName"); 34 List<ServiceStation> listPage = ssDaoMaper.findAllPage("110100"); 35 for(ServiceStation item:listPage) { 36 System.out.println(item.getStationName()+" "+item.getCityCode()+" "+item.getCityName()); 37 } 38 System.out.println("当前页码:"+page.getPageNum()); 39 System.out.println("每页的记录数:"+page.getPageSize()); 40 System.out.println("总记录数:"+page.getTotal()); 41 System.out.println("总页码:"+page.getPages()); 42 } 43 }
4、可以使用更强大的PageInfo封装返回结果
1 package com.mybatis; 2 3 import java.util.List; 4 5 import org.apache.ibatis.session.SqlSession; 6 7 import com.github.pagehelper.Page; 8 import com.github.pagehelper.PageHelper; 9 import com.github.pagehelper.PageInfo; 10 import com.mybatis.dao.InspectorInfoMapper; 11 import com.mybatis.dao.MyBatisUtil; 12 import com.mybatis.dao.ServiceStationMapper; 13 import com.mybatis.dao.StationInspectorMapper; 14 import com.mybatis.models.ServiceStation; 15 import com.mybatis.models.InspectorInfo; 16 import com.mybatis.models.StationInspector; 17 //import com.mybatis.util.Page; 18 19 /* 20 * 测试类 21 */ 22 public class HelloMyBatisProgram { 23 public static void main(String[] args) { 24 SqlSession session = MyBatisUtil.getSession(); 25 //由框架生成ServiceStationMapper接口实现对象 26 ServiceStationMapper ssDaoMaper = session.getMapper(ServiceStationMapper.class); 27 InspectorInfoMapper iiDaoMaper = session.getMapper(InspectorInfoMapper.class); 28 StationInspectorMapper siDaoMaper = session.getMapper(StationInspectorMapper.class); 29 //System.out.println(ssDaoMaper.getClass().getName()); 30 System.out.println("===========分页获取所有服务站列表============"); 31 32 //分页设置放在查询之前 33 page = PageHelper.startPage(1, 3, "StationName desc"); 34 List<ServiceStation> list = ssDaoMaper.findAll(); 35 for(ServiceStation item:list) { 36 System.out.println(item.getStationName()+" "+item.getCityCode()+" "+item.getCityName()); 37 } 38 PageInfo<ServiceStation> info = new PageInfo<ServiceStation>(list, 3); 39 System.out.println("当前页码:"+info.getPageNum()); 40 System.out.println("每页的记录数:"+info.getPageSize()); 41 System.out.println("总记录数:"+info.getTotal()); 42 System.out.println("总页码:"+info.getPages()); 43 System.out.println("是否第一页:"+info.isIsFirstPage()); 44 System.out.println("连续显示的页码:"); 45 int[] nums = info.getNavigatepageNums(); 46 for (int i = 0; i < nums.length; i++) { 47 System.out.println(nums[i]); 48 } 49 } 50 }