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.****.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 }