Pārlūkot izejas kodu

fix: 修复复杂情况中动态表名替换产生的问题:正则由空白检测转为单词边界检测

825944942@qq.com 5 gadi atpakaļ
vecāks
revīzija
191c15844f

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

@@ -31,13 +31,13 @@ public interface ITableNameHandler {
      * @param metaObject 元对象
      * @param sql        当前执行 SQL
      * @param tableName  表名
-     * @return
+     * @return 返回处理后的 SQL 语句
      */
     default String process(MetaObject metaObject, String sql, String tableName) {
         String dynamicTableName = dynamicTableName(metaObject, sql, tableName);
         if (null != dynamicTableName && !dynamicTableName.equalsIgnoreCase(tableName)) {
             // 直接替换字符串对于 SQL 操作是不那么好做,这里修复只能尽可能的保证处理没问题
-            String regex = "(?<=\\s)\\Q" + tableName + "\\E(?=\\s)";
+            String regex = "(?<=\\b)\\Q" + tableName + "\\E(?=\\b)";
             return sql.replaceAll(regex, dynamicTableName);
         }
         return sql;

+ 44 - 0
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/parsers/ITableNameHandlerTest.java

@@ -0,0 +1,44 @@
+package com.baomidou.mybatisplus.extension.parsers;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+/**
+ * Create by hcl at 2020/6/24
+ */
+class ITableNameHandlerTest {
+
+    /**
+     * 测试 process 方法
+     */
+    @Test
+    void process() {
+        // https://github.com/baomidou/mybatis-plus/issues/2411
+        ITableNameHandler handler = (metaObject, sql, tableName) -> {
+            if ("t_user".equals(tableName)) {
+                return "t_user_2019";
+            }
+            return null;
+        };
+        String before = "select a.* from t_user a join t_userrole b on b.userid = a.gid";
+        String after = "select a.* from t_user_2019 a join t_userrole b on b.userid = a.gid";
+        assertEquals(after, handler.process(null, before, "t_user"));
+
+        before = "select * from t_user";
+        after = "select * from t_user_2019";
+        assertEquals(after, handler.process(null, before, "t_user"));
+
+        before = "insert into t_user(id,name) values('1','zhangsan')";
+        after = "insert into t_user_2019(id,name) values('1','zhangsan')";
+        assertEquals(after, handler.process(null, before, "t_user"));
+        before = "select a.*,\n" +
+                "        (select count(1) from t_user) as cnt\n" +
+                "        from t_xxx a";
+        after = "select a.*,\n" +
+                "        (select count(1) from t_user_2019) as cnt\n" +
+                "        from t_xxx a";
+        assertEquals(after, handler.process(null, before, "t_user"));
+    }
+
+}