Browse Source

重构分页一大波修改走起

hubin 7 years ago
parent
commit
14b1e6650e
23 changed files with 254 additions and 693 deletions
  1. 5 0
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/interfaces/Func.java
  2. 0 95
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/pagination/Page.java
  3. 0 308
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/pagination/Pagination.java
  4. 0 4
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/pagination/dialect/package-info.java
  5. 0 4
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/pagination/package-info.java
  6. 0 52
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/sql/SqlUtils.java
  7. 0 127
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/CachePaginationInterceptor.java
  8. 93 30
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/PaginationInterceptor.java
  9. 8 9
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/DialectFactory.java
  10. 71 15
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/IPage.java
  11. 2 1
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/PageHelper.java
  12. 63 7
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/Pagination.java
  13. 1 4
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/DB2Dialect.java
  14. 1 4
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/H2Dialect.java
  15. 1 4
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/HSQLDialect.java
  16. 2 2
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/IDialect.java
  17. 1 4
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/MariaDBDialect.java
  18. 1 4
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/MySqlDialect.java
  19. 1 4
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/OracleDialect.java
  20. 1 4
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/PostgreDialect.java
  21. 1 3
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/SQLServer2005Dialect.java
  22. 1 4
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/SQLServerDialect.java
  23. 1 4
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/SQLiteDialect.java

+ 5 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/interfaces/Func.java

@@ -19,6 +19,8 @@ import java.io.Serializable;
 import java.util.Arrays;
 import java.util.Collection;
 
+import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
+
 /**
  * <p>
  * 查询条件封装
@@ -77,6 +79,9 @@ public interface Func<This, R> extends Serializable {
      * 字段 IN (v0, v1, ...)
      */
     default This in(boolean condition, R column, Object... values) {
+        if (ArrayUtils.isEmpty(values)) {
+            return (This) this;
+        }
         return this.in(condition, column, Arrays.asList(values));
     }
 

+ 0 - 95
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/pagination/Page.java

@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2011-2020, hubin (jobob@qq.com).
- * <p>
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.baomidou.mybatisplus.core.pagination;
-
-import java.beans.Transient;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-
-/**
- * <p>
- * 实现分页辅助类
- * </p>
- *
- * @author hubin
- * @since 2016-03-01
- */
-public class Page<T> extends Pagination {
-
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 查询数据列表
-     */
-    private List<T> records = Collections.emptyList();
-
-    /**
-     * 查询参数( 不会传入到 xml 层,这里是 Controller 层与 service 层传递参数预留 )
-     */
-    private Map<String, Object> condition;
-
-    public Page() {
-        /* 注意,传入翻页参数 */
-    }
-
-    public Page(int current, int size) {
-        super(current, size);
-    }
-
-    public Page(int current, int size, String orderByField) {
-        super(current, size);
-        this.setOrderByField(orderByField);
-    }
-
-    public Page(int current, int size, String orderByField, boolean isAsc) {
-        this(current, size, orderByField);
-        this.setAsc(isAsc);
-    }
-
-    public List<T> getRecords() {
-        return records;
-    }
-
-    public Page<T> setRecords(List<T> records) {
-        this.records = records;
-        return this;
-    }
-
-    @Transient
-    public Map<String, Object> getCondition() {
-        return condition;
-    }
-
-    public Page<T> setCondition(Map<String, Object> condition) {
-        this.condition = condition;
-        return this;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder pg = new StringBuilder();
-        pg.append(" Page:{ [").append(super.toString()).append("], ");
-        if (records != null) {
-            pg.append("records-size:").append(records.size());
-        } else {
-            pg.append("records is null");
-        }
-        return pg.append(" }").toString();
-    }
-
-}

+ 0 - 308
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/pagination/Pagination.java

