Browse Source

开发多租户支持调整

hubin 7 years ago
parent
commit
a5bfe03305

+ 8 - 5
src/main/java/com/baomidou/mybatisplus/plugins/CachePaginationInterceptor.java

@@ -33,10 +33,10 @@ import org.apache.ibatis.session.ResultHandler;
 import org.apache.ibatis.session.RowBounds;
 
 import com.baomidou.mybatisplus.enums.DBType;
-import com.baomidou.mybatisplus.plugins.parser.AbstractSqlParser;
-import com.baomidou.mybatisplus.plugins.parser.SqlInfo;
 import com.baomidou.mybatisplus.plugins.pagination.DialectFactory;
 import com.baomidou.mybatisplus.plugins.pagination.Pagination;
+import com.baomidou.mybatisplus.plugins.parser.AbstractSqlParser;
+import com.baomidou.mybatisplus.plugins.parser.SqlInfo;
 import com.baomidou.mybatisplus.toolkit.JdbcUtils;
 import com.baomidou.mybatisplus.toolkit.PluginUtils;
 import com.baomidou.mybatisplus.toolkit.SqlUtils;
@@ -148,16 +148,19 @@ public class CachePaginationInterceptor extends PaginationInterceptor implements
         }
     }
 
-    public void setDialectType(String dialectType) {
+    public CachePaginationInterceptor setDialectType(String dialectType) {
         this.dialectType = dialectType;
+        return this;
     }
 
-    public void setSqlParser(AbstractSqlParser sqlParser) {
+    public CachePaginationInterceptor setSqlParser(AbstractSqlParser sqlParser) {
         this.sqlParser = sqlParser;
+        return this;
     }
 
-    public void setOverflowCurrent(boolean overflowCurrent) {
+    public CachePaginationInterceptor setOverflowCurrent(boolean overflowCurrent) {
         this.overflowCurrent = overflowCurrent;
+        return this;
     }
 
 }

+ 7 - 6
src/main/java/com/baomidou/mybatisplus/plugins/SqlParserInterceptor.java

@@ -20,8 +20,6 @@ import java.util.List;
 import java.util.Properties;
 
 import org.apache.ibatis.executor.statement.StatementHandler;
-import org.apache.ibatis.logging.Log;
-import org.apache.ibatis.logging.LogFactory;
 import org.apache.ibatis.plugin.Interceptor;
 import org.apache.ibatis.plugin.Intercepts;
 import org.apache.ibatis.plugin.Invocation;
@@ -46,8 +44,6 @@ import com.baomidou.mybatisplus.toolkit.PluginUtils;
 @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
 public class SqlParserInterceptor implements Interceptor {
 
-    // 日志
-    private static final Log logger = LogFactory.getLog(SqlParserInterceptor.class);
     private static final String DELEGATE_BOUNDSQL_SQL = "delegate.boundSql.sql";
     // SQL 解析
     private List<AbstractSqlParser> sqlParserList;
@@ -61,14 +57,18 @@ public class SqlParserInterceptor implements Interceptor {
         MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
         // SQL 解析
         if (CollectionUtils.isNotEmpty(sqlParserList)) {
+            int flag = 0;// 标记是否修改过 SQL
             String originalSql = (String) metaObject.getValue(DELEGATE_BOUNDSQL_SQL);
             for (AbstractSqlParser sqlParser : sqlParserList) {
                 SqlInfo sqlInfo = sqlParser.optimizeSql(metaObject, originalSql);
                 if (null != sqlInfo) {
                     originalSql = sqlInfo.getSql();
+                    ++flag;
                 }
             }
-            metaObject.setValue(DELEGATE_BOUNDSQL_SQL, originalSql);
+            if (flag >= 1) {
+                metaObject.setValue(DELEGATE_BOUNDSQL_SQL, originalSql);
+            }
         }
         return invocation.proceed();
     }
@@ -90,7 +90,8 @@ public class SqlParserInterceptor implements Interceptor {
         return sqlParserList;
     }
 
-    public void setSqlParserList(List<AbstractSqlParser> sqlParserList) {
+    public SqlParserInterceptor setSqlParserList(List<AbstractSqlParser> sqlParserList) {
         this.sqlParserList = sqlParserList;
+        return this;
     }
 }

+ 21 - 28
src/main/java/com/baomidou/mybatisplus/plugins/tenancy/TenancySqlParser.java

@@ -15,7 +15,6 @@
  */
 package com.baomidou.mybatisplus.plugins.tenancy;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.ibatis.reflection.MetaObject;
@@ -30,7 +29,6 @@ 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;
-import net.sf.jsqlparser.expression.operators.relational.InExpression;
 import net.sf.jsqlparser.parser.CCJSqlParserUtil;
 import net.sf.jsqlparser.schema.Column;
 import net.sf.jsqlparser.schema.Table;
@@ -61,7 +59,7 @@ import net.sf.jsqlparser.statement.update.Update;
  */
 public class TenancySqlParser extends AbstractSqlParser {
 
-    private TenantInfo tenantInfo;
+    private TenantHandler tenantHandler;
 
     @Override
     public SqlInfo optimizeSql(MetaObject metaObject, String sql) {
@@ -119,11 +117,11 @@ public class TenancySqlParser extends AbstractSqlParser {
         if (doTableFilter(
                 insert.getTable().getName()
         )) {
-            insert.getColumns().add(new Column(this.tenantInfo.getTenantIdColumn()));
+            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.tenantInfo.getTenantId() + ","));
+                ((ExpressionList) insert.getItemsList()).getExpressions().add(new StringValue("," + this.tenantHandler.getTenantId() + ","));
             } else {
                 throw new RuntimeException("无法处理的 sql");
             }
@@ -140,13 +138,13 @@ public class TenancySqlParser extends AbstractSqlParser {
         Expression where = update.getWhere();
         EqualsTo equalsTo = new EqualsTo();
         if (where instanceof BinaryExpression) {
-            equalsTo.setLeftExpression(new Column(this.tenantInfo.getTenantIdColumn()));
-            equalsTo.setRightExpression(new StringValue("," + tenantInfo.getTenantId() + ","));
+            equalsTo.setLeftExpression(new Column(this.tenantHandler.getTenantIdColumn()));
+            equalsTo.setRightExpression(new StringValue("," + tenantHandler.getTenantId() + ","));
             AndExpression andExpression = new AndExpression(equalsTo, where);
             update.setWhere(andExpression);
         } else {
-            equalsTo.setLeftExpression(new Column(this.tenantInfo.getTenantIdColumn()));
-            equalsTo.setRightExpression(new StringValue("," + tenantInfo.getTenantId() + ","));
+            equalsTo.setLeftExpression(new Column(this.tenantHandler.getTenantIdColumn()));
+            equalsTo.setRightExpression(new StringValue("," + tenantHandler.getTenantId() + ","));
             update.setWhere(equalsTo);
         }
     }
@@ -182,7 +180,7 @@ public class TenancySqlParser extends AbstractSqlParser {
             if (doTableFilter(fromTable.getName())) {
                 plainSelect.setWhere(builderExpression(plainSelect.getWhere(), fromTable));
                 if (addColumn)
-                    plainSelect.getSelectItems().add(new SelectExpressionItem(new Column("'" + this.tenantInfo.getTenantId() + "'")));
+                    plainSelect.getSelectItems().add(new SelectExpressionItem(new Column("'" + this.tenantHandler.getTenantId() + "'")));
             }
         } else {
             processFromItem(fromItem);
@@ -254,7 +252,6 @@ public class TenancySqlParser extends AbstractSqlParser {
      */
     public Expression builderExpression(Expression expression, Table table) {
         Expression tenantExpression = null;
-        String[] tenantIds = this.tenantInfo.getTenantId().split(",");
         //当传入table时,字段前加上别名或者table名
         //别名优先使用
         StringBuilder tenantIdColumnName = new StringBuilder();
@@ -262,26 +259,14 @@ public class TenancySqlParser extends AbstractSqlParser {
             tenantIdColumnName.append(table.getAlias() != null ? table.getAlias().getName() : table.getName());
             tenantIdColumnName.append(".");
         }
-        tenantIdColumnName.append(this.tenantInfo.getTenantIdColumn());
+        tenantIdColumnName.append(this.tenantHandler.getTenantIdColumn());
         //生成字段名
         Column tenantColumn = new Column(tenantIdColumnName.toString());
 
-        if (tenantIds.length == 1) {
-            EqualsTo equalsTo = new EqualsTo();
-            tenantExpression = equalsTo;
-            equalsTo.setLeftExpression(tenantColumn);
-            equalsTo.setRightExpression(new StringValue("'" + tenantIds[0] + "'"));
-        } else {
-            //多租户身份
-            InExpression inExpression = new InExpression();
-            tenantExpression = inExpression;
-            inExpression.setLeftExpression(tenantColumn);
-            List<Expression> valueList = new ArrayList<>();
-            for (String tid : tenantIds) {
-                valueList.add(new StringValue("'" + tid + "'"));
-            }
-            inExpression.setRightItemsList(new ExpressionList(valueList));
-        }
+        EqualsTo equalsTo = new EqualsTo();
+        tenantExpression = equalsTo;
+        equalsTo.setLeftExpression(tenantColumn);
+        equalsTo.setRightExpression(new StringValue("'" + this.tenantHandler.getTenantId() + "'"));
 
         //加入判断防止条件为空时生成 "and null" 导致查询结果为空
         if (expression == null) {
@@ -304,4 +289,12 @@ public class TenancySqlParser extends AbstractSqlParser {
     private boolean doTableFilter(String table) {
         return true;
     }
+
+    public TenantHandler getTenantHandler() {
+        return tenantHandler;
+    }
+
+    public void setTenantHandler(TenantHandler tenantHandler) {
+        this.tenantHandler = tenantHandler;
+    }
 }

+ 5 - 9
src/main/java/com/baomidou/mybatisplus/plugins/tenancy/TenantInfo.java → src/main/java/com/baomidou/mybatisplus/plugins/tenancy/TenantHandler.java

@@ -15,24 +15,20 @@
  */
 package com.baomidou.mybatisplus.plugins.tenancy;
 
-import java.util.Properties;
+import java.io.Serializable;
 
 /**
  * <p>
- * 租户信息
+ * 租户处理器
  * </p>
  *
  * @author hubin
- * @since 2017-06-20
+ * @since 2017-08-31
  */
-public interface TenantInfo {
+public interface TenantHandler {
 
-    TenantInfo setHandlerConfig(Properties properties);
-
-    String getTenantId();
+    Serializable getTenantId();
 
     String getTenantIdColumn();
 
-    TenantInfo setTenantIdColumn(String tenantIdColumn);
-
 }