|
@@ -32,10 +32,12 @@ import org.apache.ibatis.reflection.SystemMetaObject;
|
|
|
import org.apache.ibatis.session.ResultHandler;
|
|
|
import org.apache.ibatis.session.RowBounds;
|
|
|
|
|
|
+import com.baomidou.mybatisplus.enums.DBType;
|
|
|
import com.baomidou.mybatisplus.parser.AbstractSqlParser;
|
|
|
import com.baomidou.mybatisplus.parser.SqlInfo;
|
|
|
import com.baomidou.mybatisplus.plugins.pagination.DialectFactory;
|
|
|
import com.baomidou.mybatisplus.plugins.pagination.Pagination;
|
|
|
+import com.baomidou.mybatisplus.toolkit.JdbcUtils;
|
|
|
import com.baomidou.mybatisplus.toolkit.PluginUtils;
|
|
|
import com.baomidou.mybatisplus.toolkit.SqlUtils;
|
|
|
import com.baomidou.mybatisplus.toolkit.StringUtils;
|
|
@@ -51,12 +53,11 @@ import com.baomidou.mybatisplus.toolkit.StringUtils;
|
|
|
@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
|
|
|
@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
|
|
|
public class CachePaginationInterceptor extends PaginationInterceptor implements Interceptor {
|
|
|
+
|
|
|
+ /* 溢出总页数,设置第一页 */
|
|
|
+ private boolean overflowCurrent = false;
|
|
|
// COUNT SQL 解析
|
|
|
private AbstractSqlParser sqlParser;
|
|
|
- /* Count优化方式 */
|
|
|
- private String optimizeType = "default";
|
|
|
- /* 方言类型 */
|
|
|
- private String dialectType;
|
|
|
/* 方言实现类 */
|
|
|
private String dialectClazz;
|
|
|
|
|
@@ -77,22 +78,23 @@ public class CachePaginationInterceptor extends PaginationInterceptor implements
|
|
|
}
|
|
|
BoundSql boundSql = (BoundSql) metaStatementHandler.getValue("delegate.boundSql");
|
|
|
String originalSql = boundSql.getSql();
|
|
|
-
|
|
|
+ Connection connection = (Connection) invocation.getArgs()[0];
|
|
|
+ DBType dbType = JdbcUtils.getDbType(connection.getMetaData().getURL());
|
|
|
if (rowBounds instanceof Pagination) {
|
|
|
Pagination page = (Pagination) rowBounds;
|
|
|
boolean orderBy = true;
|
|
|
if (page.isSearchCount()) {
|
|
|
String tempSql = originalSql.replaceAll("(?i)ORDER[\\s]+BY", "ORDER BY");
|
|
|
int orderByIndex = tempSql.toUpperCase().lastIndexOf("ORDER BY");
|
|
|
- if(orderByIndex <= -1) {
|
|
|
+ if (orderByIndex <= -1) {
|
|
|
orderBy = false;
|
|
|
}
|
|
|
}
|
|
|
String buildSql = SqlUtils.concatOrderBy(originalSql, page, orderBy);
|
|
|
- originalSql = DialectFactory.buildPaginationSql(page, buildSql, dialectType, dialectClazz);
|
|
|
+ originalSql = DialectFactory.buildPaginationSql(page, buildSql, dbType, dialectClazz);
|
|
|
} else {
|
|
|
// support physical Pagination for RowBounds
|
|
|
- originalSql = DialectFactory.buildPaginationSql(rowBounds, originalSql, dialectType, dialectClazz);
|
|
|
+ originalSql = DialectFactory.buildPaginationSql(rowBounds, originalSql, dbType, dialectClazz);
|
|
|
}
|
|
|
|
|
|
metaStatementHandler.setValue("delegate.boundSql.sql", originalSql);
|
|
@@ -112,8 +114,8 @@ public class CachePaginationInterceptor extends PaginationInterceptor implements
|
|
|
if (rowBounds instanceof Pagination) {
|
|
|
Pagination page = (Pagination) rowBounds;
|
|
|
if (page.isSearchCount()) {
|
|
|
- SqlInfo sqlInfo = SqlUtils.getCountOptimize(sqlParser, originalSql, dialectType);
|
|
|
- super.queryTotal(sqlInfo.getSql(), mappedStatement, boundSql, page, connection);
|
|
|
+ SqlInfo sqlInfo = SqlUtils.getCountOptimize(sqlParser, originalSql);
|
|
|
+ super.queryTotal(overflowCurrent, sqlInfo.getSql(), mappedStatement, boundSql, page, connection);
|
|
|
if (page.getTotal() <= 0) {
|
|
|
return invocation.proceed();
|
|
|
}
|
|
@@ -134,25 +136,18 @@ public class CachePaginationInterceptor extends PaginationInterceptor implements
|
|
|
}
|
|
|
|
|
|
public void setProperties(Properties prop) {
|
|
|
- String dialectType = prop.getProperty("dialectType");
|
|
|
String dialectClazz = prop.getProperty("dialectClazz");
|
|
|
- if (StringUtils.isNotEmpty(dialectType)) {
|
|
|
- this.dialectType = dialectType;
|
|
|
- }
|
|
|
if (StringUtils.isNotEmpty(dialectClazz)) {
|
|
|
this.dialectClazz = dialectClazz;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void setDialectType(String dialectType) {
|
|
|
- this.dialectType = dialectType;
|
|
|
+ public void setSqlParser(AbstractSqlParser sqlParser) {
|
|
|
+ this.sqlParser = sqlParser;
|
|
|
}
|
|
|
|
|
|
- public void setOptimizeType(String optimizeType) {
|
|
|
- this.optimizeType = optimizeType;
|
|
|
+ public void setOverflowCurrent(boolean overflowCurrent) {
|
|
|
+ this.overflowCurrent = overflowCurrent;
|
|
|
}
|
|
|
|
|
|
- public void setSqlParser(AbstractSqlParser sqlParser) {
|
|
|
- this.sqlParser = sqlParser;
|
|
|
- }
|
|
|
}
|