Browse Source

继续优化,为后续优化做准备

miemie 6 years ago
parent
commit
0857dc1b64

+ 2 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableFieldInfo.java

@@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
 import lombok.AccessLevel;
 import lombok.Data;
+import lombok.Getter;
 import lombok.Setter;
 import lombok.experimental.Accessors;
 
@@ -97,6 +98,7 @@ public class TableFieldInfo {
      * 缓存 sql select
      */
     @Setter(AccessLevel.NONE)
+    @Getter(AccessLevel.NONE)
     private String sqlSelect;
 
     /**

+ 42 - 4
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableInfo.java

@@ -21,6 +21,8 @@ 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.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
 import lombok.AccessLevel;
 import lombok.Data;
 import lombok.Setter;
@@ -98,7 +100,12 @@ public class TableInfo {
      */
     private Class<?> clazz;
     /**
-     * 缓存 sql select
+     * 缓存包含主键及字段的 sql select
+     */
+    @Setter(AccessLevel.NONE)
+    private String allSqlSelect;
+    /**
+     * 缓存主键字段的 sql select
      */
     @Setter(AccessLevel.NONE)
     private String sqlSelect;
@@ -140,7 +147,7 @@ public class TableInfo {
     }
 
     /**
-     * 获取 select sql 片段
+     * 获取主键的 select sql 片段
      *
      * @return sql 片段
      */
@@ -148,8 +155,39 @@ public class TableInfo {
         if (sqlSelect != null) {
             return sqlSelect;
         }
-        sqlSelect = getFieldList().stream().filter(TableFieldInfo::isSelect)
-            .map(i -> i.getSqlSelect(getDbType())).collect(joining(","));
+        if (StringUtils.isNotEmpty(keyProperty)) {
+            if (isKeyRelated()) {
+                sqlSelect = SqlUtils.sqlWordConvert(dbType, keyColumn, true) + " AS " +
+                    SqlUtils.sqlWordConvert(dbType, keyProperty, false);
+            } else {
+                sqlSelect = SqlUtils.sqlWordConvert(dbType, keyColumn, true);
+            }
+            return sqlSelect;
+        }
+        sqlSelect = "";
         return sqlSelect;
     }
+
+    /**
+     * 获取包含主键及字段的 select sql 片段
+     *
+     * @return sql 片段
+     */
+    public String getAllSqlSelect() {
+        if (allSqlSelect != null) {
+            return allSqlSelect;
+        }
+        String sqlSelect = getSqlSelect();
+        String fieldsSqlSelect = fieldList.stream().filter(TableFieldInfo::isSelect)
+            .map(i -> i.getSqlSelect(dbType)).collect(joining(","));
+        if (StringUtils.isNotEmpty(sqlSelect)) {
+            sqlSelect += StringPool.COMMA;
+        }
+        if (StringUtils.isNotEmpty(fieldsSqlSelect)) {
+            allSqlSelect = sqlSelect + fieldsSqlSelect;
+        } else {
+            allSqlSelect = sqlSelect;
+        }
+        return allSqlSelect;
+    }
 }

+ 14 - 17
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/LambdaUtils.java

@@ -16,16 +16,16 @@
  */
 package com.baomidou.mybatisplus.core.toolkit;
 
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import com.baomidou.mybatisplus.core.toolkit.support.Property;
+import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda;
+
 import java.lang.ref.WeakReference;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 
-import com.baomidou.mybatisplus.core.metadata.TableInfo;
-import com.baomidou.mybatisplus.core.toolkit.support.Property;
-import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda;
-
 /**
  * <p>
  * Lambda 工具类
@@ -78,14 +78,11 @@ public final class LambdaUtils {
      *
      * @param className 类名
      * @param property  属性
-     * @param column    字段
+     * @param sqlSelect 字段搜索
      */
-    private static void saveCache(String className, String property, String column) {
-        Map<String, String> cacheMap = LAMBDA_CACHE.get(className);
-        if (cacheMap == null) {
-            cacheMap = new HashMap<>();
-        }
-        cacheMap.put(property, column);
+    private static void saveCache(String className, String property, String sqlSelect) {
+        Map<String, String> cacheMap = LAMBDA_CACHE.getOrDefault(className, new HashMap<>());
+        cacheMap.put(property, sqlSelect);
         LAMBDA_CACHE.put(className, cacheMap);
     }
 
@@ -95,21 +92,21 @@ public final class LambdaUtils {
      * </p>
      *
      * @param tableInfo 表信息
-     * @return
+     * @return 缓存 map
      */
     private static Map<String, String> createLambdaMap(TableInfo tableInfo, Class clazz) {
-        Map<String, String> map = new HashMap<>(16);
+        Map<String, String> map = new HashMap<>();
         if (StringUtils.isNotEmpty(tableInfo.getKeyProperty())) {
             if (tableInfo.getClazz() != clazz) {
                 saveCache(tableInfo.getClazz().getName(), tableInfo.getKeyProperty(), tableInfo.getKeyColumn());
             }
-            map.put(tableInfo.getKeyProperty(), tableInfo.getKeyColumn());
+            map.put(tableInfo.getKeyProperty(), tableInfo.getSqlSelect());
         }
         tableInfo.getFieldList().forEach(i -> {
             if (i.getClazz() != clazz) {
-                saveCache(i.getClazz().getName(), i.getProperty(), i.getColumn());
+                saveCache(i.getClazz().getName(), i.getProperty(), i.getSqlSelect(tableInfo.getDbType()));
             }
-            map.put(i.getProperty(), i.getColumn());
+            map.put(i.getProperty(), i.getSqlSelect(tableInfo.getDbType()));
         });
         return map;
     }
@@ -120,7 +117,7 @@ public final class LambdaUtils {
      * </p>
      *
      * @param entityClassName 实体类名
-     * @return
+     * @return 缓存 map
      */
     public static Map<String, String> getColumnMap(String entityClassName) {
         return LAMBDA_CACHE.get(entityClassName);