@@ -1,308 +0,0 @@
-/*
- * Copyright (c) 2011-2020, hubin (jobob@qq.com).
- * <p>
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.baomidou.mybatisplus.core.pagination;
-
-import java.beans.Transient;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.ibatis.session.RowBounds;
-
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-import com.baomidou.mybatisplus.core.toolkit.sql.SqlHelper;
-
-/**
- * <p>
- * 简单分页模型
- * </p>
- * 用户可以通过继承 org.apache.ibatis.session.RowBounds实现自己的分页模型<br>
- * 注意:插件仅支持RowBounds及其子类作为分页参数
- *
- * @author hubin
- * @since 2016-01-23
- */
-public class Pagination extends RowBounds implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 总数
-     */
-    private long total;
-
-    /**
-     * 每页显示条数,默认 10
-     */
-    private int size = 10;
-
-    /**
-     * 当前页
-     */
-    private int current = 1;
-
-    /**
-     * 查询总记录数(默认 true)
-     */
-    private boolean searchCount = true;
-
-    /**
-     * 开启排序(默认 true) 只在代码逻辑判断 并不截取sql分析
-     *
-     * @see SqlHelper#fillWrapper
-     **/
-    private boolean openSort = true;
-
-    /**
-     * 优化 Count Sql 设置 false 执行 select count(1) from (listSql)
-     */
-    private boolean optimizeCountSql = true;
-
-    /**
-     * <p>
-     * SQL 排序 ASC 集合
-     * </p>
-     */
-    private List<String> ascs;
-    /**
-     * <p>
-     * SQL 排序 DESC 集合
-     * </p>
-     */
-    private List<String> descs;
-
-    /**
-     * 是否为升序 ASC( 默认: true )
-     *
-     * @see #ascs
-     * @see #descs
-     */
-    private boolean isAsc = true;
-
-    /**
-     * <p>
-     * SQL 排序 ORDER BY 字段,例如: id DESC(根据id倒序查询)
-     * </p>
-     * <p>
-     * DESC 表示按倒序排序(即:从大到小排序)<br>
-     * ASC 表示按正序排序(即:从小到大排序)
-     *
-     * @see #ascs
-     * @see #descs
-     * </p>
-     */
-    private String orderByField;
-
-    public Pagination() {
-        super();
-    }
-
-    /**
-     * <p>
-     * 分页构造函数
-     * </p>
-     *
-     * @param current 当前页
-     * @param size    每页显示条数
-     */
-    public Pagination(int current, int size) {
-        this(current, size, true);
-    }
-
-    public Pagination(int current, int size, boolean searchCount) {
-        this(current, size, searchCount, true);
-    }
-
-    public Pagination(int current, int size, boolean searchCount, boolean openSort) {
-        super(PageHelper.offsetCurrent(current, size), size);
-        if (current > 1) {
-            this.current = current;
-        }
-        this.size = size;
-        this.searchCount = searchCount;
-        this.openSort = openSort;
-    }
-
-    public boolean hasPrevious() {
-        return this.current > 1;
-    }
-
-    public boolean hasNext() {
-        return this.current < this.getPages();
-    }
-
-    public long getTotal() {
-        return total;
-    }
-
-    public Pagination setTotal(long total) {
-        this.total = total;
-        return this;
-    }
-
-    public int getSize() {
-        return size;
-    }
-
-    public Pagination setSize(int size) {
-        this.size = size;
-        return this;
-    }
-
-    /**
-     * 总页数
-     * fixed github /issues/309
-     */
-    public long getPages() {
-        if (this.size == 0) {
-            return 0L;
-        }
-        long pages = this.total / this.size;
-        if (this.total % this.size != 0) {
-            pages++;
-        }
-        return pages;
-    }
-
-    public int getCurrent() {
-        return current;
-    }
-
-    public Pagination setCurrent(int current) {
-        this.current = current;
-        return this;
-    }
-
-    @Transient
-    public boolean isSearchCount() {
-        return searchCount;
-    }
-
-    public Pagination setSearchCount(boolean searchCount) {
-        this.searchCount = searchCount;
-        return this;
-    }
-
-    /**
-     * @see #ascs
-     * @see #descs
-     */
-    @Deprecated
-    @Transient
-    public String getOrderByField() {
-        return orderByField;
-    }
-
-    /**
-     * @see #ascs
-     * @see #descs
-     */
-    public Pagination setOrderByField(String orderByField) {
-        if (StringUtils.isNotEmpty(orderByField)) {
-            this.orderByField = orderByField;
-        }
-        return this;
-    }
-
-    @Transient
-    public boolean isOpenSort() {
-        return openSort;
-    }
-
-    public Pagination setOpenSort(boolean openSort) {
-        this.openSort = openSort;
-        return this;
-    }
-
-    @Transient
-    public boolean isOptimizeCountSql() {
-        return optimizeCountSql;
-    }
-
-    public void setOptimizeCountSql(boolean optimizeCountSql) {
-        this.optimizeCountSql = optimizeCountSql;
-    }
-
-    @Transient
-    public List<String> getAscs() {
-        return orders(isAsc, ascs);
-    }
-
-    private List<String> orders(boolean condition, List<String> columns) {
-        if (condition && StringUtils.isNotEmpty(orderByField)) {
-            if (columns == null) {
-                columns = new ArrayList<>();
-            }
-            if (!columns.contains(orderByField)) {
-                columns.add(orderByField);
-            }
-        }
-        return columns;
-    }
-
-    public Pagination setAscs(List<String> ascs) {
-        this.ascs = ascs;
-        return this;
-    }
-
-    @Transient
-    public List<String> getDescs() {
-        return orders(!isAsc, descs);
-    }
-
-    public Pagination setDescs(List<String> descs) {
-        this.descs = descs;
-        return this;
-    }
-
-    /**
-     * @see #ascs
-     * @see #descs
-     */
-    @Deprecated
-    @Transient
-    public boolean isAsc() {
-        return isAsc;
-    }
-
-    /**
-     * @see #ascs
-     * @see #descs
-     */
-    public Pagination setAsc(boolean isAsc) {
-        this.isAsc = isAsc;
-        return this;
-    }
-
-    @Override
-    @Transient
-    public int getOffset() {
-        return super.getOffset();
-    }
-
-    @Override
-    @Transient
-    public int getLimit() {
-        return super.getLimit();
-    }
-
-    @Override
-    public String toString() {
-        return "Pagination { total=" + total + " ,size=" + size + " ,pages=" + this.getPages() + " ,current=" + current + " }";
-    }
-
-}
-

