1 /* 2 * The MIT License (MIT) 3 * 4 * Copyright (c) 2014 abel533@gmail.com 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 * THE SOFTWARE. 23 */ 24 25 package com.github.pagehelper; 26 27 import org.apache.ibatis.executor.Executor; 28 import org.apache.ibatis.mapping.MappedStatement; 29 import org.apache.ibatis.plugin.*; 30 import org.apache.ibatis.session.ResultHandler; 31 import org.apache.ibatis.session.RowBounds; 32 33 import java.util.Properties; 34 35 /** 36 * Mybatis - 通用分页拦截器 37 * 38 * @author liuzh/abel533/isea533 39 * @version 3.3.0 40 * 项目地址 : http://git.oschina.net/free/Mybatis_PageHelper 41 */ 42 @SuppressWarnings({"rawtypes", "unchecked"}) 43 @Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})) 44 public class PageHelper implements Interceptor { 45 //sql工具类 46 private SqlUtil sqlUtil; 47 48 /** 49 * 开始分页 50 * 51 * @param pageNum 页码 52 * @param pageSize 每页显示数量 53 */ 54 public static Page startPage(int pageNum, int pageSize) { 55 return startPage(pageNum, pageSize, true); 56 } 57 58 /** 59 * 开始分页 60 * 61 * @param pageNum 页码 62 * @param pageSize 每页显示数量 63 * @param orderBy 针对sqlserver - 建议在sql中直接包含order by 64 */ 65 public static Page startPage(int pageNum, int pageSize, String orderBy) { 66 return startPage(pageNum, pageSize, true).orderBy(orderBy); 67 } 68 69 /** 70 * 开始分页 71 * 72 * @param pageNum 页码 73 * @param pageSize 每页显示数量 74 * @param count 是否进行count查询 75 */ 76 public static Page startPage(int pageNum, int pageSize, boolean count) { 77 return startPage(pageNum, pageSize, count, null); 78 } 79 80 /** 81 * 开始分页 82 * 83 * @param pageNum 页码 84 * @param pageSize 每页显示数量 85 * @param count 是否进行count查询 86 * @param reasonable 分页合理化,null时用默认配置 87 */ 88 public static Page startPage(int pageNum, int pageSize, boolean count, Boolean reasonable) { 89 return startPage(pageNum, pageSize, count, reasonable, null); 90 } 91 92 /** 93 * 开始分页 94 * 95 * @param pageNum 页码 96 * @param pageSize 每页显示数量 97 * @param count 是否进行count查询 98 * @param reasonable 分页合理化,null时用默认配置 99 * @param pageSizeZero true且pageSize=0时返回全部结果,false时分页,null时用默认配置 100 */ 101 public static Page startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) { 102 Page page = new Page(pageNum, pageSize, count); 103 page.setReasonable(reasonable); 104 page.setPageSizeZero(pageSizeZero); 105 SqlUtil.setLocalPage(page); 106 return page; 107 } 108 109 /** 110 * 开始分页 111 * 112 * @param params 113 */ 114 public static Page startPage(Object params) { 115 Page page = SqlUtil.getPageFromObject(params); 116 SqlUtil.setLocalPage(page); 117 return page; 118 } 119 120 121 /** 122 * Mybatis拦截器方法 123 * 124 * @param invocation 拦截器入参 125 * @return 返回执行结果 126 * @throws Throwable 抛出异常 127 */ 128 public Object intercept(Invocation invocation) throws Throwable { 129 return sqlUtil.processPage(invocation); 130 } 131 132 /** 133 * 只拦截Executor 134 * 135 * @param target 136 * @return 137 */ 138 public Object plugin(Object target) { 139 if (target instanceof Executor) { 140 return Plugin.wrap(target, this); 141 } else { 142 return target; 143 } 144 } 145 146 /** 147 * 设置属性值 148 * 149 * @param p 属性值 150 */ 151 public void setProperties(Properties p) { 152 //数据库方言 153 String dialect = p.getProperty("dialect"); 154 sqlUtil = new SqlUtil(dialect); 155 sqlUtil.setProperties(p); 156 } 157 }
1 /* 2 * The MIT License (MIT) 3 * 4 * Copyright (c) 2014 abel533@gmail.com 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 * THE SOFTWARE. 23 */ 24 25 package com.github.pagehelper; 26 27 import java.io.Serializable; 28 import java.util.List; 29 30 /** 31 * 对Page<E>结果进行包装 32 * <p/> 33 * 新增分页的多项属性,主要参考:http://bbs.csdn.net/topics/360010907 34 * 35 * @author liuzh/abel533/isea533 36 * @version 3.3.0 37 * @since 3.2.2 38 * 项目地址 : http://git.oschina.net/free/Mybatis_PageHelper 39 */ 40 @SuppressWarnings({"rawtypes", "unchecked"}) 41 public class PageInfo<T> implements Serializable { 42 private static final long serialVersionUID = 1L; 43 //当前页 44 private int pageNum; 45 //每页的数量 46 private int pageSize; 47 //当前页的数量 48 private int size; 49 //由于startRow和endRow不常用,这里说个具体的用法 50 //可以在页面中"显示startRow到endRow 共size条数据" 51 52 //当前页面第一个元素在数据库中的行号 53 private int startRow; 54 //当前页面最后一个元素在数据库中的行号 55 private int endRow; 56 //总记录数 57 private long total; 58 //总页数 59 private int pages; 60 //结果集 61 private List<T> list; 62 63 //第一页 64 private int firstPage; 65 //前一页 66 private int prePage; 67 //下一页 68 private int nextPage; 69 //最后一页 70 private int lastPage; 71 72 //是否为第一页 73 private boolean isFirstPage = false; 74 //是否为最后一页 75 private boolean isLastPage = false; 76 //是否有前一页 77 private boolean hasPreviousPage = false; 78 //是否有下一页 79 private boolean hasNextPage = false; 80 //导航页码数 81 private int navigatePages; 82 //所有导航页号 83 private int[] navigatepageNums; 84 85 /** 86 * 包装Page对象 87 * 88 * @param list 89 */ 90 public PageInfo(List<T> list) { 91 this(list, 8); 92 } 93 94 /** 95 * 包装Page对象 96 * 97 * @param list page结果 98 * @param navigatePages 页码数量 99 */ 100 public PageInfo(List<T> list, int navigatePages) { 101 if (list instanceof Page) { 102 Page page = (Page) list; 103 this.pageNum = page.getPageNum(); 104 this.pageSize = page.getPageSize(); 105 106 this.total = page.getTotal(); 107 this.pages = page.getPages(); 108 this.list = page; 109 this.size = page.size(); 110 //由于结果是>startRow的,所以实际的需要+1 111 if (this.size == 0) { 112 this.startRow = 0; 113 this.endRow = 0; 114 } else { 115 this.startRow = page.getStartRow() + 1; 116 //计算实际的endRow(最后一页的时候特殊) 117 this.endRow = this.startRow - 1 + this.size; 118 } 119 this.navigatePages = navigatePages; 120 //计算导航页 121 calcNavigatepageNums(); 122 //计算前后页,第一页,最后一页 123 calcPage(); 124 //判断页面边界 125 judgePageBoudary(); 126 } 127 } 128 129 /** 130 * 计算导航页 131 */ 132 private void calcNavigatepageNums() { 133 //当总页数小于或等于导航页码数时 134 if (pages <= navigatePages) { 135 navigatepageNums = new int[pages]; 136 for (int i = 0; i < pages; i++) { 137 navigatepageNums[i] = i + 1; 138 } 139 } else { //当总页数大于导航页码数时 140 navigatepageNums = new int[navigatePages]; 141 int startNum = pageNum - navigatePages / 2; 142 int endNum = pageNum + navigatePages / 2; 143 144 if (startNum < 1) { 145 startNum = 1; 146 //(最前navigatePages页 147 for (int i = 0; i < navigatePages; i++) { 148 navigatepageNums[i] = startNum++; 149 } 150 } else if (endNum > pages) { 151 endNum = pages; 152 //最后navigatePages页 153 for (int i = navigatePages - 1; i >= 0; i--) { 154 navigatepageNums[i] = endNum--; 155 } 156 } else { 157 //所有中间页 158 for (int i = 0; i < navigatePages; i++) { 159 navigatepageNums[i] = startNum++; 160 } 161 } 162 } 163 } 164 165 /** 166 * 计算前后页,第一页,最后一页 167 */ 168 private void calcPage() { 169 if (navigatepageNums != null && navigatepageNums.length > 0) { 170 firstPage = navigatepageNums[0]; 171 lastPage = navigatepageNums[navigatepageNums.length - 1]; 172 if (pageNum > 1) { 173 prePage = pageNum - 1; 174 } 175 if (pageNum < pages) { 176 nextPage = pageNum + 1; 177 } 178 } 179 } 180 181 /** 182 * 判定页面边界 183 */ 184 private void judgePageBoudary() { 185 isFirstPage = pageNum == 1; 186 isLastPage = pageNum == pages; 187 hasPreviousPage = pageNum > 1; 188 hasNextPage = pageNum < pages; 189 } 190 191 public void setPageNum(int pageNum) { 192 this.pageNum = pageNum; 193 } 194 195 public int getPageNum() { 196 return pageNum; 197 } 198 199 public int getPageSize() { 200 return pageSize; 201 } 202 203 public int getSize() { 204 return size; 205 } 206 207 public int getStartRow() { 208 return startRow; 209 } 210 211 public int getEndRow() { 212 return endRow; 213 } 214 215 public long getTotal() { 216 return total; 217 } 218 219 public int getPages() { 220 return pages; 221 } 222 223 public List<T> getList() { 224 return list; 225 } 226 227 public int getFirstPage() { 228 return firstPage; 229 } 230 231 public int getPrePage() { 232 return prePage; 233 } 234 235 public int getNextPage() { 236 return nextPage; 237 } 238 239 public int getLastPage() { 240 return lastPage; 241 } 242 243 public boolean isIsFirstPage() { 244 return isFirstPage; 245 } 246 247 public boolean isIsLastPage() { 248 return isLastPage; 249 } 250 251 public boolean isHasPreviousPage() { 252 return hasPreviousPage; 253 } 254 255 public boolean isHasNextPage() { 256 return hasNextPage; 257 } 258 259 public int getNavigatePages() { 260 return navigatePages; 261 } 262 263 public int[] getNavigatepageNums() { 264 return navigatepageNums; 265 } 266 267 @Override 268 public String toString() { 269 final StringBuffer sb = new StringBuffer("PageInfo{"); 270 sb.append("pageNum=").append(pageNum); 271 sb.append(", pageSize=").append(pageSize); 272 sb.append(", size=").append(size); 273 sb.append(", startRow=").append(startRow); 274 sb.append(", endRow=").append(endRow); 275 sb.append(", total=").append(total); 276 sb.append(", pages=").append(pages); 277 sb.append(", list=").append(list); 278 sb.append(", firstPage=").append(firstPage); 279 sb.append(", prePage=").append(prePage); 280 sb.append(", nextPage=").append(nextPage); 281 sb.append(", lastPage=").append(lastPage); 282 sb.append(", isFirstPage=").append(isFirstPage); 283 sb.append(", isLastPage=").append(isLastPage); 284 sb.append(", hasPreviousPage=").append(hasPreviousPage); 285 sb.append(", hasNextPage=").append(hasNextPage); 286 sb.append(", navigatePages=").append(navigatePages); 287 sb.append(", navigatepageNums="); 288 if (navigatepageNums == null) sb.append("null"); 289 else { 290 sb.append('['); 291 for (int i = 0; i < navigatepageNums.length; ++i) 292 sb.append(i == 0 ? "" : ", ").append(navigatepageNums[i]); 293 sb.append(']'); 294 } 295 sb.append('}'); 296 return sb.toString(); 297 } 298 }
所有评论(0)