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 }
转载于:https://www.cnblogs.com/yanduanduan/p/10038628.html
相关资源:List集合分页工具类,正在使用的。