Selaa lähdekoodia

Merge remote-tracking branch 'origin/3.0' into 3.0

hubin 7 vuotta sitten
vanhempi
commit
1d7079541e
20 muutettua tiedostoa jossa 273 lisäystä ja 156 poistoa
  1. 3 0
      mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/SqlParser.java
  2. 0 1
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/AbstractMethod.java
  3. 5 18
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/parser/SqlInfo.java
  4. 8 9
      mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/test/WrapperTest.java
  5. 28 20
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/IllegalSQLInterceptor.java
  6. 57 46
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/PerformanceInterceptor.java
  7. 21 20
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/SqlExplainInterceptor.java
  8. 16 0
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/tenant/TenantHandler.java
  9. 12 1
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/tenant/TenantSchemaHandler.java
  10. 6 8
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/tenant/TenantSchemaSqlParser.java
  11. 28 19
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/tenant/TenantSqlParser.java
  12. 4 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/SqlTest.java
  13. 6 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/entity/LogicTestData.java
  14. 1 1
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/entity/PgTestData.java
  15. 10 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/entity/TestData.java
  16. 0 1
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/mapper/LogicTestDataMapper.java
  17. 10 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/mapper/TestDataMapper.java
  18. 11 4
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/MysqlTestDataMapperTest.java
  19. 42 4
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/config/MybatisPlusConfig.java
  20. 5 4
      mybatis-plus/src/test/resources/mysql/test_data.ddl.sql

+ 3 - 0
mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/SqlParser.java

@@ -26,6 +26,9 @@ import java.lang.annotation.Target;
  * <p>
  * 租户注解
  * </p>
+ * <p>
+ * 目前只支持注解在 mapper 的方法上
+ * </p>
  *
  * @author hubin
  * @since 2018-01-13

+ 0 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/AbstractMethod.java

