Jelajahi Sumber

优化,为后续优化做准备

miemie 6 tahun lalu
induk
melakukan
91bd366ebc

+ 36 - 9
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableFieldInfo.java

@@ -15,20 +15,18 @@
  */
 package com.baomidou.mybatisplus.core.metadata;
 
-import java.lang.reflect.Field;
-
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.FieldStrategy;
-import com.baomidou.mybatisplus.annotation.SqlCondition;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;
-
+import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
+import lombok.AccessLevel;
 import lombok.Data;
+import lombok.Setter;
 import lombok.experimental.Accessors;
 
+import java.lang.reflect.Field;
+
 /**
  * <p>
  * 数据库表字段反射信息
@@ -95,10 +93,15 @@ public class TableFieldInfo {
      * 标记该字段属于哪个类
      */
     private Class<?> clazz;
+    /**
+     * 缓存 sql select
+     */
+    @Setter(AccessLevel.NONE)
+    private String sqlSelect;
 
     /**
      * <p>
-     * 存在 TableField 注解构造函数
+     * 存在 TableField 注解时, 使用的构造函数
      * </p>
      */
     public TableFieldInfo(GlobalConfig.DbConfig dbConfig, TableInfo tableInfo, Field field,
@@ -140,6 +143,11 @@ public class TableFieldInfo {
         this.select = tableField.select();
     }
 
+    /**
+     * <p>
+     * 不存在 TableField 注解时, 使用的构造函数
+     * </p>
+     */
     public TableFieldInfo(GlobalConfig.DbConfig dbConfig, TableInfo tableInfo, Field field) {
         this.property = field.getName();
         this.el = field.getName();
@@ -219,4 +227,23 @@ public class TableFieldInfo {
             }
         }
     }
+
+    /**
+     * 获取 select sql 片段
+     *
+     * @param dbType 数据库类型
+     * @return sql 片段
+     */
+    public String getSqlSelect(DbType dbType) {
+        if (sqlSelect != null) {
+            return sqlSelect;
+        }
+        if (isRelated()) {
+            sqlSelect = SqlUtils.sqlWordConvert(dbType, getColumn(), true) + " AS " +
+                SqlUtils.sqlWordConvert(dbType, getProperty(), false);
+        } else {
+            sqlSelect = SqlUtils.sqlWordConvert(dbType, getColumn(), true);
+        }
+        return sqlSelect;
+    }
 }

+ 24 - 5
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableInfo.java

@@ -20,14 +20,17 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.core.toolkit.Assert;
-import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import lombok.AccessLevel;
 import lombok.Data;
+import lombok.Setter;
 import lombok.experimental.Accessors;
 import org.apache.ibatis.session.Configuration;
 
 import java.util.List;
 
+import static java.util.stream.Collectors.joining;
+
 /**
  * <p>
  * 数据库表反射信息
@@ -76,6 +79,7 @@ public class TableInfo {
     /**
      * 表字段信息列表
      */
+    @Setter(AccessLevel.NONE)
     private List<TableFieldInfo> fieldList;
     /**
      * 命名空间
@@ -93,6 +97,11 @@ public class TableInfo {
      * 标记该字段属于哪个类
      */
     private Class<?> clazz;
+    /**
+     * 缓存 sql select
+     */
+    @Setter(AccessLevel.NONE)
+    private String sqlSelect;
 
     /**
      * <p>
@@ -121,10 +130,6 @@ public class TableInfo {
         }
     }
 
-    public void setFieldList(List<TableFieldInfo> fieldList) {
-        throw ExceptionUtils.mpe("you can't use this method to set fieldList !");
-    }
-
     public void setConfigMark(Configuration configuration) {
         Assert.notNull(configuration, "Error: You need Initialize MybatisConfiguration !");
         this.configMark = configuration.toString();
@@ -133,4 +138,18 @@ public class TableInfo {
     public boolean isLogicDelete() {
         return logicDelete;
     }
+
+    /**
+     * 获取 select sql 片段
+     *
+     * @return sql 片段
+     */
+    public String getSqlSelect() {
+        if (sqlSelect != null) {
+            return sqlSelect;
+        }
+        sqlSelect = getFieldList().stream().filter(TableFieldInfo::isSelect)
+            .map(i -> i.getSqlSelect(getDbType())).collect(joining(","));
+        return sqlSelect;
+    }
 }