+ 0 - 4
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/pagination/dialect/package-info.java

@@ -1,4 +0,0 @@
-/**
- * 数据库方言
- */
-package com.baomidou.mybatisplus.core.pagination.dialect;

+ 0 - 4
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/pagination/package-info.java

@@ -1,4 +0,0 @@
-/**
- * 分页相关
- */
-package com.baomidou.mybatisplus.core.pagination;

+ 0 - 52
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/sql/SqlUtils.java

@@ -15,15 +15,10 @@
  */
 package com.baomidou.mybatisplus.core.toolkit.sql;
 
-import java.util.List;
-
 import com.baomidou.mybatisplus.core.enums.SqlLike;
 import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
-import com.baomidou.mybatisplus.core.pagination.Pagination;
 import com.baomidou.mybatisplus.core.parser.ISqlParser;
 import com.baomidou.mybatisplus.core.parser.SqlInfo;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 
 /**
  * <p>
@@ -96,53 +91,6 @@ public class SqlUtils {
         return COUNT_SQL_PARSER.optimizeSql(null, originalSql);
     }
 
-    /**
-     * 查询SQL拼接Order By
-     *
-     * @param originalSql 需要拼接的SQL
-     * @param page        page对象
-     * @param orderBy     是否需要拼接Order By
-     * @return
-     */
-    public static String concatOrderBy(String originalSql, Pagination page, boolean orderBy) {
-        if (orderBy && page.isOpenSort()) {
-            StringBuilder buildSql = new StringBuilder(originalSql);
-            String ascStr = concatOrderBuilder(page.getAscs(), " ASC");
-            String descStr = concatOrderBuilder(page.getDescs(), " DESC");
-            if (StringUtils.isNotEmpty(ascStr) && StringUtils.isNotEmpty(descStr)) {
-                ascStr += ", ";
-            }
-            if (StringUtils.isNotEmpty(ascStr) || StringUtils.isNotEmpty(descStr)) {
-                buildSql.append(" ORDER BY ").append(ascStr).append(descStr);
-            }
-            return buildSql.toString();
-        }
-        return originalSql;
-    }
-
-    /**
-     * 拼接多个排序方法
-     *
-     * @param columns
-     * @param orderWord
-     */
-    private static String concatOrderBuilder(List<String> columns, String orderWord) {
-        if (CollectionUtils.isNotEmpty(columns)) {
-            StringBuilder builder = new StringBuilder(16);
-            for (int i = 0; i < columns.size(); ) {
-                String cs = columns.get(i);
-                if (StringUtils.isNotEmpty(cs)) {
-                    builder.append(cs).append(orderWord);
-                }
-                if (++i != columns.size() && StringUtils.isNotEmpty(cs)) {
-                    builder.append(", ");
-                }
-            }
-            return builder.toString();
-        }
-        return StringUtils.EMPTY;
-    }
-
     /**
      * 格式sql
      *

+ 0 - 127
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/CachePaginationInterceptor.java

@@ -1,127 +0,0 @@
-/*
- * Copyright (c) 2011-2020, hubin (jobob@qq.com).
- * <p>
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.baomidou.mybatisplus.extension.plugins;
-
-import java.sql.Connection;
-import java.util.Properties;
-
-import org.apache.ibatis.executor.Executor;
-import org.apache.ibatis.executor.statement.StatementHandler;
-import org.apache.ibatis.mapping.BoundSql;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.plugin.Interceptor;
-import org.apache.ibatis.plugin.Intercepts;
-import org.apache.ibatis.plugin.Invocation;
-import org.apache.ibatis.plugin.Plugin;
-import org.apache.ibatis.plugin.Signature;
-import org.apache.ibatis.session.ResultHandler;
-import org.apache.ibatis.session.RowBounds;
-
-import com.baomidou.mybatisplus.core.parser.ISqlParser;
-import com.baomidou.mybatisplus.core.parser.SqlInfo;
-import com.baomidou.mybatisplus.core.pagination.Pagination;
-import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
-
-/**
- * <p>
- * 缓存分页拦截器
- * </p>
- *
- * @author hubin
- * @since 2016-01-23
- */
-@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 {
-
-    /**
-     * COUNT SQL 解析
-     */
-    private ISqlParser sqlParser;
-    /**
-     * 溢出总页数,设置第一页
-     */
-    private boolean overflowCurrent = false;
-
-    /**
-     * Physical Pagination Interceptor for all the queries with parameter
-     * {@link RowBounds}
-     */
-    @Override
-    public Object intercept(Invocation invocation) throws Throwable {
-
-        Object target = invocation.getTarget();
-        if (target instanceof StatementHandler) {
-            return super.intercept(invocation);
-        } else {
-            RowBounds rowBounds = (RowBounds) invocation.getArgs()[2];
-            if (rowBounds == null || rowBounds == RowBounds.DEFAULT) {
-                return invocation.proceed();
-            }
-            MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
-            Executor executor = (Executor) invocation.getTarget();
-            Connection connection = executor.getTransaction().getConnection();
-            Object parameterObject = invocation.getArgs()[1];
-            BoundSql boundSql = mappedStatement.getBoundSql(parameterObject);
-            String originalSql = boundSql.getSql();
-            if (rowBounds instanceof Pagination) {
-                Pagination page = (Pagination) rowBounds;
-                if (page.isSearchCount()) {
-                    SqlInfo sqlInfo = SqlUtils.getOptimizeCountSql(page.isOptimizeCountSql(), sqlParser, originalSql);
-                    super.queryTotal(overflowCurrent, sqlInfo.getSql(), mappedStatement, boundSql, page, connection);
-                    if (page.getTotal() <= 0) {
-                        return invocation.proceed();
-                    }
-                }
-            }
-        }
-        return invocation.proceed();
-    }
-
-    @Override
-    public Object plugin(Object target) {
-        if (target instanceof Executor) {
-            return Plugin.wrap(target, this);
-        }
-        if (target instanceof StatementHandler) {
-            return Plugin.wrap(target, this);
-        }
-        return target;
-    }
-
-    @Override
-    public void setProperties(Properties prop) {
-
-    }
-
-    @Override
-    public CachePaginationInterceptor setDialectType(String dialectType) {
-        return this;
-    }
-
-    @Override
-    public CachePaginationInterceptor setSqlParser(ISqlParser sqlParser) {
-        this.sqlParser = sqlParser;
-        return this;
-    }
-
-    @Override
-    public CachePaginationInterceptor setOverflowCurrent(boolean overflowCurrent) {
-        this.overflowCurrent = overflowCurrent;
-        return this;
-    }
-
-}