@@ -300,7 +300,6 @@ public abstract class AbstractMethod {
                 columns.append(sqlWordConvert(dbType, table.getKeyColumn(), true))
                     .append(" AS ").append(sqlWordConvert(dbType, table.getKeyProperty(), false));
             } else {
-                //todo getKeyColumn ???
                 columns.append(sqlWordConvert(dbType, table.getKeyColumn(), true));
             }
         } else {

+ 5 - 18
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/parser/SqlInfo.java

@@ -15,6 +15,9 @@
  */
 package com.baomidou.mybatisplus.core.parser;
 
+import lombok.Data;
+import lombok.experimental.Accessors;
+
 /**
  * <p>
  * Sql Info
@@ -23,6 +26,8 @@ package com.baomidou.mybatisplus.core.parser;
  * @author hubin
  * @since 2017-06-20
  */
+@Data
+@Accessors(chain = true)
 public class SqlInfo {
 
     /**
@@ -37,22 +42,4 @@ public class SqlInfo {
     public static SqlInfo newInstance() {
         return new SqlInfo();
     }
-
-    public String getSql() {
-        return sql;
-    }
-
-    public SqlInfo setSql(String sql) {
-        this.sql = sql;
-        return this;
-    }
-
-    public boolean isOrderBy() {
-        return orderBy;
-    }
-
-    public SqlInfo setOrderBy(boolean orderBy) {
-        this.orderBy = orderBy;
-        return this;
-    }
 }

+ 8 - 9
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/test/WrapperTest.java

@@ -15,20 +15,19 @@
  */
 package com.baomidou.mybatisplus.core.test;
 
-import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.junit.Test;
-
 import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;
+import org.junit.Test;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 public class WrapperTest {
 
@@ -139,7 +138,7 @@ public class WrapperTest {
 
     @Test
     public void testFunc() {
-        QueryWrapper<User> queryWrapper = new QueryWrapper<User>()//todo in 方法是不是各个加个后缀好点
+        QueryWrapper<User> queryWrapper = new QueryWrapper<User>()
             .isNull("nullColumn").or().isNotNull("notNullColumn")
             .orderByAsc("id").orderByDesc("name")
             .groupBy("id", "name").groupBy("id2", "name2")

+ 28 - 20
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/IllegalSQLInterceptor.java

@@ -1,9 +1,37 @@
 package com.baomidou.mybatisplus.extension.plugins;
 
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Properties;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.ibatis.executor.statement.StatementHandler;
+import org.apache.ibatis.logging.Log;
+import org.apache.ibatis.logging.LogFactory;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlCommandType;
+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.reflection.MetaObject;
+import org.apache.ibatis.reflection.SystemMetaObject;
+
 import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
 import com.baomidou.mybatisplus.core.toolkit.EncryptUtils;
 import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+
 import lombok.Data;
 import net.sf.jsqlparser.expression.BinaryExpression;
 import net.sf.jsqlparser.expression.Expression;
@@ -21,22 +49,6 @@ import net.sf.jsqlparser.statement.select.PlainSelect;
 import net.sf.jsqlparser.statement.select.Select;
 import net.sf.jsqlparser.statement.select.SubSelect;
 import net.sf.jsqlparser.statement.update.Update;
-import org.apache.ibatis.executor.statement.StatementHandler;
-import org.apache.ibatis.logging.Log;
-import org.apache.ibatis.logging.LogFactory;
-import org.apache.ibatis.mapping.BoundSql;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.mapping.SqlCommandType;
-import org.apache.ibatis.plugin.*;
-import org.apache.ibatis.reflection.MetaObject;
-import org.apache.ibatis.reflection.SystemMetaObject;
-
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * @author willenfoo
@@ -123,9 +135,6 @@ public class IllegalSQLInterceptor implements Interceptor {
      * @param connection
      */
     private static void validJoins(List<Join> joins, Table table, Connection connection) {
-        if (joins != null) {
-            throw new MybatisPlusException("非法SQL,请把SQL打成单表执行,错误子查询join信息:" + joins);
-        }
         //允许执行join,验证jion是否使用索引等等
         if (joins != null) {
             for (Join join : joins) {
@@ -152,7 +161,6 @@ public class IllegalSQLInterceptor implements Interceptor {
         String dbName = null;
         String tableName = null;
         String[] tableArray = tableInfo.split("\\.");
-        ;
         if (tableArray.length == 1) {
             tableName = tableArray[0];
         } else {

+ 57 - 46
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/PerformanceInterceptor.java

@@ -15,21 +15,40 @@
  */
 package com.baomidou.mybatisplus.extension.plugins;
 
-import com.baomidou.mybatisplus.core.toolkit.*;
-import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+
 import org.apache.ibatis.executor.statement.StatementHandler;
 import org.apache.ibatis.logging.Log;
 import org.apache.ibatis.logging.LogFactory;
 import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.plugin.*;
+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.reflection.MetaObject;
 import org.apache.ibatis.reflection.SystemMetaObject;
 import org.apache.ibatis.session.ResultHandler;
 
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.sql.Statement;
-import java.util.*;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.SystemClock;
+import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
 
 /**
  * <p>
@@ -39,9 +58,11 @@ import java.util.*;
  * @author hubin nieqiurong TaoYu
  * @since 2016-07-07
  */
-@Intercepts({@Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class}),
+@Intercepts({
+    @Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class}),
     @Signature(type = StatementHandler.class, method = "update", args = {Statement.class}),
-    @Signature(type = StatementHandler.class, method = "batch", args = {Statement.class})})
+    @Signature(type = StatementHandler.class, method = "batch", args = {Statement.class})
+})
 public class PerformanceInterceptor implements Interceptor {
 
     private static final Log logger = LogFactory.getLog(PerformanceInterceptor.class);
@@ -51,16 +72,25 @@ public class PerformanceInterceptor implements Interceptor {
     /**
      * SQL 执行最大时长,超过自动停止运行,有助于发现问题。
      */
+    @Setter
+    @Getter
+    @Accessors(chain = true)
     private long maxTime = 0;
     /**
      * SQL 是否格式化
      */
+    @Setter
+    @Getter
+    @Accessors(chain = true)
     private boolean format = false;
     /**
      * 是否写入日志文件<br>
      * true 写入日志文件,不阻断程序执行!<br>
      * 超过设定的最大执行时长异常提示!
      */
+    @Setter
+    @Getter
+    @Accessors(chain = true)
     private boolean writeInLog = false;
     private Method oracleGetOriginalSqlMethod;
     private Method druidGetSQLMethod;
@@ -98,18 +128,18 @@ public class PerformanceInterceptor implements Interceptor {
                     druidGetSQLMethod = clazz.getMethod("getSql");
                 }
                 Object stmtSql = druidGetSQLMethod.invoke(statement);
-                if (stmtSql != null && stmtSql instanceof String) {
+                if (stmtSql instanceof String) {
                     originalSql = (String) stmtSql;
                 }
-            } catch (Exception ignored) {
-                ignored.printStackTrace();
+            } catch (Exception e) {
+                e.printStackTrace();
             }
         } else if (T4CPreparedStatement.equals(stmtClassName)
             || OraclePreparedStatementWrapper.equals(stmtClassName)) {
             try {
                 if (oracleGetOriginalSqlMethod != null) {
                     Object stmtSql = oracleGetOriginalSqlMethod.invoke(statement);
-                    if (stmtSql != null && stmtSql instanceof String) {
+                    if (stmtSql instanceof String) {
                         originalSql = (String) stmtSql;
                     }
                 } else {
@@ -120,7 +150,7 @@ public class PerformanceInterceptor implements Interceptor {
                         oracleGetOriginalSqlMethod.setAccessible(true);
                         if (null != oracleGetOriginalSqlMethod) {
                             Object stmtSql = oracleGetOriginalSqlMethod.invoke(statement);
-                            if (stmtSql != null && stmtSql instanceof String) {
+                            if (stmtSql instanceof String) {
                                 originalSql = (String) stmtSql;
                             }
                         }
@@ -136,7 +166,7 @@ public class PerformanceInterceptor implements Interceptor {
         originalSql = originalSql.replaceAll("[\\s]+", StringPool.SPACE);
         int index = indexOfSqlStart(originalSql);
         if (index > 0) {
-            originalSql = originalSql.substring(index, originalSql.length());
+            originalSql = originalSql.substring(index);
         }
 
         // 计算执行 SQL 耗时
@@ -148,10 +178,11 @@ public class PerformanceInterceptor implements Interceptor {
         Object target = PluginUtils.realTarget(invocation.getTarget());
         MetaObject metaObject = SystemMetaObject.forObject(target);
         MappedStatement ms = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
-        StringBuilder formatSql = new StringBuilder();
-        formatSql.append(" Time:").append(timing);
-        formatSql.append(" ms - ID:").append(ms.getId());
-        formatSql.append(StringPool.NEWLINE).append("Execute SQL:").append(SqlUtils.sqlFormat(originalSql, format)).append(StringPool.NEWLINE);
+        StringBuilder formatSql = new StringBuilder()
+            .append(" Time:").append(timing)
+            .append(" ms - ID:").append(ms.getId())
+            .append(StringPool.NEWLINE).append("Execute SQL:")
+            .append(SqlUtils.sqlFormat(originalSql, format)).append(StringPool.NEWLINE);
         if (this.isWriteInLog()) {
             if (this.getMaxTime() >= 1 && timing > this.getMaxTime()) {
                 logger.error(formatSql.toString());
@@ -186,33 +217,13 @@ public class PerformanceInterceptor implements Interceptor {
         }
     }
 
-    public long getMaxTime() {
-        return maxTime;
-    }
-
-    public PerformanceInterceptor setMaxTime(long maxTime) {
-        this.maxTime = maxTime;
-        return this;
-    }
-
-    public boolean isFormat() {
-        return format;
-    }
-
-    public PerformanceInterceptor setFormat(boolean format) {
-        this.format = format;
-        return this;
-    }
-
-    public boolean isWriteInLog() {
-        return writeInLog;
-    }
-
-    public PerformanceInterceptor setWriteInLog(boolean writeInLog) {
-        this.writeInLog = writeInLog;
-        return this;
-    }
-
+    /**
+     * 获取此方法名的具体 Method
+     *
+     * @param clazz      class 对象
+     * @param methodName 方法名
+     * @return 方法
+     */
     public Method getMethodRegular(Class<?> clazz, String methodName) {
         if (Object.class.equals(clazz)) {
             return null;

+ 21 - 20
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/SqlExplainInterceptor.java

@@ -15,12 +15,11 @@
  */
 package com.baomidou.mybatisplus.extension.plugins;
 
-import com.baomidou.mybatisplus.annotation.DbType;
-import com.baomidou.mybatisplus.core.toolkit.Assert;
-import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
-import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-import com.baomidou.mybatisplus.extension.toolkit.VersionUtils;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.Properties;
+
 import org.apache.ibatis.builder.StaticSqlSource;
 import org.apache.ibatis.executor.Executor;
 import org.apache.ibatis.logging.Log;
@@ -28,14 +27,23 @@ import org.apache.ibatis.logging.LogFactory;
 import org.apache.ibatis.mapping.BoundSql;
 import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.mapping.SqlCommandType;
-import org.apache.ibatis.plugin.*;
+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.scripting.defaults.DefaultParameterHandler;
 import org.apache.ibatis.session.Configuration;
 
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.util.Properties;
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
+import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.toolkit.VersionUtils;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
 
 /**
  * <p>
@@ -45,6 +53,8 @@ import java.util.Properties;
  * @author hubin
  * @since 2016-08-16
  */
+@Data
+@Accessors(chain = true)
 @Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
 public class SqlExplainInterceptor implements Interceptor {
 
@@ -142,13 +152,4 @@ public class SqlExplainInterceptor implements Interceptor {
             this.stopProceed = Boolean.valueOf(stopProceed);
         }
     }
-
-    public boolean isStopProceed() {
-        return stopProceed;
-    }
-
-    public void setStopProceed(boolean stopProceed) {
-        this.stopProceed = stopProceed;
-    }
-
 }

+ 16 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/tenant/TenantHandler.java

@@ -27,9 +27,25 @@ import net.sf.jsqlparser.expression.Expression;
  */
 public interface TenantHandler {
 
+    /**
+     * 获取租户值
+     *
+     * @return 租户值
+     */
     Expression getTenantId();
 
+    /**
+     * 获取租户字段名
+     *
+     * @return 租户字段名
+     */
     String getTenantIdColumn();
 
+    /**
+     * 根据表名判断是否进行过滤
+     *
+     * @param tableName 表名
+     * @return 是否进行过滤
+     */
     boolean doTableFilter(String tableName);
 }

+ 12 - 1
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/tenant/TenantSchemaHandler.java

@@ -17,7 +17,7 @@ package com.baomidou.mybatisplus.extension.plugins.tenant;
 
 /**
  * <p>
- * 租户处理器( Schema 表级 )
+ * 租户处理器( schema 级 )
  * </p>
  *
  * @author hubin
@@ -25,7 +25,18 @@ package com.baomidou.mybatisplus.extension.plugins.tenant;
  */
 public interface TenantSchemaHandler {
 
+    /**
+     * 获取 schema 名
+     *
+     * @return schema 名
+     */
     String getTenantSchema();
 
+    /**
+     * 根据表名判断是否进行过滤
+     *
+     * @param tableName 表名
+     * @return 是否进行过滤
+     */
     boolean doTableFilter(String tableName);
 }

+ 6 - 8
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/tenant/TenantSchemaSqlParser.java

@@ -18,6 +18,9 @@ package com.baomidou.mybatisplus.extension.plugins.tenant;
 
 import com.baomidou.mybatisplus.core.parser.AbstractJsqlParser;
 
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
 import net.sf.jsqlparser.statement.delete.Delete;
 import net.sf.jsqlparser.statement.insert.Insert;
 import net.sf.jsqlparser.statement.select.SelectBody;
@@ -31,6 +34,9 @@ import net.sf.jsqlparser.statement.update.Update;
  * @author hubin
  * @since 2017-09-01
  */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
 public class TenantSchemaSqlParser extends AbstractJsqlParser {
 
     private TenantSchemaHandler tenantSchemaHandler;
@@ -54,12 +60,4 @@ public class TenantSchemaSqlParser extends AbstractJsqlParser {
     public void processSelectBody(SelectBody selectBody) {
 
     }
-
-    public TenantSchemaHandler getTenantSchemaHandler() {
-        return tenantSchemaHandler;
-    }
-
-    public void setTenantSchemaHandler(TenantSchemaHandler tenantSchemaHandler) {
-        this.tenantSchemaHandler = tenantSchemaHandler;
-    }
 }

+ 28 - 19
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/tenant/TenantSqlParser.java

@@ -15,10 +15,16 @@
  */
 package com.baomidou.mybatisplus.extension.plugins.tenant;
 
+import java.util.List;
+
 import com.baomidou.mybatisplus.core.parser.AbstractJsqlParser;
 import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
 import net.sf.jsqlparser.expression.BinaryExpression;
 import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
@@ -30,11 +36,19 @@ import net.sf.jsqlparser.schema.Column;
 import net.sf.jsqlparser.schema.Table;
 import net.sf.jsqlparser.statement.delete.Delete;
 import net.sf.jsqlparser.statement.insert.Insert;
-import net.sf.jsqlparser.statement.select.*;
+import net.sf.jsqlparser.statement.select.FromItem;
+import net.sf.jsqlparser.statement.select.Join;
+import net.sf.jsqlparser.statement.select.LateralSubSelect;
+import net.sf.jsqlparser.statement.select.PlainSelect;
+import net.sf.jsqlparser.statement.select.SelectBody;
+import net.sf.jsqlparser.statement.select.SelectExpressionItem;
+import net.sf.jsqlparser.statement.select.SetOperationList;
+import net.sf.jsqlparser.statement.select.SubJoin;
+import net.sf.jsqlparser.statement.select.SubSelect;
+import net.sf.jsqlparser.statement.select.ValuesList;
+import net.sf.jsqlparser.statement.select.WithItem;
 import net.sf.jsqlparser.statement.update.Update;
 
-import java.util.List;
-
 /**
  * <p>
  * 租户 SQL 解析器( TenantId 行级 )
@@ -43,6 +57,9 @@ import java.util.List;
  * @author hubin
  * @since 2017-09-01
  */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
 public class TenantSqlParser extends AbstractJsqlParser {
 
     private TenantHandler tenantHandler;
@@ -74,11 +91,11 @@ public class TenantSqlParser extends AbstractJsqlParser {
      */
     @Override
     public void processInsert(Insert insert) {
-        if (this.tenantHandler.doTableFilter(insert.getTable().getName())) {
+        if (tenantHandler.doTableFilter(insert.getTable().getName())) {
             // 过滤退出执行
             return;
         }
-        insert.getColumns().add(new Column(this.tenantHandler.getTenantIdColumn()));
+        insert.getColumns().add(new Column(tenantHandler.getTenantIdColumn()));
         if (insert.getSelect() != null) {
             processPlainSelect((PlainSelect) insert.getSelect().getSelectBody(), true);
         } else if (insert.getItemsList() != null) {
@@ -105,7 +122,7 @@ public class TenantSqlParser extends AbstractJsqlParser {
         Assert.isTrue(null != tableList && tableList.size() < 2,
             "Failed to process multiple-table update, please exclude the statementId");
         Table table = tableList.get(0);
-        if (this.tenantHandler.doTableFilter(table.getName())) {
+        if (tenantHandler.doTableFilter(table.getName())) {
             // 过滤退出执行
             return;
         }
@@ -119,7 +136,7 @@ public class TenantSqlParser extends AbstractJsqlParser {
      */
     @Override
     public void processDelete(Delete delete) {
-        if (this.tenantHandler.doTableFilter(delete.getTable().getName())) {
+        if (tenantHandler.doTableFilter(delete.getTable().getName())) {
             // 过滤退出执行
             return;
         }
@@ -163,13 +180,13 @@ public class TenantSqlParser extends AbstractJsqlParser {
         FromItem fromItem = plainSelect.getFromItem();
         if (fromItem instanceof Table) {
             Table fromTable = (Table) fromItem;
-            if (this.tenantHandler.doTableFilter(fromTable.getName())) {
+            if (tenantHandler.doTableFilter(fromTable.getName())) {
                 // 过滤退出执行
                 return;
             }
             plainSelect.setWhere(builderExpression(plainSelect.getWhere(), fromTable));
             if (addColumn) {
-                plainSelect.getSelectItems().add(new SelectExpressionItem(new Column(this.tenantHandler.getTenantIdColumn())));
+                plainSelect.getSelectItems().add(new SelectExpressionItem(new Column(tenantHandler.getTenantIdColumn())));
             }
         } else {
             processFromItem(fromItem);
@@ -190,7 +207,7 @@ public class TenantSqlParser extends AbstractJsqlParser {
         if (fromItem instanceof SubJoin) {
             SubJoin subJoin = (SubJoin) fromItem;
             if (subJoin.getJoinList() != null) {
-                subJoin.getJoinList().forEach(j -> processJoin(j));
+                subJoin.getJoinList().forEach(this::processJoin);
             }
             if (subJoin.getLeft() != null) {
                 processFromItem(subJoin.getLeft());
@@ -269,15 +286,7 @@ public class TenantSqlParser extends AbstractJsqlParser {
             column.append(table.getAlias().getName());
         }
         column.append(StringPool.DOT);
-        column.append(this.tenantHandler.getTenantIdColumn());
+        column.append(tenantHandler.getTenantIdColumn());
         return new Column(column.toString());
     }
-
-    public TenantHandler getTenantHandler() {
-        return tenantHandler;
-    }
-
-    public void setTenantHandler(TenantHandler tenantHandler) {
-        this.tenantHandler = tenantHandler;
-    }
 }

+ 4 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/SqlTest.java

@@ -2,9 +2,13 @@ package com.baomidou.mybatisplus.test;
 
 import org.junit.Test;
 
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
 public class SqlTest {
 
     @Test
     public void test() {
+        Stream.of(1, 2, 3, 4, 5).collect(Collectors.toList()).toArray();
     }
 }

+ 6 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/entity/LogicTestData.java

@@ -10,6 +10,12 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 
 /**
+ * 包含功能:
+ * 1.继承父类字段     验证无误
+ * 2.自动填充        验证无误
+ * 3.逻辑删除        验证无误
+ * 4.乐观锁          验证无误
+ *
  * @author meimie
  * @since 2018/6/7
  */

+ 1 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/entity/PgTestData.java

@@ -21,7 +21,7 @@ import java.time.LocalDateTime;
 @TableName(value = "tb_only_pg_test_data")
 public class PgTestData extends BaseEntity {
 
-    @TableField(value = "age")
+    @TableField(value = "age", el = "age, jdbcType=integer")
     private Integer dataAge;
     @TableField(value = "c_datetime", fill = FieldFill.INSERT)
     private LocalDateTime createDatetime;

+ 10 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/entity/TestData.java

@@ -13,6 +13,12 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 
 /**
+ * 包含功能:
+ * 1.继承父类字段     验证无误
+ * 2.自动填充        验证无误
+ * 3.乐观锁          验证无误
+ * 4.多租户          验证无误
+ *
  * @author meimie
  * @since 2018/6/7
  */
@@ -37,4 +43,8 @@ public class TestData extends BaseEntity {
 
     @Version
     private Integer version;
+    /**
+     * 多租户
+     */
+    private Long tenantId;
 }

+ 0 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/mapper/LogicTestDataMapper.java

@@ -8,5 +8,4 @@ import com.baomidou.mybatisplus.test.base.entity.LogicTestData;
  * @since 2018-07-06
  */
 public interface LogicTestDataMapper extends BaseMapper<LogicTestData> {
-
 }

+ 10 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/mapper/TestDataMapper.java

@@ -1,11 +1,21 @@
 package com.baomidou.mybatisplus.test.base.mapper;
 
+import com.baomidou.mybatisplus.annotation.SqlParser;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.test.base.entity.TestData;
+import org.apache.ibatis.annotations.ResultType;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
 
 /**
  * @author miemie
  * @since 2018/6/7
  */
 public interface TestDataMapper extends BaseMapper<TestData> {
+
+    @SqlParser(filter = true)
+    @ResultType(TestData.class)
+    @Select("select * from tb_test_data")
+    List<TestData> getAllNoTenant();
 }

+ 11 - 4
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/MysqlTestDataMapperTest.java

@@ -10,7 +10,9 @@ import com.baomidou.mybatisplus.test.base.entity.TestData;
 import com.baomidou.mybatisplus.test.base.mapper.LogicTestDataMapper;
 import com.baomidou.mybatisplus.test.base.mapper.TestDataMapper;
 import com.baomidou.mybatisplus.test.base.service.ILogicTestDataService;
+import com.baomidou.mybatisplus.test.mysql.config.MysqlDb;
 import org.junit.Assert;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.test.context.ContextConfiguration;
@@ -46,10 +48,10 @@ public class MysqlTestDataMapperTest {
     @Resource
     private ILogicTestDataService logicTestDataService;
 
-//    @BeforeClass
-//    public static void init() throws IOException, SQLException {
-//        MysqlDb.initMysqlData();
-//    }
+    @BeforeClass
+    public static void init() throws Exception {
+        MysqlDb.initMysqlData();
+    }
 
     @Test
     public void insertForeach() {
@@ -173,6 +175,11 @@ public class MysqlTestDataMapperTest {
             .eq("id", 1014361515554881538L));
     }
 
+    @Test
+    public void getAllNoTenant() {
+        mapper.getAllNoTenant();
+    }
+
     @Test
     public void selectById() {
         mapper.selectById(1L);

+ 42 - 4
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/config/MybatisPlusConfig.java

@@ -2,11 +2,16 @@ package com.baomidou.mybatisplus.test.mysql.config;
 
 import com.baomidou.mybatisplus.core.MybatisConfiguration;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
+import com.baomidou.mybatisplus.core.parser.ISqlParser;
 import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
 import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler;
+import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser;
 import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
 import com.baomidou.mybatisplus.test.mysql.MysqlMetaObjectHandler;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.LongValue;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.apache.ibatis.type.JdbcType;
 import org.mybatis.spring.annotation.MapperScan;
@@ -14,6 +19,8 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 import javax.sql.DataSource;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * <p>
@@ -28,7 +35,8 @@ import javax.sql.DataSource;
 public class MybatisPlusConfig {
 
     @Bean("mybatisSqlSession")
-    public SqlSessionFactory sqlSessionFactory(DataSource dataSource, GlobalConfig globalConfig) throws Exception {
+    public SqlSessionFactory sqlSessionFactory(DataSource dataSource, GlobalConfig globalConfig,
+                                               PaginationInterceptor paginationInterceptor) throws Exception {
         MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
         /* 数据源 */
         sqlSessionFactory.setDataSource(dataSource);
@@ -39,8 +47,7 @@ public class MybatisPlusConfig {
         /* 驼峰转下划线 */
         configuration.setMapUnderscoreToCamelCase(true);
         /* 分页插件 */
-        PaginationInterceptor pagination = new PaginationInterceptor();
-        configuration.addInterceptor(pagination);
+        configuration.addInterceptor(paginationInterceptor);
         /* 乐观锁插件 */
         configuration.addInterceptor(new OptimisticLockerInterceptor());
         sqlSessionFactory.setConfiguration(configuration);
@@ -52,11 +59,42 @@ public class MybatisPlusConfig {
 
     @Bean
     public GlobalConfig globalConfig() {
-        GlobalConfig conf = new GlobalConfig();
+        GlobalConfig conf = new GlobalConfig().setSqlParserCache(true);
         conf.setDbConfig(new GlobalConfig.DbConfig());
         /* 逻辑删除注入器 */
         LogicSqlInjector logicSqlInjector = new LogicSqlInjector();
         conf.setSqlInjector(logicSqlInjector);
         return conf;
     }
+
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
+        /*
+         * 【测试多租户】 SQL 解析处理拦截器<br>
+         * 这里固定写成住户 1 实际情况你可以从cookie读取,因此数据看不到 【 麻花藤 】 这条记录( 注意观察 SQL )<br>
+         */
+        List<ISqlParser> sqlParserList = new ArrayList<>();
+        TenantSqlParser tenantSqlParser = new TenantSqlParser();
+        tenantSqlParser.setTenantHandler(new TenantHandler() {
+            @Override
+            public Expression getTenantId() {
+                return new LongValue(1L);
+            }
+
+            @Override
+            public String getTenantIdColumn() {
+                return "tenant_id";
+            }
+
+            @Override
+            public boolean doTableFilter(String tableName) {
+                // 这里可以判断是否过滤表
+                return "tb_test_data_logic".equals(tableName);
+            }
+        });
+        sqlParserList.add(tenantSqlParser);
+        paginationInterceptor.setSqlParserList(sqlParserList);
+        return paginationInterceptor;
+    }
 }

+ 5 - 4
mybatis-plus/src/test/resources/mysql/test_data.ddl.sql

@@ -11,10 +11,10 @@ CREATE TABLE IF NOT EXISTS tb_test_data_logic (
     create_datetime datetime,
     update_datetime datetime,
     deleted         tinyint(1) default 0,
-    version        integer default 0
+    version         integer    default 0
 )
     ENGINE = innodb
-    DEFAULT CHARSET = utf8;
+DEFAULT CHARSET = utf8;
 
 CREATE TABLE IF NOT EXISTS tb_test_data (
     id              BIGINT primary key,
@@ -28,7 +28,8 @@ CREATE TABLE IF NOT EXISTS tb_test_data (
     test_timestamp  timestamp,
     create_datetime datetime,
     update_datetime datetime,
-    version        integer default 0
+    version         integer default 0,
+    tenant_id       bigint
 )
     ENGINE = innodb
-    DEFAULT CHARSET = utf8;
+DEFAULT CHARSET = utf8;