+ 12 - 18
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/StringUtils.java

@@ -144,9 +144,9 @@ public class StringUtils {
      */
     public static String resolveFieldName(String getMethodName) {
         if (getMethodName.startsWith("get")) {
-            getMethodName = getMethodName.substring(3, getMethodName.length());
-        } else if (getMethodName.startsWith("is")) {
-            getMethodName = getMethodName.substring(2, getMethodName.length());
+            getMethodName = getMethodName.substring(3);
+        } else if (getMethodName.startsWith(IS)) {
+            getMethodName = getMethodName.substring(2);
         }
         // 小写第一个字母
         return StringUtils.firstToLowerCase(getMethodName);
@@ -192,10 +192,7 @@ public class StringUtils {
         if (isEmpty(param)) {
             return EMPTY;
         }
-        StringBuilder sb = new StringBuilder(param.length());
-        sb.append(param.substring(0, 1).toLowerCase());
-        sb.append(param.substring(1));
-        return sb.toString();
+        return param.substring(0, 1).toLowerCase() + param.substring(1);
     }
 
     /**
@@ -307,7 +304,8 @@ public class StringUtils {
      * @return 单引号包含的原字符串的集合形式
      */
     public static String quotaMarkList(Collection<?> coll) {
-        return coll.stream().map(StringUtils::quotaMark).collect(joining(StringPool.COMMA, StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET));
+        return coll.stream().map(StringUtils::quotaMark)
+            .collect(joining(StringPool.COMMA, StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET));
     }
 
     /**
@@ -334,11 +332,7 @@ public class StringUtils {
             return str;
         }
 
-        StringBuilder sb = new StringBuilder(strLen);
-        sb.append(concatStr);
-        sb.append(Character.toTitleCase(firstChar));
-        sb.append(str.substring(1));
-        return sb.toString();
+        return concatStr + Character.toTitleCase(firstChar) + str.substring(1);
     }
 
     /**
@@ -647,11 +641,11 @@ public class StringUtils {
      * 是否为CharSequence类型
      * </p>
      *
-     * @param cls
-     * @return
+     * @param clazz class
+     * @return true 为是 CharSequence 类型
      */
-    public static Boolean isCharSequence(Class<?> cls) {
-        return cls != null && CharSequence.class.isAssignableFrom(cls);
+    public static boolean isCharSequence(Class<?> clazz) {
+        return clazz != null && CharSequence.class.isAssignableFrom(clazz);
     }
 
     /**
@@ -700,7 +694,7 @@ public class StringUtils {
      * @param propertyCls
      * @return
      */
-    public static Boolean isBoolean(Class<?> propertyCls) {
+    public static boolean isBoolean(Class<?> propertyCls) {
         return propertyCls != null && (boolean.class.isAssignableFrom(propertyCls) || Boolean.class.isAssignableFrom(propertyCls));
     }
 

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

@@ -15,6 +15,7 @@
  */
 package com.baomidou.mybatisplus.core.toolkit.sql;
 
+import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.enums.SqlLike;
 import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
@@ -75,6 +76,24 @@ public class SqlUtils {
         return builder.toString();
     }
 
+    /**
+     * <p>
+     * 获取需要转义的SQL字段
+     * </p>
+     *
+     * @param dbType   数据库类型
+     * @param val      值
+     * @param isColumn val 是否是数据库字段
+     */
+    public static String sqlWordConvert(DbType dbType, String val, boolean isColumn) {
+        if (dbType == DbType.POSTGRE_SQL) {
+            if (isColumn && val.toLowerCase().equals(val)) {
+                return val;
+            }
+            return String.format("\"%s\"", val);
+        }
+        return val;
+    }
 
     /**
      * <p>