Browse Source

优化MySQL增强操作逻辑

woody 1 năm trước cách đây
mục cha
commit
13cab3e7d6

+ 36 - 5
framework-database/src/main/java/com/chelvc/framework/database/context/DatabaseContextHolder.java

@@ -41,6 +41,8 @@ import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
 import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
 import com.baomidou.mybatisplus.core.toolkit.support.ColumnCache;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.chelvc.framework.base.context.ApplicationContextHolder;
@@ -66,6 +68,7 @@ import com.chelvc.framework.database.support.EventService;
 import com.google.common.collect.Maps;
 import lombok.NonNull;
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.ibatis.reflection.property.PropertyNamer;
 import org.apache.ibatis.type.TypeHandler;
 import org.mybatis.spring.SqlSessionTemplate;
 import org.springframework.context.ApplicationContext;
@@ -334,17 +337,45 @@ public final class DatabaseContextHolder {
     }
 
     /**
-     * 将属性Getter方法引用转换成数据列信息
+     * 将属性Getter方法转换成列名称
+     *
+     * @param getter 属性Getter方法
+     * @return 列名称
+     */
+    public static String getter2column(@NonNull SFunction<?, ?> getter) {
+        SerializedLambda lambda = LambdaUtils.resolve(getter);
+        Class<?> clazz = lambda.getInstantiatedType();
+        String property = PropertyNamer.methodToProperty(lambda.getImplMethodName());
+        Map<String, ColumnCache> columns = LambdaUtils.getColumnMap(clazz);
+        ColumnCache column = ObjectUtils.ifNull(columns, cs -> cs.get(LambdaUtils.formatKey(property)));
+        AssertUtils.nonnull(column, () -> "Column not found for property: " + clazz.getName() + "." + property);
+        return column.getColumn();
+    }
+
+    /**
+     * 将属性Getter方法引用转换成列名称
      *
      * @param getter 属性Getter方法引用
-     * @return 数据列信息
+     * @return 列名称
      */
