miemie 4 年之前
父節點
當前提交
e20550eda6

+ 2 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisMapperAnnotationBuilder.java

@@ -107,10 +107,10 @@ public class MybatisMapperAnnotationBuilder extends MapperAnnotationBuilder {
                     parseResultMap(method);
                 }
                 try {
-                    parseStatement(method);
-                    // TODO 加入 SqlParser 注解过滤缓存
+                    // TODO 加入 注解过滤缓存
                     InterceptorIgnoreHelper.initSqlParserInfoCache(cache, mapperName, method);
                     SqlParserHelper.initSqlParserInfoCache(mapperName, method);
+                    parseStatement(method);
                 } catch (IncompleteElementException e) {
                     // TODO 使用 MybatisMethodResolver 而不是 MethodResolver
                     configuration.addIncompleteMethod(new MybatisMethodResolver(this, method));

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

@@ -31,7 +31,7 @@ public class MybatisMethodResolver extends MethodResolver {
     private final Method method;
 
     public MybatisMethodResolver(MybatisMapperAnnotationBuilder annotationBuilder, Method method) {
-        super(annotationBuilder, method);
+        super(null, null);
         this.annotationBuilder = annotationBuilder;
         this.method = method;
     }

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

@@ -52,7 +52,7 @@ public class MybatisXMLLanguageDriver extends XMLLanguageDriver {
             List<String> find = SqlUtils.findPlaceholder(script);
             if (CollectionUtils.isNotEmpty(find)) {
                 try {
-                    script = SqlUtils.replaceSqlPlaceholder(script, find, config.getPropertyFormat());
+                    script = SqlUtils.replaceSqlPlaceholder(script, find, config.getEscapeSymbol());
                 } catch (MybatisPlusException e) {
                     throw new IncompleteElementException();
                 }

+ 19 - 6
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/config/GlobalConfig.java

@@ -113,17 +113,20 @@ public class GlobalConfig implements Serializable {
         private String schema;
         /**
          * db字段 format
-         * <li> 例: `%s` </li>
-         * <p> 对主键无效 </p>
+         * <p>
+         * 例: `%s`
+         * <p>
+         * 对主键无效
          *
          * @since 3.1.1
          */
         private String columnFormat;
         /**
-         * entity 的字段(property)的 format,
-         * 只有在 column as property 这种情况下生效
-         * <li> 例: `%s` </li>
-         * <p> 对主键无效 </p>
+         * entity 的字段(property)的 format,只有在 column as property 这种情况下生效
+         * <p>
+         * 例: `%s`
+         * <p>
+         * 对主键无效
          *
          * @since 3.3.0
          */
@@ -135,6 +138,16 @@ public class GlobalConfig implements Serializable {
          * @since 3.4.2
          */
         private boolean replacePlaceholder;
+        /**
+         * 转义符
+         * <p>
+         * 配合 {@link #replacePlaceholder} 使用时有效
+         * <p>
+         * 例: " 或 ' 或 `
+         *
+         * @since 3.4.2
+         */
+        private String escapeSymbol;
         /**
          * 表名是否使用驼峰转下划线命名,只对表名生效
          */

+ 15 - 9
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/sql/SqlUtils.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
 import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -65,7 +66,7 @@ public abstract class SqlUtils implements Constants {
         return list;
     }
 
-    public static String replaceSqlPlaceholder(String sql, List<String> placeHolder, String asFormat) {
+    public static String replaceSqlPlaceholder(String sql, List<String> placeHolder, String escapeSymbol) {
         for (String s : placeHolder) {
             String s1 = s.substring(2, s.length() - 1);
             int i1 = s1.indexOf(COLON);
@@ -85,22 +86,22 @@ public abstract class SqlUtils implements Constants {
                     asAlisa = s1.substring(i1 + 1);
                 }
             }
-            sql = sql.replace(s, getSelectBody(tableName, alisa, asAlisa, asFormat));
+            sql = sql.replace(s, getSelectBody(tableName, alisa, asAlisa, escapeSymbol));
         }
         return sql;
     }
 
-    public static String getSelectBody(String tableName, String alisa, String asAlisa, String asFormat) {
+    public static String getSelectBody(String tableName, String alisa, String asAlisa, String escapeSymbol) {
         TableInfo tableInfo = TableInfoHelper.getTableInfo(tableName);
         Assert.notNull(tableInfo, "can not find TableInfo Cache by \"%s\"", tableName);
         String s = tableInfo.chooseSelect(TableFieldInfo::isSelect);
         if (alisa == null) {
             return s;
         }
-        return getNewSelectBody(s, alisa, asAlisa, asFormat);
+        return getNewSelectBody(s, alisa, asAlisa, escapeSymbol);
     }
 
-    public static String getNewSelectBody(String selectBody, String alisa, String asAlisa, String asFormat) {
+    public static String getNewSelectBody(String selectBody, String alisa, String asAlisa, String escapeSymbol) {
         String[] split = selectBody.split(COMMA);
         StringBuilder sb = new StringBuilder();
         boolean asA = asAlisa != null;
@@ -109,11 +110,12 @@ public abstract class SqlUtils implements Constants {
             if (asA) {
                 int as = body.indexOf(AS);
                 if (as < 0) {
-                    sb.append(sa).append(body).append(AS).append(String.format(asFormat, asAlisa.concat(DOT).concat(body)));
+                    sb.append(sa).append(body).append(AS).append(escapeColumn(asAlisa.concat(DOT).concat(body), escapeSymbol));
                 } else {
-                    // todo
-                    String s1 = body.substring(0, as);
-                    sb.append(s1);
+                    String column = body.substring(0, as);
+                    String property = body.substring(as + 4);
+                    property = StringUtils.getTargetColumn(property);
+                    sb.append(sa).append(column).append(AS).append(escapeColumn(asAlisa.concat(DOT).concat(property), escapeSymbol));
                 }
             } else {
                 sb.append(sa).append(body);
@@ -122,4 +124,8 @@ public abstract class SqlUtils implements Constants {
         }
         return sb.deleteCharAt(sb.length() - 1).toString();
     }
+
+    private static String escapeColumn(String column, String escapeSymbol) {
+        return escapeSymbol.concat(column).concat(escapeSymbol);
+    }
 }

+ 4 - 4
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/toolkit/sql/SqlUtilsTest.java

@@ -26,7 +26,7 @@ class SqlUtilsTest {
         s = SqlUtils.getNewSelectBody("`id`,`name`", "d", null, null);
         assertThat(s).isEqualTo("d.`id`,d.`name`");
 
-        s = SqlUtils.getNewSelectBody("id,name", "d", "pp", "`%s`");
+        s = SqlUtils.getNewSelectBody("id,name", "d", "pp", "`");
         assertThat(s).isEqualTo("d.id AS `pp.id`,d.name AS `pp.name`");
 
         s = SqlUtils.getNewSelectBody("id AS t_id,name AS t_name", "d", null, null);
@@ -35,10 +35,10 @@ class SqlUtilsTest {
         s = SqlUtils.getNewSelectBody("`id` AS t_id,`name` AS t_name", "d", null, null);
         assertThat(s).isEqualTo("d.`id` AS t_id,d.`name` AS t_name");
 
-        s = SqlUtils.getNewSelectBody("id AS `t_id`,name AS `t_name`", "d", "pp", "`%s`");
+        s = SqlUtils.getNewSelectBody("id AS `t_id`,name AS `t_name`", "d", "pp", "`");
         assertThat(s).isEqualTo("d.id AS `pp.t_id`,d.name AS `pp.t_name`");
 
-        s = SqlUtils.getNewSelectBody("`id` AS `t_id`,`name` AS `t_name`", "d", "pp", "`%s`");
-        assertThat(s).isEqualTo("d.`id` AS `pp.t_id`,d.`name` AS `pp.t_name`");
+        s = SqlUtils.getNewSelectBody("`id` AS `t_id`,`name` AS `t_name`", "d", "pp", "'");
+        assertThat(s).isEqualTo("d.`id` AS 'pp.t_id',d.`name` AS 'pp.t_name'");
     }
 }

+ 5 - 5
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/ReplacePlaceholderInnerInterceptor.java

@@ -16,7 +16,7 @@ import java.sql.SQLException;
 import java.util.List;
 
 /**
- * 功能类似于 {@link GlobalConfig.DbConfig#replacePlaceholder},
+ * 功能类似于 {@link GlobalConfig.DbConfig#isReplacePlaceholder()},
  * 只是这个是在运行时实时替换,适用范围更广
  *
  * @author miemie
@@ -26,13 +26,13 @@ public class ReplacePlaceholderInnerInterceptor implements InnerInterceptor {
 
     protected final Log logger = LogFactory.getLog(this.getClass());
 
-    private String asFormat;
+    private String escapeSymbol;
 
     public ReplacePlaceholderInnerInterceptor() {
     }
 
-    public ReplacePlaceholderInnerInterceptor(String asFormat) {
-        this.asFormat = asFormat;
+    public ReplacePlaceholderInnerInterceptor(String escapeSymbol) {
+        this.escapeSymbol = escapeSymbol;
     }
 
     @Override
@@ -40,7 +40,7 @@ public class ReplacePlaceholderInnerInterceptor implements InnerInterceptor {
         String sql = boundSql.getSql();
         List<String> find = SqlUtils.findPlaceholder(sql);
         if (CollectionUtils.isNotEmpty(find)) {
-            sql = SqlUtils.replaceSqlPlaceholder(sql, find, asFormat);
+            sql = SqlUtils.replaceSqlPlaceholder(sql, find, escapeSymbol);
             PluginUtils.mpBoundSql(boundSql).sql(sql);
         }
     }

+ 0 - 105
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/ReplaceSelectBodyInnerInterceptor.java

@@ -1,105 +0,0 @@
-package com.baomidou.mybatisplus.extension.plugins.inner;
-
-import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
-import com.baomidou.mybatisplus.core.metadata.TableInfo;
-import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
-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 org.apache.ibatis.executor.Executor;
-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.session.ResultHandler;
-import org.apache.ibatis.session.RowBounds;
-
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * @author miemie
- * @since 2020-11-19
- */
-public class ReplaceSelectBodyInnerInterceptor implements InnerInterceptor {
-
-    private static final Pattern pattern = Pattern.compile("\\{@((\\w+?)|(\\w+?:\\w+?)|(\\w+?:\\w+?:\\w+?))}");
-    protected final Log logger = LogFactory.getLog(this.getClass());
-
-    @Override
-    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
-        PluginUtils.MpSqlSource source = PluginUtils.mpSqlSource(ms.getSqlSource());
-        String sourceSql = source.sql();
-        List<String> list = find(sourceSql);
-        if (CollectionUtils.isNotEmpty(list)) {
-            sourceSql = getTargetSql(sourceSql, list);
-            source.sql(sourceSql);
-            // then
-            String sql = boundSql.getSql();
-            List<String> find = find(sql);
-            if (CollectionUtils.isNotEmpty(find)) {
-                sql = getTargetSql(sql, find);
-                PluginUtils.mpBoundSql(boundSql).sql(sql);
-            }
-        }
-    }
-
-    protected List<String> find(String sql) {
-        Matcher matcher = pattern.matcher(sql);
-        List<String> list = new ArrayList<>();
-        while (matcher.find()) {
-            list.add(matcher.group());
-        }
-        return list;
-    }
-
-    protected String getTargetSql(String sql, List<String> find) {
-        for (String s : find) {
-            String s1 = s.substring(2, s.length() - 1);
-            int i1 = s1.indexOf(StringPool.COLON);
-            String tableName;
-            String alisa = null;
-            String asAlisa = null;
-            if (i1 < 0) {
-                tableName = s1;
-            } else {
-                tableName = s1.substring(0, i1);
-                s1 = s1.substring(i1 + 1);
-                i1 = s1.indexOf(StringPool.COLON);
-                if (i1 < 0) {
-                    alisa = s1;
-                } else {
-                    alisa = s1.substring(0, i1);
-                    asAlisa = s1.substring(i1 + 1);
-                }
-            }
-            sql = sql.replace(s, getTargetSelectBody(tableName, alisa, asAlisa));
-        }
-        return sql;
-    }
-
-    protected String getTargetSelectBody(String tableName, String alisa, String asAlisa) {
-        TableInfo tableInfo = TableInfoHelper.getTableInfo(tableName);
-        Assert.notNull(tableInfo, "can not find TableInfo Cache by \"%s\"", tableName);
-        String s = tableInfo.chooseSelect(TableFieldInfo::isSelect);
-        if (alisa == null) {
-            return s;
-        }
-        return newSelectBody(s, alisa, asAlisa);
-    }
-
-    protected String newSelectBody(String selectBody, String alisa, String asAlisa) {
-        String[] split = selectBody.split(StringPool.COMMA);
-        StringBuilder sb = new StringBuilder();
-        if (asAlisa == null) {
-            for (String s : split) {
-                sb.append(alisa).append(StringPool.DOT).append(s).append(StringPool.COMMA);
-            }
-        }
-        return sb.deleteCharAt(sb.length() - 1).toString();
-    }
-}