hubin 7 lat temu
rodzic
commit
7967c8aec6

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

@@ -17,8 +17,6 @@ package com.baomidou.mybatisplus.core.toolkit.sql;
 
 import com.baomidou.mybatisplus.core.enums.SqlLike;
 import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
-import com.baomidou.mybatisplus.core.parser.ISqlParser;
-import com.baomidou.mybatisplus.core.parser.SqlInfo;
 
 /**
  * <p>
@@ -31,66 +29,7 @@ import com.baomidou.mybatisplus.core.parser.SqlInfo;
 public class SqlUtils {
 
     private final static SqlFormatter SQL_FORMATTER = new SqlFormatter();
-    private static ISqlParser COUNT_SQL_PARSER = null;
-    private static Class<ISqlParser> DEFAULT_CLASS = null;
 
-    static {
-        try {
-            //TODO: 3.0
-            DEFAULT_CLASS = (Class<ISqlParser>) Class.forName("com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize");
-        } catch (ClassNotFoundException e) {
-            //skip
-        }
-    }
-
-    /**
-     * <p>
-     * 获取 COUNT 原生 SQL 包装
-     * </p>
-     *
-     * @param originalSql
-     * @return
-     */
-    public static String getOriginalCountSql(String originalSql) {
-        return String.format("SELECT COUNT(1) FROM ( %s ) TOTAL", originalSql);
-    }
-
-
-    /**
-     * <p>
-     * 获取CountOptimize
-     * </p>
-     *
-     * @param optimizeCountSql 是否优化 Count SQL
-     * @param sqlParser        Count SQL 解析类
-     * @param originalSql      需要计算Count SQL
-     * @return SqlInfo
-     */
-    public static SqlInfo getOptimizeCountSql(boolean optimizeCountSql, ISqlParser sqlParser, String originalSql) {
-        if (!optimizeCountSql) {
-            return SqlInfo.newInstance().setSql(getOriginalCountSql(originalSql));
-        }
-        // COUNT SQL 解析器
-        if (null == COUNT_SQL_PARSER) {
-            if (null != sqlParser) {
-                // 用户自定义 COUNT SQL 解析
-                COUNT_SQL_PARSER = sqlParser;
-            } else {
-                // 默认 JsqlParser 优化 COUNT
-                try {
-                    if (DEFAULT_CLASS == null) {
-                        //plus-extension not included
-                        return SqlInfo.newInstance().setSql(getOriginalCountSql(originalSql));
-                    }
-                    // TODO 3.0 changed
-                    COUNT_SQL_PARSER = DEFAULT_CLASS.newInstance();
-                } catch (Exception e) {
-                    throw new MybatisPlusException(e);
-                }
-            }
-        }
-        return COUNT_SQL_PARSER.parser(null, originalSql);
-    }
 
     /**
      * 格式sql

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

@@ -47,11 +47,11 @@ import com.baomidou.mybatisplus.core.parser.SqlInfo;
 import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
 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.AbstractSqlParserHandler;
 import com.baomidou.mybatisplus.extension.plugins.pagination.DialectFactory;
 import com.baomidou.mybatisplus.extension.plugins.pagination.PageHelper;
 import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
+import com.baomidou.mybatisplus.extension.toolkit.SqlParserUtils;
 
 import lombok.Setter;
 import lombok.experimental.Accessors;
@@ -185,7 +185,7 @@ public class PaginationInterceptor extends AbstractSqlParserHandler implements I
 
         boolean orderBy = true;
         if (page.getTotal() == 0) {
-            SqlInfo sqlInfo = SqlUtils.getOptimizeCountSql(page.optimizeCountSql(), sqlParser, originalSql);
+            SqlInfo sqlInfo = SqlParserUtils.getOptimizeCountSql(page.optimizeCountSql(), sqlParser, originalSql);
             orderBy = sqlInfo.isOrderBy();
             this.queryTotal(overflow, sqlInfo.getSql(), mappedStatement, boundSql, page, connection);
             if (page.getTotal() <= 0) {

+ 5 - 9
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/optimize/JsqlParserCountOptimize.java

@@ -25,7 +25,7 @@ import org.apache.ibatis.reflection.MetaObject;
 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.sql.SqlUtils;
+import com.baomidou.mybatisplus.extension.toolkit.SqlParserUtils;
 
 import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.Function;
@@ -76,23 +76,19 @@ public class JsqlParserCountOptimize implements ISqlParser {
             //#95 Github, selectItems contains #{} ${}, which will be translated to ?, and it may be in a function: power(#{myInt},2)
             for (SelectItem item : plainSelect.getSelectItems()) {
                 if (item.toString().contains("?")) {
-                    sqlInfo.setSql(SqlUtils.getOriginalCountSql(selectStatement.toString()));
-                    return sqlInfo;
+                    return sqlInfo.setSql(SqlParserUtils.getOriginalCountSql(selectStatement.toString()));
                 }
             }
             // 包含 distinct、groupBy不优化
             if (distinct != null || CollectionUtils.isNotEmpty(groupBy)) {
-                sqlInfo.setSql(SqlUtils.getOriginalCountSql(selectStatement.toString()));
-                return sqlInfo;
+                return sqlInfo.setSql(SqlParserUtils.getOriginalCountSql(selectStatement.toString()));
             }
             // 优化 SQL
             plainSelect.setSelectItems(COUNT_SELECT_ITEM);
-            sqlInfo.setSql(selectStatement.toString());
-            return sqlInfo;
+            return sqlInfo.setSql(selectStatement.toString());
         } catch (Throwable e) {
             // 无法优化使用原 SQL
-            sqlInfo.setSql(SqlUtils.getOriginalCountSql(sql));
-            return sqlInfo;
+            return sqlInfo.setSql(SqlParserUtils.getOriginalCountSql(sql));
         }
     }
 

+ 71 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SqlParserUtils.java

@@ -0,0 +1,71 @@
+/*
+ * 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.toolkit;
+
+import com.baomidou.mybatisplus.core.parser.ISqlParser;
+import com.baomidou.mybatisplus.core.parser.SqlInfo;
+import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
+
+/**
+ * <p>
+ * SQL 解析工具类
+ * </p>
+ *
+ * @author hubin
+ * @since 2018-07-22
+ */
+public class SqlParserUtils {
+    private static ISqlParser COUNT_SQL_PARSER = null;
+
+    /**
+     * <p>
+     * 获取 COUNT 原生 SQL 包装
+     * </p>
+     *
+     * @param originalSql
+     * @return
+     */
+    public static String getOriginalCountSql(String originalSql) {
+        return String.format("SELECT COUNT(1) FROM ( %s ) TOTAL", originalSql);
+    }
+
+    /**
+     * <p>
+     * 获取CountOptimize
+     * </p>
+     *
+     * @param optimizeCountSql 是否优化 Count SQL
+     * @param sqlParser        Count SQL 解析类
+     * @param originalSql      需要计算Count SQL
+     * @return SqlInfo
+     */
+    public static SqlInfo getOptimizeCountSql(boolean optimizeCountSql, ISqlParser sqlParser, String originalSql) {
+        if (!optimizeCountSql) {
+            return SqlInfo.newInstance().setSql(getOriginalCountSql(originalSql));
+        }
+        // COUNT SQL 解析器
+        if (null == COUNT_SQL_PARSER) {
+            if (null != sqlParser) {
+                // 用户自定义 COUNT SQL 解析
+                COUNT_SQL_PARSER = sqlParser;
+            } else {
+                // 默认 JsqlParser 优化 COUNT
+                COUNT_SQL_PARSER = new JsqlParserCountOptimize();
+            }
+        }
+        return COUNT_SQL_PARSER.parser(null, originalSql);
+    }
+}