hubin 6 лет назад
Родитель
Сommit
1c6545462c

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/parser/ISqlParser.java

@@ -43,7 +43,7 @@ public interface ISqlParser {
      * @param sql        SQL 语句
      * @return SQL 信息
      */
-    default boolean doFilter(MetaObject metaObject, String sql) {
+    default boolean doFilter(final MetaObject metaObject, final String sql) {
         // 默认 true 执行 SQL 解析, 可重写实现控制逻辑
         return true;
     }

+ 16 - 5
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/parsers/DynamicTableNameParser.java

@@ -19,14 +19,13 @@ import com.baomidou.mybatisplus.core.parser.ISqlParser;
 import com.baomidou.mybatisplus.core.parser.SqlInfo;
 import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
 import com.baomidou.mybatisplus.core.toolkit.TableNameParser;
 import lombok.Data;
 import lombok.experimental.Accessors;
 import org.apache.ibatis.reflection.MetaObject;
 
 import java.util.Collection;
-import java.util.List;
+import java.util.Map;
 
 /**
  * 动态表名 SQL 解析器
@@ -37,13 +36,25 @@ import java.util.List;
 @Data
 @Accessors(chain = true)
 public class DynamicTableNameParser implements ISqlParser {
-    private List<ITableNameHandler> tableNameHandlers;
+    private Map<String, ITableNameHandler> tableNameHandlerMap;
 
     @Override
     public SqlInfo parser(MetaObject metaObject, String sql) {
-        Assert.isFalse(CollectionUtils.isEmpty(tableNameHandlers), "tableNameHandlers is empty.");
+        Assert.isFalse(CollectionUtils.isEmpty(tableNameHandlerMap), "tableNameHandlerMap is empty.");
         Collection<String> tables = new TableNameParser(sql).tables();
-        // 待写完
+        if (CollectionUtils.isNotEmpty(tables)) {
+            int flag = 0;
+            for (final String table : tables) {
+                ITableNameHandler tableNameHandler = tableNameHandlerMap.get(table);
+                if (null != tableNameHandler) {
+                    tableNameHandler.process(metaObject, sql, table);
+                    ++flag;
+                }
+            }
+            if (flag > 0) {
+                return SqlInfo.newInstance().setSql(sql);
+            }
+        }
         return null;
     }
 }

+ 22 - 3
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/parsers/ITableNameHandler.java

@@ -15,6 +15,8 @@
  */
 package com.baomidou.mybatisplus.extension.parsers;
 
+import org.apache.ibatis.reflection.MetaObject;
+
 /**
  * 动态表名处理器
  *
@@ -24,10 +26,27 @@ package com.baomidou.mybatisplus.extension.parsers;
 public interface ITableNameHandler {
 
     /**
-     * 表名处理
+     * 表名 SQL 处理
      *
-     * @param tableName
+     * @param metaObject 元对象
+     * @param sql        当前执行 SQL
+     * @param tableName  表名
      * @return
      */
-    String process(String tableName);
+    default void process(MetaObject metaObject, String sql, String tableName) {
+        String dynamicTableName = dynamicTableName(metaObject, sql, tableName);
+        if (null != dynamicTableName && !dynamicTableName.equalsIgnoreCase(tableName)) {
+            sql.replaceAll(tableName, dynamicTableName);
+        }
+    }
+
+    /**
+     * 生成动态表名,无改变返回 NULL
+     *
+     * @param metaObject 元对象
+     * @param sql        当前执行 SQL
+     * @param tableName  表名
+     * @return String
+     */
+    String dynamicTableName(MetaObject metaObject, String sql, String tableName);
 }