Просмотр исходного кода

fixed github pull/295 多租户拦截器支持批量更新操作

hubin 7 лет назад
Родитель
Сommit
e45b10828d

+ 15 - 3
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/parser/AbstractJsqlParser.java

@@ -25,6 +25,7 @@ import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
 import net.sf.jsqlparser.JSQLParserException;
 import net.sf.jsqlparser.parser.CCJSqlParserUtil;
 import net.sf.jsqlparser.statement.Statement;
+import net.sf.jsqlparser.statement.Statements;
 import net.sf.jsqlparser.statement.delete.Delete;
 import net.sf.jsqlparser.statement.insert.Insert;
 import net.sf.jsqlparser.statement.select.Select;
@@ -60,10 +61,21 @@ public abstract class AbstractJsqlParser implements ISqlParser {
     public SqlInfo optimizeSql(MetaObject metaObject, String sql) {
         if (this.allowProcess(metaObject)) {
             try {
-                Statement statement = CCJSqlParserUtil.parse(sql);
                 logger.debug("Original SQL: " + sql);
-                if (null != statement) {
-                    return this.processParser(statement);
+                // fixed github pull/295
+                StringBuilder sqlStringBuilder = new StringBuilder();
+                Statements statements = CCJSqlParserUtil.parseStatements(sql);
+                int i = 0;
+                for (Statement statement : statements.getStatements()) {
+                    if (null != statement) {
+                        if (i++ > 0) {
+                            sqlStringBuilder.append(';');
+                        }
+                        sqlStringBuilder.append(this.processParser(statement).getSql());
+                    }
+                }
+                if (sqlStringBuilder.length() > 0) {
+                    return SqlInfo.newInstance().setSql(sqlStringBuilder.toString());
                 }
             } catch (JSQLParserException e) {
                 throw new MybatisPlusException("Failed to process, please exclude the tableName or statementId.\n Error SQL: " + sql, e);

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

@@ -25,6 +25,8 @@ import net.sf.jsqlparser.expression.Expression;
 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.ItemsList;
+import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
 import net.sf.jsqlparser.schema.Column;
 import net.sf.jsqlparser.schema.Table;
 import net.sf.jsqlparser.statement.delete.Delete;
@@ -92,7 +94,16 @@ public class TenantSqlParser extends AbstractJsqlParser {
         if (insert.getSelect() != null) {
             processPlainSelect((PlainSelect) insert.getSelect().getSelectBody(), true);
         } else if (insert.getItemsList() != null) {
-            ((ExpressionList) insert.getItemsList()).getExpressions().add(tenantHandler.getTenantId());
+            // fixed github pull/295
+            ItemsList itemsList = insert.getItemsList();
+            if (itemsList instanceof MultiExpressionList) {
+                List<ExpressionList> exprList = ((MultiExpressionList) itemsList).getExprList();
+                for (ExpressionList el : exprList) {
+                    el.getExpressions().add(tenantHandler.getTenantId());
+                }
+            } else {
+                ((ExpressionList) insert.getItemsList()).getExpressions().add(tenantHandler.getTenantId());
+            }
         } else {
             throw new MybatisPlusException("Failed to process multiple-table update, please exclude the tableName or statementId");
         }