Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5d5218d

Browse files
committed
分页插件更新到最新的3.3.1代码。
1 parent 1eca242 commit 5d5218d

File tree

5 files changed

+75
-56
lines changed

5 files changed

+75
-56
lines changed

src/main/java/com/isea533/mybatis/pagehelper/Page.java

+24-19
Original file line numberDiff line numberDiff line change
@@ -39,28 +39,28 @@ of this software and associated documentation files (the "Software"), to deal
3939
public class Page<E> extends ArrayList<E> {
4040
private static final long serialVersionUID = 1L;
4141

42-
private static boolean reasonable = false;
43-
44-
public static void setReasonable(String reasonable) {
45-
Page.reasonable = Boolean.parseBoolean(reasonable);
46-
}
47-
48-
/**
49-
* 不进行count查询
50-
*/
42+
/**不进行count查询*/
5143
private static final int NO_SQL_COUNT = -1;
52-
53-
/**
54-
* 进行count查询
55-
*/
44+
/**进行count查询*/
5645
private static final int SQL_COUNT = 0;
57-
46+
/**页码,从1开始*/
5847
private int pageNum;
48+
/**页面大小*/
5949
private int pageSize;
50+
/**起始行*/
6051
private int startRow;
52+
/**末行*/
6153
private int endRow;
54+
/**总数*/
6255
private long total;
56+
/**总页数*/
6357
private int pages;
58+
/**分页合理化*/
59+
private boolean reasonable;
60+
61+
public Page(){
62+
super();
63+
}
6464

6565
public Page(int pageNum, int pageSize) {
6666
this(pageNum, pageSize, SQL_COUNT);
@@ -72,10 +72,6 @@ public Page(int pageNum, int pageSize, boolean count) {
7272

7373
public Page(int pageNum, int pageSize, int total) {
7474
super(pageSize > -1 ? pageSize : 0);
75-
//分页合理化,针对不合理的页码自动处理
76-
if (reasonable && pageNum <= 0) {
77-
pageNum = 1;
78-
}
7975
this.pageNum = pageNum;
8076
this.pageSize = pageSize;
8177
this.total = total;
@@ -147,6 +143,15 @@ public void setTotal(long total) {
147143
}
148144
}
149145

146+
public void setReasonable(boolean reasonable) {
147+
this.reasonable = reasonable;
148+
//分页合理化,针对不合理的页码自动处理
149+
if (this.reasonable && this.pageNum <= 0) {
150+
this.pageNum = 1;
151+
calculateStartAndEndRow();
152+
}
153+
}
154+
150155
/**
151156
* 计算起止行号
152157
*/
@@ -170,4 +175,4 @@ public String toString() {
170175
", pages=" + pages +
171176
'}';
172177
}
173-
}
178+
}

src/main/java/com/isea533/mybatis/pagehelper/PageHelper.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ public class PageHelper implements Interceptor {
5353
private boolean rowBoundsWithCount = false;
5454
//当设置为true的时候,如果pagesize设置为0(或RowBounds的limit=0),就不执行分页
5555
private boolean pageSizeZero = false;
56-
56+
//分页合理化
57+
private boolean reasonable = false;
5758
/**
5859
* 开始分页
5960
*
@@ -85,14 +86,15 @@ private Page getPage(RowBounds rowBounds) {
8586
Page page = LOCAL_PAGE.get();
8687
//移除本地变量
8788
LOCAL_PAGE.remove();
88-
8989
if (page == null) {
9090
if (offsetAsPageNum) {
9191
page = new Page(rowBounds.getOffset(), rowBounds.getLimit(), rowBoundsWithCount);
9292
} else {
9393
page = new Page(rowBounds, rowBoundsWithCount);
9494
}
9595
}
96+
//分页合理化
97+
page.setReasonable(reasonable);
9698
return page;
9799
}
98100

@@ -163,7 +165,7 @@ public Object intercept(Invocation invocation) throws Throwable {
163165
boundSql = ((MappedStatement) args[0]).getBoundSql(parameterObject);
164166
}
165167
//判断parameterObject,然后赋值
166-
args[1] = SQLUTIL.setPageParameter(parameterObject, boundSql, page);
168+
args[1] = SQLUTIL.setPageParameter(ms, parameterObject, boundSql, page);
167169
//执行分页查询
168170
Object result = invocation.proceed();
169171
//得到处理结果
@@ -208,6 +210,6 @@ public void setProperties(Properties p) {
208210
this.pageSizeZero = Boolean.parseBoolean(pageSizeZero);
209211
//分页合理化,true开启,如果分页参数不合理会自动修正。默认false不启用
210212
String reasonable = p.getProperty("reasonable");
211-
Page.setReasonable(reasonable);
213+
this.reasonable = Boolean.parseBoolean(reasonable);
212214
}
213215
}

src/main/java/com/isea533/mybatis/pagehelper/PageInfo.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -214,11 +214,11 @@ public int getLastPage() {
214214
return lastPage;
215215
}
216216

217-
public boolean isFirstPage() {
217+
public boolean isIsFirstPage() {
218218
return isFirstPage;
219219
}
220220

221-
public boolean isLastPage() {
221+
public boolean isIsLastPage() {
222222
return isLastPage;
223223
}
224224

src/main/java/com/isea533/mybatis/pagehelper/SqlParser.java

+9-5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import net.sf.jsqlparser.statement.Statement;
88
import net.sf.jsqlparser.statement.select.*;
99
import org.apache.ibatis.mapping.BoundSql;
10+
import org.apache.ibatis.mapping.MappedStatement;
1011

1112
import java.util.ArrayList;
1213
import java.util.List;
@@ -53,8 +54,8 @@ public String getPageSql(String sql) {
5354
return simpleParser.getPageSql(sql);
5455
}
5556

56-
public Map setPageParameter(Object parameterObject, BoundSql boundSql, Page page) {
57-
return simpleParser.setPageParameter(parameterObject, boundSql, page);
57+
public Map setPageParameter(MappedStatement ms, Object parameterObject, BoundSql boundSql, Page page) {
58+
return simpleParser.setPageParameter(ms, parameterObject, boundSql, page);
5859
}
5960

6061
public String parse(String sql) {
@@ -89,9 +90,11 @@ public String parse(String sql) {
8990
*/
9091
public void sqlToCount(Select select) {
9192
SelectBody selectBody = select.getSelectBody();
92-
//select中包含参数时在else中处理
93-
if (selectBody instanceof PlainSelect &&
94-
!selectItemsHashParameters(((PlainSelect) selectBody).getSelectItems())) {
93+
// select中包含参数时在else中处理
94+
// select中包含group by时在else中处理
95+
if (selectBody instanceof PlainSelect
96+
&& !selectItemsHashParameters(((PlainSelect) selectBody).getSelectItems())
97+
&& ((PlainSelect) selectBody).getGroupByColumnReferences() == null) {
9598
((PlainSelect) selectBody).setSelectItems(COUNT_ITEM);
9699
} else {
97100
PlainSelect plainSelect = new PlainSelect();
@@ -218,6 +221,7 @@ public boolean orderByHashParameters(List<OrderByElement> orderByElements) {
218221
}
219222
return false;
220223
}
224+
221225
/**
222226
* 判断selectItems是否包含参数,有参数的不能去
223227
*

src/main/java/com/isea533/mybatis/pagehelper/SqlUtil.java

+34-26
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,11 @@ private static MetaObject forObject(Object object) {
7474
return MetaObject.forObject(object, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY);
7575
}
7676

77-
private Parser sqlParser;
77+
private SqlUtil.Parser sqlParser;
7878

7979
//数据库方言 - 使用枚举限制数据库类型
8080
public enum Dialect {
81-
mysql, oracle, hsqldb, postgresql
81+
mysql, mariadb, sqlite, oracle, hsqldb, postgresql
8282
}
8383

8484
/**
@@ -124,8 +124,8 @@ public SqlUtil(String strDialect) {
124124
* @param page
125125
* @return
126126
*/
127-
public Map setPageParameter(Object parameterObject, BoundSql boundSql, Page page) {
128-
return sqlParser.setPageParameter(parameterObject, boundSql, page);
127+
public Map setPageParameter(MappedStatement ms, Object parameterObject, BoundSql boundSql, Page page) {
128+
return sqlParser.setPageParameter(ms, parameterObject, boundSql, page);
129129
}
130130

131131
/**
@@ -160,14 +160,16 @@ public static interface Parser {
160160

161161
String getPageSql(String sql);
162162

163-
Map setPageParameter(Object parameterObject, BoundSql boundSql, Page page);
163+
Map setPageParameter(MappedStatement ms, Object parameterObject, BoundSql boundSql, Page page);
164164
}
165165

166166
public static abstract class SimpleParser implements Parser {
167167
public static Parser newParser(Dialect dialect) {
168168
Parser parser = null;
169169
switch (dialect) {
170170
case mysql:
171+
case mariadb:
172+
case sqlite:
171173
parser = new MysqlParser();
172174
break;
173175
case oracle:
@@ -212,25 +214,33 @@ public String getCountSql(final String sql) {
212214
*/
213215
public abstract String getPageSql(String sql);
214216

215-
public Map setPageParameter(Object parameterObject, BoundSql boundSql, Page page) {
217+
public Map setPageParameter(MappedStatement ms, Object parameterObject, BoundSql boundSql, Page page) {
216218
Map paramMap = null;
217219
if (parameterObject == null) {
218220
paramMap = new HashMap();
219221
} else if (parameterObject instanceof Map) {
220222
paramMap = (Map) parameterObject;
221223
} else {
222224
paramMap = new HashMap();
223-
//这里以及下面使用的地方,主要解决一个参数时的问题,例如使用一个参数Country使用id属性时,不这样处理会导致id=Country
224-
MetaObject metaObject = forObject(parameterObject);
225+
//动态sql时的判断条件不会出现在ParameterMapping中,但是必须有,所以这里需要收集所有的getter属性
226+
//TypeHandlerRegistry可以直接处理的会作为一个直接使用的对象进行处理
227+
boolean hasTypeHandler = ms.getConfiguration().getTypeHandlerRegistry().hasTypeHandler(parameterObject.getClass());
228+
if (!hasTypeHandler) {
229+
MetaObject metaObject = forObject(parameterObject);
230+
for (String name : metaObject.getGetterNames()) {
231+
paramMap.put(name, metaObject.getValue(name));
232+
}
233+
}
234+
//下面这段方法,主要解决一个常见类型的参数时的问题
225235
if (boundSql.getParameterMappings() != null && boundSql.getParameterMappings().size() > 0) {
226236
for (ParameterMapping parameterMapping : boundSql.getParameterMappings()) {
227237
String name = parameterMapping.getProperty();
228238
if (!name.equals(PAGEPARAMETER_FIRST)
229-
&& !name.equals(PAGEPARAMETER_SECOND)) {
230-
if (parameterMapping.getJavaType().isAssignableFrom(parameterObject.getClass())) {
239+
&& !name.equals(PAGEPARAMETER_SECOND)
240+
&& paramMap.get(name) == null) {
241+
if (hasTypeHandler
242+
|| parameterMapping.getJavaType().isAssignableFrom(parameterObject.getClass())) {
231243
paramMap.put(name, parameterObject);
232-
} else {
233-
paramMap.put(name, metaObject.getValue(name));
234244
}
235245
}
236246
}
@@ -244,16 +254,15 @@ public Map setPageParameter(Object parameterObject, BoundSql boundSql, Page page
244254
private static class MysqlParser extends SimpleParser {
245255
@Override
246256
public String getPageSql(String sql) {
247-
StringBuilder sqlBuilder = new StringBuilder(sql.length() + 40);
248-
sqlBuilder.append("select * from (");
257+
StringBuilder sqlBuilder = new StringBuilder(sql.length() + 14);
249258
sqlBuilder.append(sql);
250-
sqlBuilder.append(") as tmp_page limit ?,?");
259+
sqlBuilder.append(" limit ?,?");
251260
return sqlBuilder.toString();
252261
}
253262

254263
@Override
255-
public Map setPageParameter(Object parameterObject, BoundSql boundSql, Page page) {
256-
Map paramMap = super.setPageParameter(parameterObject, boundSql, page);
264+
public Map setPageParameter(MappedStatement ms, Object parameterObject, BoundSql boundSql, Page page) {
265+
Map paramMap = super.setPageParameter(ms, parameterObject, boundSql, page);
257266
paramMap.put(PAGEPARAMETER_FIRST, page.getStartRow());
258267
paramMap.put(PAGEPARAMETER_SECOND, page.getPageSize());
259268
return paramMap;
@@ -272,8 +281,8 @@ public String getPageSql(String sql) {
272281
}
273282

274283
@Override
275-
public Map setPageParameter(Object parameterObject, BoundSql boundSql, Page page) {
276-
Map paramMap = super.setPageParameter(parameterObject, boundSql, page);
284+
public Map setPageParameter(MappedStatement ms, Object parameterObject, BoundSql boundSql, Page page) {
285+
Map paramMap = super.setPageParameter(ms, parameterObject, boundSql, page);
277286
paramMap.put(PAGEPARAMETER_FIRST, page.getEndRow());
278287
paramMap.put(PAGEPARAMETER_SECOND, page.getStartRow());
279288
return paramMap;
@@ -291,8 +300,8 @@ public String getPageSql(String sql) {
291300
}
292301

293302
@Override
294-
public Map setPageParameter(Object parameterObject, BoundSql boundSql, Page page) {
295-
Map paramMap = super.setPageParameter(parameterObject, boundSql, page);
303+
public Map setPageParameter(MappedStatement ms, Object parameterObject, BoundSql boundSql, Page page) {
304+
Map paramMap = super.setPageParameter(ms, parameterObject, boundSql, page);
296305
paramMap.put(PAGEPARAMETER_FIRST, page.getPageSize());
297306
paramMap.put(PAGEPARAMETER_SECOND, page.getStartRow());
298307
return paramMap;
@@ -303,16 +312,15 @@ public Map setPageParameter(Object parameterObject, BoundSql boundSql, Page page
303312
private static class PostgreSQLParser extends SimpleParser {
304313
@Override
305314
public String getPageSql(String sql) {
306-
StringBuilder sqlBuilder = new StringBuilder(sql.length() + 50);
307-
sqlBuilder.append("select * from (");
315+
StringBuilder sqlBuilder = new StringBuilder(sql.length() + 14);
308316
sqlBuilder.append(sql);
309-
sqlBuilder.append(") as tmp_page limit ? offset ?");
317+
sqlBuilder.append(" limit ? offset ?");
310318
return sqlBuilder.toString();
311319
}
312320

313321
@Override
314-
public Map setPageParameter(Object parameterObject, BoundSql boundSql, Page page) {
315-
Map paramMap = super.setPageParameter(parameterObject, boundSql, page);
322+
public Map setPageParameter(MappedStatement ms, Object parameterObject, BoundSql boundSql, Page page) {
323+
Map paramMap = super.setPageParameter(ms, parameterObject, boundSql, page);
316324
paramMap.put(PAGEPARAMETER_FIRST, page.getPageSize());
317325
paramMap.put(PAGEPARAMETER_SECOND, page.getStartRow());
318326
return paramMap;

0 commit comments

Comments
 (0)