Browse Source

直接依赖 jsqlparser

= 8 years ago
parent
commit
1b1296beb2

+ 5 - 12
pom.xml

@@ -81,6 +81,11 @@
             <artifactId>mybatis</artifactId>
             <version>${mybatis.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.github.jsqlparser</groupId>
+            <artifactId>jsqlparser</artifactId>
+            <version>${jsqlparser.version}</version>
+        </dependency>
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>servlet-api</artifactId>
@@ -149,14 +154,6 @@
             <scope>provided</scope>
         </dependency>
         <!-- spring end -->
-        <!--jsqlparser -->
-        <dependency>
-            <groupId>com.github.jsqlparser</groupId>
-            <artifactId>jsqlparser</artifactId>
-            <version>${jsqlparser.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <!--jsqlparser -->
         <!--druid -->
         <dependency>
             <groupId>com.alibaba</groupId>
@@ -284,10 +281,6 @@
                         <goals>
                             <goal>jar</goal>
                         </goals>
-                        <configuration>
-                            <javadocExecutable>${java.home}/../bin/javadoc</javadocExecutable>
-                            <additionalparam>-Xdoclint:none</additionalparam>
-                        </configuration>
                     </execution>
                 </executions>
             </plugin>

+ 0 - 74
src/main/java/com/baomidou/mybatisplus/enums/Optimize.java

@@ -1,74 +0,0 @@
-/**
- * Copyright (c) 2011-2014, 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.enums;
-
-/**
- * <p>
- * Count优化枚举
- * </p>
- *
- * @author Caratacus
- * @Date 2016-11-30
- */
-public enum Optimize {
-    /**
-     * 默认支持方式
-     */
-    DEFAULT("default", "默认方式"),
-    /**
-     * aliDruid,需添加相关依赖jar包
-     */
-    ALI_DRUID("aliDruid", "依赖aliDruid模式"),
-    /**
-     * jsqlparser方式,需添加相关依赖jar包
-     */
-    JSQLPARSER("jsqlparser", "jsqlparser方式");
-
-    private final String optimize;
-
-    private final String desc;
-
-    Optimize(final String optimize, final String desc) {
-        this.optimize = optimize;
-        this.desc = desc;
-    }
-
-    /**
-     * <p>
-     * 获取优化类型.如果没有找到默认DEFAULT
-     * </p>
-     *
-     * @param optimizeType 优化方式
-     * @return
-     */
-    public static Optimize getOptimizeType(String optimizeType) {
-        for (Optimize optimize : Optimize.values()) {
-            if (optimize.getOptimize().equalsIgnoreCase(optimizeType)) {
-                return optimize;
-            }
-        }
-        return DEFAULT;
-    }
-
-    public String getOptimize() {
-        return this.optimize;
-    }
-
-    public String getDesc() {
-        return this.desc;
-    }
-
-}

+ 3 - 4
src/main/java/com/baomidou/mybatisplus/plugins/CachePaginationInterceptor.java

@@ -32,10 +32,10 @@ import org.apache.ibatis.reflection.SystemMetaObject;
 import org.apache.ibatis.session.ResultHandler;
 import org.apache.ibatis.session.RowBounds;
 
-import com.baomidou.mybatisplus.plugins.pagination.DialectFactory;
-import com.baomidou.mybatisplus.plugins.pagination.Pagination;
 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.PluginUtils;
 import com.baomidou.mybatisplus.toolkit.SqlUtils;
 import com.baomidou.mybatisplus.toolkit.StringUtils;
@@ -112,8 +112,7 @@ public class CachePaginationInterceptor extends PaginationInterceptor implements
             if (rowBounds instanceof Pagination) {
                 Pagination page = (Pagination) rowBounds;
                 if (page.isSearchCount()) {
-                    SqlInfo sqlInfo = SqlUtils.getCountOptimize(sqlParser, originalSql, optimizeType,
-                            dialectType, page.isOptimizeCount());
+                    SqlInfo sqlInfo = SqlUtils.getCountOptimize(sqlParser, originalSql, dialectType);
                     super.queryTotal(sqlInfo.getSql(), mappedStatement, boundSql, page, connection);
                     if (page.getTotal() <= 0) {
                         return invocation.proceed();

+ 1 - 8
src/main/java/com/baomidou/mybatisplus/plugins/PaginationInterceptor.java

@@ -65,8 +65,6 @@ public class PaginationInterceptor implements Interceptor {
     private boolean overflowCurrent = false;
     /* 是否设置动态数据源 设置之后动态获取当前数据源 */
     private boolean dynamicDataSource = false;
-    /* Count优化方式 */
-    private String optimizeType = "default";
     /* 方言类型 */
     private String dialectType;
     /* 方言实现类 */
@@ -109,8 +107,7 @@ public class PaginationInterceptor implements Interceptor {
             Pagination page = (Pagination) rowBounds;
             boolean orderBy = true;
             if (page.isSearchCount()) {
-                SqlInfo sqlInfo = SqlUtils.getCountOptimize(sqlParser, originalSql, optimizeType,
-                        dialectType, page.isOptimizeCount());
+                SqlInfo sqlInfo = SqlUtils.getCountOptimize(sqlParser, originalSql, dialectType);
                 orderBy = sqlInfo.isOrderBy();
                 this.queryTotal(sqlInfo.getSql(), mappedStatement, boundSql, page, connection);
                 if (page.getTotal() <= 0) {
@@ -197,10 +194,6 @@ public class PaginationInterceptor implements Interceptor {
         this.overflowCurrent = overflowCurrent;
     }
 
-    public void setOptimizeType(String optimizeType) {
-        this.optimizeType = optimizeType;
-    }
-
     public void setDynamicDataSource(boolean dynamicDataSource) {
         this.dynamicDataSource = dynamicDataSource;
     }

+ 0 - 15
src/main/java/com/baomidou/mybatisplus/plugins/pagination/Pagination.java

@@ -57,13 +57,6 @@ public class Pagination extends RowBounds implements Serializable {
      **/
     private boolean openSort = true;
 
-    /**
-     * 查询总数优化(默认 false 该属性只针对于Optimize.DEFAULT有效)
-     *
-     * @see com.baomidou.mybatisplus.enums.Optimize
-     */
-    private boolean optimizeCount = false;
-
     /**
      * <p>
      * SQL 排序 ORDER BY 字段,例如: id DESC(根据id倒序查询)
@@ -172,14 +165,6 @@ public class Pagination extends RowBounds implements Serializable {
         this.searchCount = searchCount;
     }
 
-    public boolean isOptimizeCount() {
-        return optimizeCount;
-    }
-
-    public void setOptimizeCount(boolean optimizeCount) {
-        this.optimizeCount = optimizeCount;
-    }
-
     public String getOrderByField() {
         return orderByField;
     }

+ 0 - 45
src/main/java/com/baomidou/mybatisplus/plugins/pagination/optimize/AliDruidCountOptimize.java

@@ -1,45 +0,0 @@
-/**
- * Copyright (c) 2011-2014, 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.plugins.pagination.optimize;
-
-import com.alibaba.druid.sql.PagerUtils;
-import com.baomidou.mybatisplus.parser.AbstractSqlParser;
-import com.baomidou.mybatisplus.parser.SqlInfo;
-
-/**
- * <p>
- * Ali Druid Count Optimize
- * </p>
- *
- * @author hubin
- * @since 2017-06-20
- */
-public class AliDruidCountOptimize extends AbstractSqlParser {
-
-    @Override
-    public SqlInfo optimizeSql(String sql, String dbType) {
-        if (logger.isDebugEnabled()) {
-            logger.debug(" AliDruidCountOptimize sql=" + sql + ", dbType=" + dbType);
-        }
-        SqlInfo sqlInfo = SqlInfo.newInstance();
-        // 调整SQL便于解析
-        String tempSql = sql.replaceAll("(?i)ORDER[\\s]+BY", "ORDER BY");
-        int orderByIndex = tempSql.toUpperCase().lastIndexOf("ORDER BY");
-        sqlInfo.setOrderBy(orderByIndex > -1);
-        sqlInfo.setSql(PagerUtils.count(sql, dbType));
-        return sqlInfo;
-    }
-}

+ 0 - 69
src/main/java/com/baomidou/mybatisplus/plugins/pagination/optimize/DefaultCountOptimize.java

@@ -1,69 +0,0 @@
-/**
- * Copyright (c) 2011-2014, 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.plugins.pagination.optimize;
-
-import com.baomidou.mybatisplus.parser.AbstractSqlParser;
-import com.baomidou.mybatisplus.parser.SqlInfo;
-
-/**
- * <p>
- * Default Count Optimize
- * </p>
- *
- * @author hubin
- * @since 2017-06-20
- */
-public class DefaultCountOptimize extends AbstractSqlParser {
-
-    @Override
-    public SqlInfo optimizeSql(String sql, String dbType) {
-        if (logger.isDebugEnabled()) {
-            logger.debug(" DefaultCountOptimize sql=" + sql + ", dbType=" + dbType);
-        }
-        SqlInfo sqlInfo = SqlInfo.newInstance();
-        // 调整SQL便于解析
-        String tempSql = sql.replaceAll("(?i)ORDER[\\s]+BY", "ORDER BY").replaceAll("(?i)GROUP[\\s]+BY", "GROUP BY");
-        String indexOfSql = tempSql.toUpperCase();
-        // 有排序情况
-        int orderByIndex = indexOfSql.lastIndexOf("ORDER BY");
-        // 只针对 ALI_DRUID DEFAULT 这2种情况
-        if (orderByIndex > -1) {
-            sqlInfo.setOrderBy(false);
-        }
-        StringBuilder countSql = new StringBuilder("SELECT COUNT(1) ");
-        boolean optimize = false;
-        if (!indexOfSql.contains("DISTINCT") && !indexOfSql.contains("GROUP BY")) {
-            int formIndex = indexOfSql.indexOf("FROM");
-            if (formIndex > -1) {
-                if (orderByIndex > -1) {
-                    tempSql = tempSql.substring(0, orderByIndex);
-                    countSql.append(tempSql.substring(formIndex));
-                    // 无排序情况
-                } else {
-                    countSql.append(tempSql.substring(formIndex));
-                }
-                // 执行优化
-                optimize = true;
-            }
-        }
-        if (!optimize) {
-            // 无优化SQL
-            countSql.append("FROM ( ").append(sql).append(" ) TOTAL");
-        }
-        sqlInfo.setSql(countSql.toString());
-        return sqlInfo;
-    }
-}

+ 5 - 34
src/main/java/com/baomidou/mybatisplus/toolkit/SqlUtils.java

@@ -15,14 +15,11 @@
  */
 package com.baomidou.mybatisplus.toolkit;
 
-import com.baomidou.mybatisplus.enums.Optimize;
 import com.baomidou.mybatisplus.enums.SqlLike;
-import com.baomidou.mybatisplus.plugins.pagination.Pagination;
-import com.baomidou.mybatisplus.plugins.pagination.optimize.AliDruidCountOptimize;
-import com.baomidou.mybatisplus.plugins.pagination.optimize.DefaultCountOptimize;
-import com.baomidou.mybatisplus.plugins.pagination.optimize.JsqlParserCountOptimize;
 import com.baomidou.mybatisplus.parser.AbstractSqlParser;
 import com.baomidou.mybatisplus.parser.SqlInfo;
+import com.baomidou.mybatisplus.plugins.pagination.Pagination;
+import com.baomidou.mybatisplus.plugins.pagination.optimize.JsqlParserCountOptimize;
 
 /**
  * <p>
@@ -46,43 +43,17 @@ public class SqlUtils {
      *
      * @param sqlParser       Count SQL 解析类
      * @param originalSql     需要计算Count SQL
-     * @param optimizeType    count优化方式
-     * @param isOptimizeCount 是否需要优化Count
      * @return SqlInfo
      */
-    public static SqlInfo getCountOptimize(AbstractSqlParser sqlParser, String originalSql,
-                                           String optimizeType, String dialectType,
-                                           boolean isOptimizeCount) {
-        Optimize opType = Optimize.getOptimizeType(optimizeType);
-
-        // COUNT SQL 不优化
-        if (!isOptimizeCount && Optimize.DEFAULT == opType) {
-            SqlInfo sqlInfo = SqlInfo.newInstance();
-            String tempSql = originalSql.replaceAll("(?i)ORDER[\\s]+BY", "ORDER BY");
-            int orderByIndex = tempSql.toUpperCase().lastIndexOf("ORDER BY");
-            sqlInfo.setOrderBy(orderByIndex > -1);
-            sqlInfo.setSql(String.format(SQL_BASE_COUNT, originalSql));
-            return sqlInfo;
-        }
-
+    public static SqlInfo getCountOptimize(AbstractSqlParser sqlParser, String originalSql, String dialectType) {
         // COUNT SQL 解析器
         if (null == COUNT_SQL_PARSER) {
             if (null != sqlParser) {
                 // 用户自定义 COUNT SQL 解析
                 COUNT_SQL_PARSER = sqlParser;
             } else {
-                // 默认存在的优化类型
-                switch (opType) {
-                    case ALI_DRUID:
-                        COUNT_SQL_PARSER = new AliDruidCountOptimize();
-                        break;
-                    case JSQLPARSER:
-                        COUNT_SQL_PARSER = new JsqlParserCountOptimize();
-                        break;
-                    default:
-                        COUNT_SQL_PARSER = new DefaultCountOptimize();
-                        break;
-                }
+                // 默认 JsqlParser 优化 COUNT
+                COUNT_SQL_PARSER = new JsqlParserCountOptimize();
             }
         }
         return COUNT_SQL_PARSER.optimizeSql(originalSql, dialectType);

+ 1 - 133
src/test/java/com/baomidou/mybatisplus/test/SqlUtilsTest.java

@@ -3,10 +3,8 @@ package com.baomidou.mybatisplus.test;
 import org.junit.Assert;
 import org.junit.Test;
 
-import com.baomidou.mybatisplus.plugins.pagination.optimize.AliDruidCountOptimize;
-import com.baomidou.mybatisplus.plugins.pagination.optimize.DefaultCountOptimize;
-import com.baomidou.mybatisplus.plugins.pagination.optimize.JsqlParserCountOptimize;
 import com.baomidou.mybatisplus.parser.SqlInfo;
+import com.baomidou.mybatisplus.plugins.pagination.optimize.JsqlParserCountOptimize;
 
 /**
  * <p>
@@ -76,134 +74,4 @@ public class SqlUtilsTest {
     }
 
 
-    public SqlInfo defaultCountSqlInfo(String sql) {
-        return new DefaultCountOptimize().optimizeSql(sql, "mysql");
-    }
-
-    /**
-     * 测试default方式
-     */
-    @Test
-    public void sqlCountOptimize4() {
-        SqlInfo sqlInfo = defaultCountSqlInfo(
-                "select * from user a left join (select uuid from user2) b on b.id = a.aid where a=1 group by a.id order by (select 1 from dual)");
-        String countsql = sqlInfo.getSql();
-        boolean orderBy = sqlInfo.isOrderBy();
-        System.out.println(countsql);
-        System.out.println(orderBy);
-        Assert.assertFalse(orderBy);
-        Assert.assertEquals(
-                "SELECT COUNT(1) FROM ( select * from user a left join (select uuid from user2) b on b.id = a.aid where a=1 group by a.id order by (select 1 from dual) ) TOTAL",
-                countsql);
-    }
-
-    /**
-     * 测试default方式
-     */
-    @Test
-    public void sqlCountOptimize5() {
-        SqlInfo sqlInfo = defaultCountSqlInfo("select * from test where 1= 1 order by id ");
-        String countsql = sqlInfo.getSql();
-        boolean orderBy = sqlInfo.isOrderBy();
-        System.out.println(countsql);
-        System.out.println(orderBy);
-        Assert.assertFalse(orderBy);
-        Assert.assertEquals("SELECT COUNT(1) from test where 1= 1 ", countsql);
-    }
-
-    /**
-     * 测试default方式
-     */
-    @Test
-    public void sqlCountOptimize7() {
-        SqlInfo sqlInfo = defaultCountSqlInfo("select * from test where 1= 1 ");
-        String countsql = sqlInfo.getSql();
-        boolean orderBy = sqlInfo.isOrderBy();
-        System.out.println(countsql);
-        System.out.println(orderBy);
-        Assert.assertTrue(orderBy);
-        Assert.assertEquals("SELECT COUNT(1) from test where 1= 1 ", countsql);
-    }
-
-
-    public SqlInfo aliDruidCountSqlInfo(String sql) {
-        return new AliDruidCountOptimize().optimizeSql(sql, "mysql");
-    }
-
-    /**
-     * 测试aliDruid方式
-     */
-    @Test
-    public void sqlCountOptimize8() {
-        SqlInfo sqlInfo = aliDruidCountSqlInfo("select * from test where 1= 1 order by id ");
-        String countsql = sqlInfo.getSql();
-        boolean orderBy = sqlInfo.isOrderBy();
-        System.out.println(countsql);
-        System.out.println(orderBy);
-        Assert.assertTrue(orderBy);
-        Assert.assertEquals("SELECT COUNT(*)\n" + "FROM test\n" + "WHERE 1 = 1", countsql);
-    }
-
-    /**
-     * 测试aliDruid方式
-     */
-    @Test
-    public void sqlCountOptimize9() {
-        SqlInfo sqlInfo = aliDruidCountSqlInfo("select * from test where 1= 1 ");
-        String countsql = sqlInfo.getSql();
-        boolean orderBy = sqlInfo.isOrderBy();
-        System.out.println(countsql);
-        System.out.println(orderBy);
-        Assert.assertFalse(orderBy);
-        Assert.assertEquals("SELECT COUNT(*)\n" + "FROM test\n" + "WHERE 1 = 1", countsql);
-    }
-
-    /**
-     * 测试aliDruid方式
-     */
-    @Test
-    public void sqlCountOptimize10() {
-        SqlInfo sqlInfo = aliDruidCountSqlInfo("select * from user a left join (select uuid from user2) b on b.id = a.aid where a=1 order by (select 1 from dual)");
-
-        String countsql = sqlInfo.getSql();
-        boolean orderBy = sqlInfo.isOrderBy();
-        System.out.println(countsql);
-        System.out.println(orderBy);
-        Assert.assertTrue(orderBy);
-        Assert.assertEquals("SELECT COUNT(*)\n" + "FROM user a\n" + "\tLEFT JOIN (SELECT uuid\n" + "\t\tFROM user2\n"
-                + "\t\t) b ON b.id = a.aid\n" + "WHERE a = 1", countsql);
-
-    }
-
-    /**
-     * 测试aliDruid方式
-     */
-    @Test
-    public void sqlCountOptimize11() {
-        SqlInfo sqlInfo = aliDruidCountSqlInfo("select distinct * from user a left join (select uuid from user2) b on b.id = a.aid where a=1 order by (select 1 from dual)");
-        String countsql = sqlInfo.getSql();
-        boolean orderBy = sqlInfo.isOrderBy();
-        System.out.println(countsql);
-        System.out.println(orderBy);
-        Assert.assertTrue(orderBy);
-        Assert.assertEquals("SELECT COUNT(DISTINCT *)\n" + "FROM user a\n" + "\tLEFT JOIN (SELECT uuid\n" + "\t\tFROM user2\n"
-                + "\t\t) b ON b.id = a.aid\n" + "WHERE a = 1", countsql);
-    }
-
-    /**
-     * 测试aliDruid方式
-     */
-    @Test
-    public void sqlCountOptimize12() {
-        SqlInfo sqlInfo = aliDruidCountSqlInfo("select * from user a left join (select uuid from user2) b on b.id = a.aid where a=1 group by a.id order by (select 1 from dual)");
-        String countsql = sqlInfo.getSql();
-        boolean orderBy = sqlInfo.isOrderBy();
-        System.out.println(countsql);
-        System.out.println(orderBy);
-        Assert.assertTrue(orderBy);
-        Assert.assertEquals("SELECT COUNT(*)\n" + "FROM (SELECT *\n" + "\tFROM user a\n" + "\t\tLEFT JOIN (SELECT uuid\n"
-                + "\t\t\tFROM user2\n" + "\t\t\t) b ON b.id = a.aid\n" + "\tWHERE a = 1\n" + "\tGROUP BY a.id\n"
-                + "\t) ALIAS_COUNT", countsql);
-    }
-
 }