浏览代码

开发多租户测试用例升级 jsqlparser 1.1

hubin 7 年之前
父节点
当前提交
47724cebe7

+ 1 - 1
build.gradle

@@ -90,7 +90,7 @@ def common = [
 dependencies {
     compile ("org.mybatis:mybatis-spring:${mybatisSpringVersion}")
     compile ("org.mybatis:mybatis:${mybatisVersion}")
-    compile ("com.github.jsqlparser:jsqlparser:1.0")
+    compile ("com.github.jsqlparser:jsqlparser:1.1")
     compileOnly common
     testCompileOnly("javax.servlet:servlet-api:2.5")
     testCompile("org.mybatis.caches:mybatis-ehcache:1.1.0")

+ 0 - 315
pom.xml

@@ -1,315 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>com.baomidou</groupId>
-    <artifactId>mybatis-plus</artifactId>
-    <version>2.1.1</version>
-    <packaging>jar</packaging>
-
-    <name>mybatis-plus</name>
-    <description>mybatis-plus is an enhanced version of mybaits.</description>
-    <url>http://maven.apache.org</url>
-
-    <licenses>
-        <license>
-            <name>The Apache Software License, Version 2.0</name>
-            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-        </license>
-    </licenses>
-
-    <developers>
-        <developer>
-            <name>hubin</name>
-            <email>jobob@qq.com</email>
-        </developer>
-    </developers>
-
-    <scm>
-        <connection>scm:git:git@git.oschina.net:baomidou/mybatis-plus.git</connection>
-        <developerConnection>scm:git:git@git.oschina.net:baomidou/mybatis-plus.git</developerConnection>
-        <url>git@git.oschina.net:baomidou/mybatis-plus.git</url>
-    </scm>
-
-    <distributionManagement>
-        <snapshotRepository>
-            <id>oss</id>
-            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
-        </snapshotRepository>
-        <repository>
-            <id>oss</id>
-            <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
-        </repository>
-    </distributionManagement>
-
-    <properties>
-        <gpg.keyname>1FD337F9</gpg.keyname>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <java.version>1.7</java.version>
-        <mybatis-spring.version>1.3.1</mybatis-spring.version>
-        <mybatis.version>3.4.5</mybatis.version>
-        <slf4j.version>1.7.25</slf4j.version>
-        <logback-classic.version>1.2.2</logback-classic.version>
-        <!-- provided or test -->
-        <jsqlparser.version>1.1</jsqlparser.version>
-        <alibaba.druid.version>1.1.0</alibaba.druid.version>
-        <commons.dbcp2.version>2.1.1</commons.dbcp2.version>
-        <commons.pool2.version>2.4.2</commons.pool2.version>
-        <mssql-jdbc.version>6.2.0.jre7</mssql-jdbc.version>
-        <mysql-connector-java.version>5.1.38</mysql-connector-java.version>
-        <ojdbc14.version>10.2.0.5.0</ojdbc14.version>
-        <postgresql.version>9.4.1212</postgresql.version>
-        <servlet-api.version>2.5</servlet-api.version>
-        <spring.version>4.3.9.RELEASE</spring.version>
-        <aspectjweaver.version>1.8.10</aspectjweaver.version>
-        <mybatis-ehcache.version>1.1.0</mybatis-ehcache.version>
-        <junit.version>4.12</junit.version>
-        <velocity.version>1.7</velocity.version>
-        <h2.version>1.4.196</h2.version>
-        <lombok.version>1.16.18</lombok.version>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.mybatis</groupId>
-            <artifactId>mybatis-spring</artifactId>
-            <version>${mybatis-spring.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.mybatis</groupId>
-            <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>
-            <version>${servlet-api.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-            <version>${slf4j.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>jcl-over-slf4j</artifactId>
-            <version>${slf4j.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <!-- spring begin -->
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-context</artifactId>
-            <version>${spring.version}</version>
-            <scope>provided</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>commons-logging</groupId>
-                    <artifactId>commons-logging</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-webmvc</artifactId>
-            <version>${spring.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-tx</artifactId>
-            <version>${spring.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-jdbc</artifactId>
-            <version>${spring.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-context-support</artifactId>
-            <version>${spring.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.aspectj</groupId>
-            <artifactId>aspectjweaver</artifactId>
-            <version>${aspectjweaver.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <!-- spring end -->
-        <!--druid -->
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>druid</artifactId>
-            <version>${alibaba.druid.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <!-- generator vm -->
-        <dependency>
-            <groupId>org.apache.velocity</groupId>
-            <artifactId>velocity</artifactId>
-            <version>${velocity.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <!-- test begin -->
-        <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
-            <version>${mysql-connector-java.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.mybatis.caches</groupId>
-            <artifactId>mybatis-ehcache</artifactId>
-            <version>${mybatis-ehcache.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.oracle</groupId>
-            <artifactId>ojdbc14</artifactId>
-            <version>${ojdbc14.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>ch.qos.logback</groupId>
-            <artifactId>logback-classic</artifactId>
-            <version>${logback-classic.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>${junit.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-test</artifactId>
-            <version>${spring.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-dbcp2</artifactId>
-            <version>${commons.dbcp2.version}</version>
-            <scope>test</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>commons-logging</groupId>
-                    <artifactId>commons-logging</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-pool2</artifactId>
-            <version>${commons.pool2.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.microsoft.sqlserver</groupId>
-            <artifactId>mssql-jdbc</artifactId>
-    		<version>${mssql-jdbc.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.postgresql</groupId>
-            <artifactId>postgresql</artifactId>
-            <version>${postgresql.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.h2database</groupId>
-            <artifactId>h2</artifactId>
-            <version>${h2.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-            <version>${lombok.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <!-- test end -->
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>2.3.2</version>
-                <configuration>
-                    <source>${java.version}</source>
-                    <target>${java.version}</target>
-                    <encoding>${project.build.sourceEncoding}</encoding>
-                </configuration>
-            </plugin>
-            <!-- Source -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-source-plugin</artifactId>
-                <version>2.2.1</version>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>jar-no-fork</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <!-- Javadoc -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <version>2.9.1</version>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>jar</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <!-- GPG -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-gpg-plugin</artifactId>
-                <version>1.6</version>
-                <executions>
-                    <execution>
-                        <phase>verify</phase>
-                        <goals>
-                            <goal>sign</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <!-- skipJunitTest -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <version>2.19.1</version>
-                <configuration>
-                    <skipTests>true</skipTests>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-    <profiles>
-        <profile>
-            <id>release</id>
-        </profile>
-    </profiles>
-</project>

+ 29 - 42
src/main/java/com/baomidou/mybatisplus/plugins/tenancy/TenancySqlParser.java

@@ -17,12 +17,12 @@ package com.baomidou.mybatisplus.plugins.tenancy;
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
 import com.baomidou.mybatisplus.plugins.parser.AbstractJsqlParser;
 import com.baomidou.mybatisplus.plugins.parser.SqlInfo;
 
 import net.sf.jsqlparser.expression.BinaryExpression;
 import net.sf.jsqlparser.expression.Expression;
-import net.sf.jsqlparser.expression.StringValue;
 import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
 import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
 import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
@@ -72,9 +72,7 @@ public class TenancySqlParser extends AbstractJsqlParser {
     }
 
     /**
-     * <p>
      * select 语句处理
-     * </p>
      */
     public void processSelectBody(SelectBody selectBody) {
         if (selectBody instanceof PlainSelect) {
@@ -101,17 +99,17 @@ public class TenancySqlParser extends AbstractJsqlParser {
      * </p>
      */
     public void processInsert(Insert insert) {
-        if (doTableFilter(
-                insert.getTable().getName()
-        )) {
-            insert.getColumns().add(new Column(this.tenantHandler.getTenantIdColumn()));
-            if (insert.getSelect() != null) {
-                processPlainSelect((PlainSelect) insert.getSelect().getSelectBody(), true);
-            } else if (insert.getItemsList() != null) {
-                ((ExpressionList) insert.getItemsList()).getExpressions().add(new StringValue(this.tenantHandler.getTenantId()));
-            } else {
-                throw new RuntimeException("无法处理的 sql");
-            }
+        if (this.tenantHandler.doTableFilter(insert.getTable().getName())) {
+            // 过滤退出执行
+            return;
+        }
+        insert.getColumns().add(new Column(this.tenantHandler.getTenantIdColumn()));
+        if (insert.getSelect() != null) {
+            processPlainSelect((PlainSelect) insert.getSelect().getSelectBody(), true);
+        } else if (insert.getItemsList() != null) {
+            ((ExpressionList) insert.getItemsList()).getExpressions().add(tenantHandler.getTenantId());
+        } else {
+            throw new MybatisPlusException("无法处理的 sql");
         }
     }
 
@@ -126,17 +124,16 @@ public class TenancySqlParser extends AbstractJsqlParser {
         EqualsTo equalsTo = new EqualsTo();
         if (where instanceof BinaryExpression) {
             equalsTo.setLeftExpression(new Column(this.tenantHandler.getTenantIdColumn()));
-            equalsTo.setRightExpression(new StringValue(tenantHandler.getTenantId()));
+            equalsTo.setRightExpression(tenantHandler.getTenantId());
             AndExpression andExpression = new AndExpression(equalsTo, where);
             update.setWhere(andExpression);
         } else {
             equalsTo.setLeftExpression(new Column(this.tenantHandler.getTenantIdColumn()));
-            equalsTo.setRightExpression(new StringValue(tenantHandler.getTenantId()));
+            equalsTo.setRightExpression(tenantHandler.getTenantId());
             update.setWhere(equalsTo);
         }
     }
 
-
     /**
      * <p>
      * delete 语句处理
@@ -147,7 +144,9 @@ public class TenancySqlParser extends AbstractJsqlParser {
     }
 
     /**
+     * <p>
      * 处理 PlainSelect
+     * </p>
      */
     public void processPlainSelect(PlainSelect plainSelect) {
         processPlainSelect(plainSelect, false);
@@ -161,16 +160,17 @@ public class TenancySqlParser extends AbstractJsqlParser {
      * @param plainSelect
      * @param addColumn   是否添加租户列,insert into select语句中需要
      */
-
     public void processPlainSelect(PlainSelect plainSelect, boolean addColumn) {
         FromItem fromItem = plainSelect.getFromItem();
         if (fromItem instanceof Table) {
             Table fromTable = (Table) fromItem;
-            if (doTableFilter(fromTable.getName())) {
-                plainSelect.setWhere(builderExpression(plainSelect.getWhere(), fromTable));
-                if (addColumn) {
-                    plainSelect.getSelectItems().add(new SelectExpressionItem(new Column(this.tenantHandler.getTenantId())));
-                }
+            if (this.tenantHandler.doTableFilter(fromTable.getName())) {
+                // 过滤退出执行
+                return;
+            }
+            plainSelect.setWhere(builderExpression(plainSelect.getWhere(), fromTable));
+            if (addColumn) {
+                plainSelect.getSelectItems().add(new SelectExpressionItem(new Column(this.tenantHandler.getTenantIdColumn())));
             }
         } else {
             processFromItem(fromItem);
@@ -184,10 +184,9 @@ public class TenancySqlParser extends AbstractJsqlParser {
         }
     }
 
+
     /**
      * 处理子查询等
-     *
-     * @param fromItem
      */
     public void processFromItem(FromItem fromItem) {
         if (fromItem instanceof SubJoin) {
@@ -218,26 +217,20 @@ public class TenancySqlParser extends AbstractJsqlParser {
 
     /**
      * 处理联接语句
-     *
-     * @param join
      */
     public void processJoin(Join join) {
         if (join.getRightItem() instanceof Table) {
             Table fromTable = (Table) join.getRightItem();
-            if (doTableFilter(fromTable.getName())) {
-                join.setOnExpression(builderExpression(join.getOnExpression(), fromTable));
+            if (this.tenantHandler.doTableFilter(fromTable.getName())) {
+                // 过滤退出执行
+                return;
             }
+            join.setOnExpression(builderExpression(join.getOnExpression(), fromTable));
         }
     }
 
-
     /**
      * 处理条件
-     * TODO 未解决sql注入问题(考虑替换StringValue为LongValue),因为线上数据库租户字段为int暂时不存在注入问题
-     *
-     * @param expression
-     * @param table
-     * @return
      */
     public Expression builderExpression(Expression expression, Table table) {
         Expression tenantExpression = null;
@@ -251,12 +244,10 @@ public class TenancySqlParser extends AbstractJsqlParser {
         tenantIdColumnName.append(this.tenantHandler.getTenantIdColumn());
         //生成字段名
         Column tenantColumn = new Column(tenantIdColumnName.toString());
-
         EqualsTo equalsTo = new EqualsTo();
         tenantExpression = equalsTo;
         equalsTo.setLeftExpression(tenantColumn);
-        equalsTo.setRightExpression(new StringValue(this.tenantHandler.getTenantId()));
-
+        equalsTo.setRightExpression(tenantHandler.getTenantId());
         //加入判断防止条件为空时生成 "and null" 导致查询结果为空
         if (expression == null) {
             return tenantExpression;
@@ -274,10 +265,6 @@ public class TenancySqlParser extends AbstractJsqlParser {
         }
     }
 
-    private boolean doTableFilter(String table) {
-        return true;
-    }
-
     public TenantHandler getTenantHandler() {
         return tenantHandler;
     }

+ 4 - 1
src/main/java/com/baomidou/mybatisplus/plugins/tenancy/TenantHandler.java

@@ -15,6 +15,8 @@
  */
 package com.baomidou.mybatisplus.plugins.tenancy;
 
+import net.sf.jsqlparser.expression.Expression;
+
 /**
  * <p>
  * 租户处理器
@@ -25,8 +27,9 @@ package com.baomidou.mybatisplus.plugins.tenancy;
  */
 public interface TenantHandler {
 
-    String getTenantId();
+    Expression getTenantId();
 
     String getTenantIdColumn();
 
+    boolean doTableFilter(String tableName);
 }

+ 28 - 6
src/test/java/com/baomidou/mybatisplus/test/sql/TenancySqlTest.java

@@ -1,5 +1,6 @@
 package com.baomidou.mybatisplus.test.sql;
 
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -7,6 +8,9 @@ import com.baomidou.mybatisplus.plugins.parser.SqlInfo;
 import com.baomidou.mybatisplus.plugins.tenancy.TenancySqlParser;
 import com.baomidou.mybatisplus.plugins.tenancy.TenantHandler;
 
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.LongValue;
+
 /**
  * <p>
  * 租户 SQL 测试
@@ -24,22 +28,40 @@ public class TenancySqlTest {
         tenancySqlParser = new TenancySqlParser();
         tenancySqlParser.setTenantHandler(new TenantHandler() {
             @Override
-            public String getTenantId() {
-                return "1000";
+            public Expression getTenantId() {
+                return new LongValue(1000L);
             }
 
             @Override
             public String getTenantIdColumn() {
                 return "tenant_id";
             }
+
+            @Override
+            public boolean doTableFilter(String tableName) {
+                if ("user".equals(tableName)) {
+                    return true;
+                }
+                return false;
+            }
         });
     }
 
     @Test
-    public void test1() {
+    public void filter() {
         SqlInfo sqlInfo = tenancySqlParser.optimizeSql(null, "select * from user");
-        if (null != sqlInfo) {
-            System.err.println(sqlInfo.getSql());
-        }
+        Assert.assertEquals("SELECT * FROM user", sqlInfo.getSql());
+    }
+
+    @Test
+    public void test() {
+        SqlInfo sqlInfo = tenancySqlParser.optimizeSql(null, "select aaa, bbb,(select ccc from role) as ccc from user");
+        Assert.assertEquals("SELECT aaa, bbb, (SELECT ccc FROM role) AS ccc FROM user WHERE user.tenant_id = 1000", sqlInfo.getSql());
+    }
+
+    @Test
+    public void join() {
+        SqlInfo sqlInfo = tenancySqlParser.optimizeSql(null, "SELECT u.aaa, r.bbb FROM role r left JOIN user u WHERE r.id=u.id");
+        Assert.assertEquals("SELECT u.aaa, r.bbb FROM role r LEFT JOIN user u WHERE r.tenant_id = 1000 AND r.id = u.id", sqlInfo.getSql());
     }
 }