-    public static ColumnCache getter2column(@NonNull GetterContext<?, ?> getter) {
+    public static String getter2column(@NonNull GetterContext<?, ?> getter) {
         Class<?> clazz = getter.getReference();
         String property = getter.getProperty();
         Map<String, ColumnCache> columns = LambdaUtils.getColumnMap(clazz);
-        ColumnCache column = columns == null ? null : columns.get(LambdaUtils.formatKey(property));
-        return AssertUtils.nonnull(column, () -> "Column not found for property: " + clazz.getName() + "." + property);
+        ColumnCache column = ObjectUtils.ifNull(columns, cs -> cs.get(LambdaUtils.formatKey(property)));
+        AssertUtils.nonnull(column, () -> "Column not found for property: " + clazz.getName() + "." + property);
+        return column.getColumn();
+    }
+
+    /**
+     * 将属性Getter方法转换成属性名称
+     *
+     * @param getter 属性Getter方法
+     * @return 属性名称
+     */
+    public static String getter2property(@NonNull SFunction<?, ?> getter) {
+        SerializedLambda lambda = LambdaUtils.resolve(getter);
+        return PropertyNamer.methodToProperty(lambda.getImplMethodName());
     }
 
     /**

+ 1 - 3
framework-database/src/main/java/com/chelvc/framework/database/context/GetterContext.java

@@ -6,7 +6,6 @@ import java.lang.reflect.Method;
 
 import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.support.ColumnCache;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import com.chelvc.framework.common.util.AssertUtils;
 import com.chelvc.framework.common.util.ObjectUtils;
@@ -83,8 +82,7 @@ public class GetterContext<T, R> implements SFunction<T, R> {
         @Override
         @SuppressWarnings("unchecked")
         protected String columnToString(SFunction<T, ?> getter, boolean onlyColumn) {
-            ColumnCache column = DatabaseContextHolder.getter2column((GetterContext<T, ?>) getter);
-            return onlyColumn ? column.getColumn() : column.getColumnSelect();
+            return DatabaseContextHolder.getter2column((GetterContext<T, ?>) getter);
         }
     }
 }

+ 14 - 40
framework-database/src/main/java/com/chelvc/framework/database/support/Updates.java

@@ -10,16 +10,14 @@ import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
 import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
 import com.baomidou.mybatisplus.core.toolkit.support.ColumnCache;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
-import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda;
-import com.chelvc.framework.common.util.AssertUtils;
 import com.chelvc.framework.common.util.ObjectUtils;
 import com.chelvc.framework.common.util.StringUtils;
+import com.chelvc.framework.database.context.DatabaseContextHolder;
 import com.chelvc.framework.database.entity.Creatable;
 import com.chelvc.framework.database.entity.Deletable;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import lombok.NonNull;
-import org.apache.ibatis.reflection.property.PropertyNamer;
 
 /**
  * 数据修改处理工具类
@@ -242,35 +240,8 @@ public final class Updates {
      * @param <T> 数据类型
      */
     public static class Update<T> {
-        private Map<String, ColumnCache> columns;
         private final Map<String, String> expressions = Maps.newHashMapWithExpectedSize(3);
 
-        /**
-         * 初始化列缓存
-         *
-         * @param clazz 对象类型
-         */
-        private void initializeColumnCache(Class<?> clazz) {
-            if (this.columns == null) {
-                this.columns = LambdaUtils.getColumnMap(clazz);
-            }
-            AssertUtils.nonnull(this.columns, () -> "Column cache not found: " + clazz);
-        }
-
-        /**
-         * 将属性Getter方法转换成列名称
-         *
-         * @param getter 属性Getter方法
-         * @return 列名称
-         */
-        private String getter2column(SFunction<T, ?> getter) {
-            SerializedLambda lambda = LambdaUtils.resolve(getter);
-            this.initializeColumnCache(lambda.getInstantiatedType());
-            String property = PropertyNamer.methodToProperty(lambda.getImplMethodName());
-            ColumnCache column = this.columns.get(LambdaUtils.formatKey(property));
-            return column.getColumn();
-        }
-
         /**
          * 更新所有字段
          *
@@ -289,13 +260,16 @@ public final class Updates {
          * @return 更新对象实例
          */
         public Update<T> not(@NonNull Class<T> clazz, @NonNull String... columns) {
-            this.initializeColumnCache(clazz);
+            Map<String, ColumnCache> properties = LambdaUtils.getColumnMap(clazz);
+            if (ObjectUtils.isEmpty(properties)) {
+                return this;
+            }
             TableInfo table = TableInfoHelper.getTableInfo(clazz);
             boolean creatable = Creatable.class.isAssignableFrom(clazz);
             boolean deletable = Deletable.class.isAssignableFrom(clazz);
             String key = StringUtils.ifEmpty(table.getKeyProperty(), LambdaUtils::formatKey);
             Set<String> excludes = ObjectUtils.isEmpty(columns) ? Collections.emptySet() : Sets.newHashSet(columns);
-            this.columns.forEach((property, column) -> {
+            properties.forEach((property, column) -> {
                 if (!Objects.equals(property, key)
                         && !(creatable && ("CREATOR".equals(property) || "CREATETIME".equals(property)))
                         && !(deletable && "DELETED".equals(property)) && !excludes.contains(column.getColumn())) {
@@ -313,7 +287,7 @@ public final class Updates {
          * @return 更新对象实例
          */
         public Update<T> not(@NonNull Class<T> clazz, @NonNull SFunction<T, ?> getter) {
-            return this.not(clazz, this.getter2column(getter));
+            return this.not(clazz, DatabaseContextHolder.getter2column(getter));
         }
 
         /**
@@ -336,7 +310,7 @@ public final class Updates {
          * @return 更新对象实例
          */
         public Update<T> eq(@NonNull SFunction<T, ?> getter) {
-            return this.eq(this.getter2column(getter));
+            return this.eq(DatabaseContextHolder.getter2column(getter));
         }
 
         /**
@@ -359,7 +333,7 @@ public final class Updates {
          * @return 更新对象实例
          */
         public Update<T> add(@NonNull SFunction<T, ?> getter) {
-            return this.add(this.getter2column(getter));
+            return this.add(DatabaseContextHolder.getter2column(getter));
         }
 
         /**
@@ -382,7 +356,7 @@ public final class Updates {
          * @return 更新对象实例
          */
         public Update<T> clear(@NonNull SFunction<T, ?> getter) {
-            return this.clear(this.getter2column(getter));
+            return this.clear(DatabaseContextHolder.getter2column(getter));
         }
 
         /**
@@ -405,7 +379,7 @@ public final class Updates {
          * @return 更新对象实例
          */
         public Update<T> subtract(@NonNull SFunction<T, ?> getter) {
-            return this.subtract(this.getter2column(getter));
+            return this.subtract(DatabaseContextHolder.getter2column(getter));
         }
 
         /**
@@ -428,7 +402,7 @@ public final class Updates {
          * @return 更新对象实例
          */
         public Update<T> multiply(@NonNull SFunction<T, ?> getter) {
-            return this.multiply(this.getter2column(getter));
+            return this.multiply(DatabaseContextHolder.getter2column(getter));
         }
 
         /**
@@ -451,7 +425,7 @@ public final class Updates {
          * @return 更新对象实例
          */
         public Update<T> divide(@NonNull SFunction<T, ?> getter) {
-            return this.divide(this.getter2column(getter));
+            return this.divide(DatabaseContextHolder.getter2column(getter));
         }
 
         /**
@@ -486,7 +460,7 @@ public final class Updates {
          * @return 更新对象实例
          */
         public Update<T> exclude(@NonNull SFunction<T, ?> getter) {
-            return this.exclude(this.getter2column(getter));
+            return this.exclude(DatabaseContextHolder.getter2column(getter));
         }
 
         /**