+ 93 - 30
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/PaginationInterceptor.java

@@ -18,6 +18,8 @@ package com.baomidou.mybatisplus.extension.plugins;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
+import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 
 import org.apache.ibatis.executor.statement.StatementHandler;
@@ -38,15 +40,15 @@ import org.apache.ibatis.session.RowBounds;
 
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.MybatisDefaultParameterHandler;
-import com.baomidou.mybatisplus.core.pagination.PageHelper;
-import com.baomidou.mybatisplus.core.pagination.Pagination;
 import com.baomidou.mybatisplus.core.parser.ISqlParser;
 import com.baomidou.mybatisplus.core.parser.SqlInfo;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
 import com.baomidou.mybatisplus.extension.handlers.SqlParserHandler;
 import com.baomidou.mybatisplus.extension.plugins.pagination.DialectFactory;
+import com.baomidou.mybatisplus.extension.plugins.pagination.IPage;
 import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
 
 /**
@@ -71,7 +73,7 @@ public class PaginationInterceptor extends SqlParserHandler implements Intercept
     /**
      * 溢出总页数,设置第一页
      */
-    private boolean overflowCurrent = false;
+    private boolean overflow = false;
     /**
      * 方言类型
      */
@@ -92,50 +94,63 @@ public class PaginationInterceptor extends SqlParserHandler implements Intercept
     public Object intercept(Invocation invocation) throws Throwable {
         StatementHandler statementHandler = (StatementHandler) PluginUtils.realTarget(invocation.getTarget());
         MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
+
+        // SQL 解析
         this.sqlParser(metaObject);
+
         // 先判断是不是SELECT操作
         MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
         if (!SqlCommandType.SELECT.equals(mappedStatement.getSqlCommandType())) {
             return invocation.proceed();
         }
-        RowBounds rowBounds = (RowBounds) metaObject.getValue("delegate.rowBounds");
+
+        // 针对定义了rowBounds,做为mapper接口方法的参数
+        BoundSql boundSql = (BoundSql) metaObject.getValue("delegate.boundSql");
+        Object paramObj = boundSql.getParameterObject();
+
+        // 判断参数里是否有page对象
+        IPage page = null;
+        if (paramObj instanceof IPage) {
+            page = (IPage) paramObj;
+        } else if (paramObj instanceof Map) {
+            for (Object arg : ((Map) paramObj).values()) {
+                if (arg instanceof IPage) {
+                    page = (IPage) arg;
+                    break;
+                }
+            }
+        }
+
         /* 不需要分页的场合 */
-        if (rowBounds == null || rowBounds == RowBounds.DEFAULT) {
+        if (page == null) {
             // 本地线程分页
             if (localPage) {
                 // 采用ThreadLocal变量处理的分页
-                rowBounds = PageHelper.getPagination();
-                if (rowBounds == null) {
-                    return invocation.proceed();
-                }
+//                page = PageHelper.getPagination();
+//                if (page == null) {
+//                    return invocation.proceed();
+//                }
             } else {
                 // 无需分页
                 return invocation.proceed();
             }
         }
-        // 针对定义了rowBounds,做为mapper接口方法的参数
-        BoundSql boundSql = (BoundSql) metaObject.getValue("delegate.boundSql");
+
         String originalSql = boundSql.getSql();
         Connection connection = (Connection) invocation.getArgs()[0];
-        //TODO: 3.0
         DbType dbType = StringUtils.isNotEmpty(dialectType) ? DbType.getDbType(dialectType) : JdbcUtils.getDbType(connection.getMetaData().getURL());
-        if (rowBounds instanceof Pagination) {
-            Pagination page = (Pagination) rowBounds;
-            boolean orderBy = true;
-            if (page.isSearchCount()) {
-                SqlInfo sqlInfo = SqlUtils.getOptimizeCountSql(page.isOptimizeCountSql(), sqlParser, originalSql);
-                orderBy = sqlInfo.isOrderBy();
-                this.queryTotal(overflowCurrent, sqlInfo.getSql(), mappedStatement, boundSql, page, connection);
-                if (page.getTotal() <= 0) {
-                    return invocation.proceed();
-                }
+
+        boolean orderBy = true;
+        if (page.searchCount()) {
+            SqlInfo sqlInfo = SqlUtils.getOptimizeCountSql(page.optimizeCountSql(), sqlParser, originalSql);
+            orderBy = sqlInfo.isOrderBy();
+            this.queryTotal(overflow, sqlInfo.getSql(), mappedStatement, boundSql, page, connection);
+            if (page.getTotal() <= 0) {
+                return invocation.proceed();
             }
-            String buildSql = SqlUtils.concatOrderBy(originalSql, page, orderBy);
-            originalSql = DialectFactory.buildPaginationSql(page, buildSql, dbType, dialectClazz);
-        } else {
-            // support physical Pagination for RowBounds
-            originalSql = DialectFactory.buildPaginationSql(rowBounds, originalSql, dbType, dialectClazz);
         }
+        String buildSql = concatOrderBy(originalSql, page, orderBy);
+        originalSql = DialectFactory.buildPaginationSql(page, buildSql, dbType, dialectClazz);
 
         /*
          * <p> 禁用内存分页 </p>
@@ -147,6 +162,54 @@ public class PaginationInterceptor extends SqlParserHandler implements Intercept
         return invocation.proceed();
     }
 
+    /**
+     * 查询SQL拼接Order By
+     *
+     * @param originalSql 需要拼接的SQL
+     * @param page        page对象
+     * @param orderBy     是否需要拼接Order By
+     * @return
+     */
+    public static String concatOrderBy(String originalSql, IPage page, boolean orderBy) {
+        if (orderBy && (CollectionUtils.isNotEmpty(page.getAscs())
+            || CollectionUtils.isNotEmpty(page.getDescs()))) {
+            StringBuilder buildSql = new StringBuilder(originalSql);
+            String ascStr = concatOrderBuilder(page.getAscs(), " ASC");
+            String descStr = concatOrderBuilder(page.getDescs(), " DESC");
+            if (StringUtils.isNotEmpty(ascStr) && StringUtils.isNotEmpty(descStr)) {
+                ascStr += ", ";
+            }
+            if (StringUtils.isNotEmpty(ascStr) || StringUtils.isNotEmpty(descStr)) {
+                buildSql.append(" ORDER BY ").append(ascStr).append(descStr);
+            }
+            return buildSql.toString();
+        }
+        return originalSql;
+    }
+
+    /**
+     * 拼接多个排序方法
+     *
+     * @param columns
+     * @param orderWord
+     */
+    private static String concatOrderBuilder(List<String> columns, String orderWord) {
+        if (CollectionUtils.isNotEmpty(columns)) {
+            StringBuilder builder = new StringBuilder(16);
+            for (int i = 0; i < columns.size(); ) {
+                String cs = columns.get(i);
+                if (StringUtils.isNotEmpty(cs)) {
+                    builder.append(cs).append(orderWord);
+                }
+                if (++i != columns.size() && StringUtils.isNotEmpty(cs)) {
+                    builder.append(", ");
+                }
+            }
+            return builder.toString();
+        }
+        return StringUtils.EMPTY;
+    }
+
     /**
      * 查询总记录条数
      *
@@ -155,7 +218,7 @@ public class PaginationInterceptor extends SqlParserHandler implements Intercept
      * @param boundSql
      * @param page
      */
-    protected void queryTotal(boolean overflowCurrent, String sql, MappedStatement mappedStatement, BoundSql boundSql, Pagination page, Connection connection) {
+    protected void queryTotal(boolean overflowCurrent, String sql, MappedStatement mappedStatement, BoundSql boundSql, IPage page, Connection connection) {
         try (PreparedStatement statement = connection.prepareStatement(sql)) {
             DefaultParameterHandler parameterHandler = new MybatisDefaultParameterHandler(mappedStatement, boundSql.getParameterObject(), boundSql);
             parameterHandler.setParameters(statement);
@@ -214,8 +277,8 @@ public class PaginationInterceptor extends SqlParserHandler implements Intercept
         return this;
     }
 
-    public PaginationInterceptor setOverflowCurrent(boolean overflowCurrent) {
-        this.overflowCurrent = overflowCurrent;
+    public PaginationInterceptor setOverflow(boolean overflow) {
+        this.overflow = overflow;
         return this;
     }
 

+ 8 - 9
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/DialectFactory.java

@@ -22,13 +22,11 @@ import org.apache.ibatis.session.RowBounds;
 
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
-import com.baomidou.mybatisplus.core.pagination.PageHelper;
-import com.baomidou.mybatisplus.core.pagination.Pagination;
-import com.baomidou.mybatisplus.core.pagination.dialect.IDialect;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.DB2Dialect;
 import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.H2Dialect;
 import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.HSQLDialect;
+import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.IDialect;
 import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.MariaDBDialect;
 import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.MySqlDialect;
 import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.OracleDialect;
@@ -47,6 +45,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.SQLiteDial
  * @since 2016-01-23
  */
 public class DialectFactory {
+
     /**
      * 方言缓存
      */
@@ -74,17 +73,17 @@ public class DialectFactory {
      * Physical Pagination Interceptor for all the queries with parameter
      * {@link RowBounds}
      *
-     * @param rowBounds
-     * @param buildSql
-     * @param dbType
-     * @param dialectClazz
+     * @param page         翻页对象
+     * @param buildSql     编译 SQL
+     * @param dbType       数据类型
+     * @param dialectClazz 数据库方言
      * @return
      * @throws Exception
      */
-    public static String buildPaginationSql(RowBounds rowBounds, String buildSql, DbType dbType, String dialectClazz)
+    public static String buildPaginationSql(IPage page, String buildSql, DbType dbType, String dialectClazz)
         throws Exception {
         // fix #196
-        return getDialect(dbType, dialectClazz).buildPaginationSql(buildSql, rowBounds.getOffset(), rowBounds.getLimit());
+        return getDialect(dbType, dialectClazz).buildPaginationSql(buildSql, page.offset(), page.getSize());
     }
 
     /**

+ 71 - 15
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/IPage.java

@@ -15,6 +15,8 @@
  */
 package com.baomidou.mybatisplus.extension.plugins.pagination;
 
+import java.util.List;
+
 /**
  * <p>
  * 分页 Page 对象接口
@@ -25,17 +27,59 @@ package com.baomidou.mybatisplus.extension.plugins.pagination;
  */
 public interface IPage {
 
+    /**
+     * <p>
+     * 查询总页数
+     * </p>
+     *
+     * @return true 是 / false 否
+     */
+    default boolean searchCount() {
+        return true;
+    }
+
+    /**
+     * <p>
+     * 降序字段集合
+     * </p>
+     *
+     * @return
+     */
+    default List<String> descs() {
+        return null;
+    }
+
+    /**
+     * <p>
+     * 升序字段集合
+     * </p>
+     *
+     * @return
+     */
+    default List<String> ascs() {
+        return null;
+    }
+
+    /**
+     * <p>
+     * 自动优化 COUNT SQL
+     * </p>
+     *
+     * @return true 是 / false 否
+     */
+    default boolean optimizeCountSql() {
+        return true;
+    }
+
     /**
      * <p>
      * 计算当前分页偏移量
      * </p>
      *
-     * @param current 当前页
-     * @param size    每页显示数量
      * @return
      */
-    default long offsetCurrent(long current, long size) {
-        return current > 0 ? (current - 1) * size : 0;
+    default long offset() {
+        return this.getCurrent() > 0 ? (this.getCurrent() - 1) * this.getSize() : 0;
     }
 
     /**
@@ -46,31 +90,34 @@ public interface IPage {
      * @return
      */
     default long getPages() {
-        if (this.size() == 0) {
+        if (this.getSize() == 0) {
             return 0L;
         }
-        long pages = this.total() / this.size();
-        if (this.total() % this.size() != 0) {
+        long pages = this.getTotal() / this.getSize();
+        if (this.getTotal() % this.getSize() != 0) {
             pages++;
         }
         return pages;
     }
 
-    /**
-     * 总数
-     */
     /**
      * <p>
-     * 当前分页总页
+     * 当前满足条件总行数
      * </p>
      *
      * @return
      */
-    long total();
+    long getTotal();
 
     /**
-     * 每页显示条数,默认 10
+     * <p>
+     * 设置当前满足条件总行数
+     * </p>
+     *
+     * @return 当前对象
      */
+    IPage setTotal(long total);
+
     /**
      * <p>
      * 当前分页总页数
@@ -78,7 +125,7 @@ public interface IPage {
      *
      * @return
      */
-    long size();
+    long getSize();
 
     /**
      * <p>
@@ -87,6 +134,15 @@ public interface IPage {
      *
      * @return
      */
-    long current();
+    long getCurrent();
+
+    /**
+     * <p>
+     * 设置当前页
+     * </p>
+     *
+     * @return 当前对象
+     */
+    IPage setCurrent(long current);
 
 }

+ 2 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/pagination/PageHelper.java → mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/PageHelper.java

@@ -13,9 +13,10 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.baomidou.mybatisplus.core.pagination;
+package com.baomidou.mybatisplus.extension.plugins.pagination;
 
 import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
+import com.baomidou.mybatisplus.core.pagination.Pagination;
 
 
 /**

+ 63 - 7
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/Pagination.java

@@ -16,6 +16,10 @@
 package com.baomidou.mybatisplus.extension.plugins.pagination;
 
 import java.io.Serializable;
+import java.util.Arrays;
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
 
 /**
  * <p>
@@ -46,6 +50,19 @@ public class Pagination<T> implements IPage, Serializable {
      * 查询总记录数(默认 true)
      */
     private boolean searchCount = true;
+    /**
+     * <p>
+     * SQL 排序 ASC 集合
+     * </p>
+     */
+    private List<String> ascs;
+    /**
+     * <p>
+     * SQL 排序 DESC 集合
+     * </p>
+     */
+    private List<String> descs;
+
 
     public Pagination() {
         // to do nothing
@@ -93,12 +110,14 @@ public class Pagination<T> implements IPage, Serializable {
         return this.current < this.getPages();
     }
 
-    public void setTotal(long total) {
+    @Override
+    public Pagination setTotal(long total) {
         this.total = total;
+        return this;
     }
 
     @Override
-    public long total() {
+    public long getTotal() {
         return this.total;
     }
 
@@ -107,25 +126,62 @@ public class Pagination<T> implements IPage, Serializable {
     }
 
     @Override
-    public long size() {
+    public long getSize() {
         return this.size;
     }
 
-    public void setCurrent(long current) {
+    @Override
+    public Pagination setCurrent(long current) {
         this.current = current;
+        return this;
     }
 
-
     @Override
-    public long current() {
+    public long getCurrent() {
         return this.current;
     }
 
-    public boolean isSearchCount() {
+    @Override
+    public boolean searchCount() {
         return searchCount;
     }
 
     public void setSearchCount(boolean searchCount) {
         this.searchCount = searchCount;
     }
+
+    @Override
+    public List<String> ascs() {
+        return ascs;
+    }
+
+    public Pagination setAscs(List<String> ascs) {
+        this.ascs = ascs;
+        return this;
+    }
+
+    public Pagination setAscs(String... ascs) {
+        if (ArrayUtils.isNotEmpty(ascs)) {
+            this.ascs = Arrays.asList(ascs);
+        }
+        return this;
+    }
+
+    @Override
+    public List<String> descs() {
+        return descs;
+    }
+
+    public Pagination setDescs(List<String> descs) {
+        this.descs = descs;
+        return this;
+    }
+
+    public Pagination setDescs(String... descs) {
+        if (ArrayUtils.isNotEmpty(descs)) {
+            this.descs = Arrays.asList(descs);
+        }
+        return this;
+    }
+
 }

+ 1 - 4
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/DB2Dialect.java

@@ -15,9 +15,6 @@
  */
 package com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
 
-
-import com.baomidou.mybatisplus.core.pagination.dialect.IDialect;
-
 /**
  * <p>
  * DB2 数据库分页方言
@@ -44,7 +41,7 @@ public class DB2Dialect implements IDialect {
     }
 
     @Override
-    public String buildPaginationSql(String originalSql, int offset, int limit) {
+    public String buildPaginationSql(String originalSql, long offset, long limit) {
         int startOfSelect = originalSql.toLowerCase().indexOf("select");
         StringBuilder pagingSelect = new StringBuilder(originalSql.length() + 100)
             .append(originalSql.substring(0, startOfSelect)).append("select * from ( select ")

+ 1 - 4
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/H2Dialect.java

@@ -15,9 +15,6 @@
  */
 package com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
 
-
-import com.baomidou.mybatisplus.core.pagination.dialect.IDialect;
-
 /**
  * <p>
  * H2 数据库分页方言
@@ -30,7 +27,7 @@ public class H2Dialect implements IDialect {
 
 
     @Override
-    public String buildPaginationSql(String originalSql, int offset, int limit) {
+    public String buildPaginationSql(String originalSql, long offset, long limit) {
         StringBuilder sql = new StringBuilder(originalSql);
         sql.append(" limit ").append(limit);
         if (offset > 0) {

+ 1 - 4
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/HSQLDialect.java

@@ -15,9 +15,6 @@
  */
 package com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
 
-
-import com.baomidou.mybatisplus.core.pagination.dialect.IDialect;
-
 /**
  * <p>
  * HSQL 数据库分页语句组装实现
@@ -30,7 +27,7 @@ public class HSQLDialect implements IDialect {
 
 
     @Override
-    public String buildPaginationSql(String originalSql, int offset, int limit) {
+    public String buildPaginationSql(String originalSql, long offset, long limit) {
         StringBuilder sql = new StringBuilder(originalSql);
         sql.append(" limit ").append(offset).append(",").append(limit);
         return sql.toString();

+ 2 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/pagination/dialect/IDialect.java → mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/IDialect.java

@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.baomidou.mybatisplus.core.pagination.dialect;
+package com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
 
 /**
  * <p>
@@ -33,5 +33,5 @@ public interface IDialect {
      * @param limit       界限
      * @return 分页语句
      */
-    String buildPaginationSql(String originalSql, int offset, int limit);
+    String buildPaginationSql(String originalSql, long offset, long limit);
 }

+ 1 - 4
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/MariaDBDialect.java

@@ -15,9 +15,6 @@
  */
 package com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
 
-
-import com.baomidou.mybatisplus.core.pagination.dialect.IDialect;
-
 /**
  * <p>
  * MariaDB 数据库分页语句组装实现
@@ -29,7 +26,7 @@ import com.baomidou.mybatisplus.core.pagination.dialect.IDialect;
 public class MariaDBDialect implements IDialect {
 
     @Override
-    public String buildPaginationSql(String originalSql, int offset, int limit) {
+    public String buildPaginationSql(String originalSql, long offset, long limit) {
         StringBuilder sql = new StringBuilder(originalSql);
         sql.append(" LIMIT ").append(offset).append(",").append(limit);
         return sql.toString();

+ 1 - 4
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/MySqlDialect.java

@@ -15,9 +15,6 @@
  */
 package com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
 
-
-import com.baomidou.mybatisplus.core.pagination.dialect.IDialect;
-
 /**
  * <p>
  * MYSQL 数据库分页语句组装实现
@@ -29,7 +26,7 @@ import com.baomidou.mybatisplus.core.pagination.dialect.IDialect;
 public class MySqlDialect implements IDialect {
 
     @Override
-    public String buildPaginationSql(String originalSql, int offset, int limit) {
+    public String buildPaginationSql(String originalSql, long offset, long limit) {
         StringBuilder sql = new StringBuilder(originalSql);
         sql.append(" LIMIT ").append(offset).append(",").append(limit);
         return sql.toString();

+ 1 - 4
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/OracleDialect.java

@@ -15,9 +15,6 @@
  */
 package com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
 
-
-import com.baomidou.mybatisplus.core.pagination.dialect.IDialect;
-
 /**
  * <p>
  * ORACLE 数据库分页语句组装实现
@@ -29,7 +26,7 @@ import com.baomidou.mybatisplus.core.pagination.dialect.IDialect;
 public class OracleDialect implements IDialect {
 
     @Override
-    public String buildPaginationSql(String originalSql, int offset, int limit) {
+    public String buildPaginationSql(String originalSql, long offset, long limit) {
         StringBuilder sql = new StringBuilder();
         sql.append("SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM ( ");
         sql.append(originalSql).append(" ) TMP WHERE ROWNUM <=").append((offset >= 1) ? (offset + limit) : limit);

+ 1 - 4
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/PostgreDialect.java

@@ -15,9 +15,6 @@
  */
 package com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
 
-
-import com.baomidou.mybatisplus.core.pagination.dialect.IDialect;
-
 /**
  * <p>
  * Postgre 数据库分页语句组装实现
@@ -30,7 +27,7 @@ public class PostgreDialect implements IDialect {
 
 
     @Override
-    public String buildPaginationSql(String originalSql, int offset, int limit) {
+    public String buildPaginationSql(String originalSql, long offset, long limit) {
         StringBuilder sql = new StringBuilder(originalSql);
         sql.append(" limit ").append(limit).append(" offset ").append(offset);
         return sql.toString();

+ 1 - 3
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/SQLServer2005Dialect.java

@@ -15,8 +15,6 @@
  */
 package com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
 
-
-import com.baomidou.mybatisplus.core.pagination.dialect.IDialect;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 
 /**
@@ -41,7 +39,7 @@ public class SQLServer2005Dialect implements IDialect {
     }
 
     @Override
-    public String buildPaginationSql(String originalSql, int offset, int limit) {
+    public String buildPaginationSql(String originalSql, long offset, long limit) {
         StringBuilder pagingBuilder = new StringBuilder();
         String orderby = getOrderByPart(originalSql);
         String distinctStr = "";

+ 1 - 4
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/SQLServerDialect.java

@@ -15,9 +15,6 @@
  */
 package com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
 
-
-import com.baomidou.mybatisplus.core.pagination.dialect.IDialect;
-
 /**
  * <p>
  * SQLServer 数据库分页语句组装实现
@@ -30,7 +27,7 @@ public class SQLServerDialect implements IDialect {
 
 
     @Override
-    public String buildPaginationSql(String originalSql, int offset, int limit) {
+    public String buildPaginationSql(String originalSql, long offset, long limit) {
         StringBuilder sql = new StringBuilder(originalSql);
         sql.append(" OFFSET ").append(offset).append(" ROWS FETCH NEXT ");
         sql.append(limit).append(" ROWS ONLY");

+ 1 - 4
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/SQLiteDialect.java

@@ -15,9 +15,6 @@
  */
 package com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
 
-
-import com.baomidou.mybatisplus.core.pagination.dialect.IDialect;
-
 /**
  * <p>
  * SQLite 数据库分页语句组装实现
@@ -30,7 +27,7 @@ public class SQLiteDialect implements IDialect {
 
 
     @Override
-    public String buildPaginationSql(String originalSql, int offset, int limit) {
+    public String buildPaginationSql(String originalSql, long offset, long limit) {
         StringBuilder sql = new StringBuilder(originalSql);
         sql.append(" limit ").append(limit).append(" offset ").append(offset);
         return sql.toString();