Bladeren bron

优化数据库增强业务操作逻辑

woody 1 jaar geleden
bovenliggende
commit
5e6343b0b8
14 gewijzigde bestanden met toevoegingen van 484 en 209 verwijderingen
  1. 0 64
      framework-database/src/main/java/com/chelvc/framework/database/annotation/CreateUpdate.java
  2. 0 3
      framework-database/src/main/java/com/chelvc/framework/database/entity/CreateEntity.java
  3. 0 3
      framework-database/src/main/java/com/chelvc/framework/database/entity/ModifyEntity.java
  4. 3 3
      framework-database/src/main/java/com/chelvc/framework/database/support/AbstractCreateMethod.java
  5. 6 6
      framework-database/src/main/java/com/chelvc/framework/database/support/BatchCreateIgnoreMethod.java
  6. 34 0
      framework-database/src/main/java/com/chelvc/framework/database/support/BatchCreateUpdateMethod.java
  7. 0 56
      framework-database/src/main/java/com/chelvc/framework/database/support/BatchInsertUpdateMethod.java
  8. 4 4
      framework-database/src/main/java/com/chelvc/framework/database/support/CreateIgnoreMethod.java
  9. 32 0
      framework-database/src/main/java/com/chelvc/framework/database/support/CreateUpdateMethod.java
  10. 11 8
      framework-database/src/main/java/com/chelvc/framework/database/support/EnhanceMapper.java
  11. 26 4
      framework-database/src/main/java/com/chelvc/framework/database/support/EnhanceService.java
  12. 4 4
      framework-database/src/main/java/com/chelvc/framework/database/support/EnhanceSqlInjector.java
  13. 0 54
      framework-database/src/main/java/com/chelvc/framework/database/support/InsertUpdateMethod.java
  14. 364 0
      framework-database/src/main/java/com/chelvc/framework/database/support/Updates.java

+ 0 - 64
framework-database/src/main/java/com/chelvc/framework/database/annotation/CreateUpdate.java

@@ -1,64 +0,0 @@
-package com.chelvc.framework.database.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 创建或者更新注解
- *
- * @author Woody
- * @date 2024/3/5
- */
-@Inherited
-@Documented
-@Target(ElementType.FIELD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface CreateUpdate {
-    /**
-     * 判断字段是否启用更新
-     *
-     * @return true/false
-     */
-    boolean enabled() default true;
-
-    /**
-     * 获取字段更新方式
-     *
-     * @return 更新方式
-     */
-    Mode mode() default Mode.DEFAULT;
-
-    /**
-     * 更新方式枚举
-     */
-    enum Mode {
-        /**
-         * 原值 + 新值
-         */
-        ADD,
-
-        /**
-         * 原值 - 新值
-         */
-        SUBTRACT,
-
-        /**
-         * 原值 * 新值
-         */
-        MULTIPLY,
-
-        /**
-         * 原值 / 新值
-         */
-        DIVIDE,
-
-        /**
-         * 默认等于新值
-         */
-        DEFAULT;
-    }
-}

+ 0 - 3
framework-database/src/main/java/com/chelvc/framework/database/entity/CreateEntity.java

@@ -3,7 +3,6 @@ package com.chelvc.framework.database.entity;
 import java.io.Serializable;
 import java.util.Date;
 
-import com.chelvc.framework.database.annotation.CreateUpdate;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -23,12 +22,10 @@ public abstract class CreateEntity<ID extends Serializable> implements Creatable
     /**
      * 创建用户
      */
-    @CreateUpdate(enabled = false)
     private Long creator;
 
     /**
      * 创建时间
      */
-    @CreateUpdate(enabled = false)
     private Date createTime;
 }

+ 0 - 3
framework-database/src/main/java/com/chelvc/framework/database/entity/ModifyEntity.java

@@ -3,7 +3,6 @@ package com.chelvc.framework.database.entity;
 import java.io.Serializable;
 import java.util.Date;
 
-import com.chelvc.framework.database.annotation.CreateUpdate;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -23,13 +22,11 @@ public abstract class ModifyEntity<ID extends Serializable> implements Creatable
     /**
      * 创建用户
      */
-    @CreateUpdate(enabled = false)
     private Long creator;
 
     /**
      * 创建时间
      */
-    @CreateUpdate(enabled = false)
     private Date createTime;
 
     /**

+ 3 - 3
framework-database/src/main/java/com/chelvc/framework/database/support/AbstractInsertMethod.java → framework-database/src/main/java/com/chelvc/framework/database/support/AbstractCreateMethod.java

@@ -17,18 +17,18 @@ import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.mapping.SqlSource;
 
 /**
- * 数据插入方法抽象实现
+ * 数据创建方法抽象实现
  *
  * @author Woody
  * @date 2024/3/5
  */
-public abstract class AbstractInsertMethod extends AbstractMethod {
+public abstract class AbstractCreateMethod extends AbstractMethod {
     /**
      * 方法标识
      */
     protected final String id;
 
-    public AbstractInsertMethod(@NonNull String id) {
+    public AbstractCreateMethod(@NonNull String id) {
         this.id = id;
     }
 

+ 6 - 6
framework-database/src/main/java/com/chelvc/framework/database/support/BatchInsertIgnoreMethod.java → framework-database/src/main/java/com/chelvc/framework/database/support/BatchCreateIgnoreMethod.java

@@ -7,24 +7,24 @@ import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import lombok.NonNull;
 
 /**
- * 批量插入或忽略方法实现
+ * 批量创建或忽略方法实现
  *
  * @author Woody
  * @date 2024/2/27
  */
-public class BatchInsertIgnoreMethod extends AbstractInsertMethod {
-    public BatchInsertIgnoreMethod() {
-        super("batchInsertIgnore");
+public class BatchCreateIgnoreMethod extends AbstractCreateMethod {
+    public BatchCreateIgnoreMethod() {
+        super("batchCreateIgnore");
     }
 
     @Override
     protected String initializeMethodScript(@NonNull TableInfo table) {
         List<TableFieldInfo> fields = table.getFieldList();
         String columns = this.field2column(table, fields);
-        String properties = this.field2property(table, "et.", fields);
+        String properties = this.field2property(table, "entity.", fields);
         return String.format(
                 "<script>\nINSERT IGNORE INTO %s (%s) VALUES\n" +
-                        "<foreach collection=\"collection\" item=\"et\" separator=\",\">(%s)</foreach>\n</script>",
+                        "<foreach collection=\"collection\" item=\"entity\" separator=\",\">(%s)</foreach>\n</script>",
                 table.getTableName(), columns, properties
         );
     }

+ 34 - 0
framework-database/src/main/java/com/chelvc/framework/database/support/BatchCreateUpdateMethod.java

@@ -0,0 +1,34 @@
+package com.chelvc.framework.database.support;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import lombok.NonNull;
+
+/**
+ * 批量创建或修改方法实现
+ *
+ * @author Woody
+ * @date 2024/2/27
+ */
+public class BatchCreateUpdateMethod extends AbstractCreateMethod {
+    public BatchCreateUpdateMethod() {
+        super("batchCreateUpdate");
+    }
+
+    @Override
+    protected String initializeMethodScript(@NonNull TableInfo table) {
+        List<TableFieldInfo> fields = table.getFieldList();
+        String columns = this.field2column(table, fields);
+        String properties = this.field2property(table, "entity.", fields);
+        String updates = "<foreach collection=\"update.expressions.entrySet()\" " +
+                "index=\"column\" item=\"value\" separator=\",\">${column}${value}</foreach>";
+        return String.format(
+                "<script>\nINSERT INTO %s (%s) VALUES\n" +
+                        "<foreach collection=\"entities\" item=\"entity\" separator=\",\">(%s)</foreach>\n" +
+                        "ON DUPLICATE KEY UPDATE %s\n</script>",
+                table.getTableName(), columns, properties, updates
+        );
+    }
+}

+ 0 - 56
framework-database/src/main/java/com/chelvc/framework/database/support/BatchInsertUpdateMethod.java

@@ -1,56 +0,0 @@
-package com.chelvc.framework.database.support;
-
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
-import com.baomidou.mybatisplus.core.metadata.TableInfo;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import com.chelvc.framework.common.util.ObjectUtils;
-import com.chelvc.framework.database.annotation.CreateUpdate;
-import lombok.NonNull;
-
-/**
- * 批量插入或修改方法实现
- *
- * @author Woody
- * @date 2024/2/27
- */
-public class BatchInsertUpdateMethod extends AbstractInsertMethod {
-    public BatchInsertUpdateMethod() {
-        super("batchInsertUpdate");
-    }
-
-    @Override
-    protected String initializeMethodScript(@NonNull TableInfo table) {
-        List<TableFieldInfo> fields = table.getFieldList();
-        String columns = this.field2column(table, fields);
-        String properties = this.field2property(table, "et.", fields);
-        String updates = fields.stream().map(field -> {
-            CreateUpdate annotation = field.getField().getAnnotation(CreateUpdate.class);
-            if (annotation != null && !annotation.enabled()) {
-                return null;
-            }
-            String column = field.getColumn();
-            StringBuilder buffer = new StringBuilder().append(column).append(" = ");
-            CreateUpdate.Mode mode = ObjectUtils.ifNull(annotation, CreateUpdate::mode);
-            if (mode == CreateUpdate.Mode.ADD) {
-                buffer.append(column).append(" + ");
-            } else if (mode == CreateUpdate.Mode.SUBTRACT) {
-                buffer.append(column).append(" - ");
-            } else if (mode == CreateUpdate.Mode.MULTIPLY) {
-                buffer.append(column).append(" * ");
-            } else if (mode == CreateUpdate.Mode.DIVIDE) {
-                buffer.append(column).append(" / ");
-            }
-            return buffer.append("VALUES(").append(column).append(")");
-        }).filter(Objects::nonNull).collect(Collectors.joining(StringPool.COMMA));
-        return String.format(
-                "<script>\nINSERT IGNORE INTO %s (%s) VALUES\n" +
-                        "<foreach collection=\"collection\" item=\"et\" separator=\",\">(%s)</foreach>\n" +
-                        "ON DUPLICATE KEY UPDATE %s\n</script>",
-                table.getTableName(), columns, properties, updates
-        );
-    }
-}

+ 4 - 4
framework-database/src/main/java/com/chelvc/framework/database/support/InsertIgnoreMethod.java → framework-database/src/main/java/com/chelvc/framework/database/support/CreateIgnoreMethod.java

@@ -7,14 +7,14 @@ import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import lombok.NonNull;
 
 /**
- * 插入或忽略方法实现
+ * 创建或忽略方法实现
  *
  * @author Woody
  * @date 2024/2/27
  */
-public class InsertIgnoreMethod extends AbstractInsertMethod {
-    public InsertIgnoreMethod() {
-        super("insertIgnore");
+public class CreateIgnoreMethod extends AbstractCreateMethod {
+    public CreateIgnoreMethod() {
+        super("createIgnore");
     }
 
     @Override

+ 32 - 0
framework-database/src/main/java/com/chelvc/framework/database/support/CreateUpdateMethod.java

@@ -0,0 +1,32 @@
+package com.chelvc.framework.database.support;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import lombok.NonNull;
+
+/**
+ * 创建或修改方法实现
+ *
+ * @author Woody
+ * @date 2024/2/27
+ */
+public class CreateUpdateMethod extends AbstractCreateMethod {
+    public CreateUpdateMethod() {
+        super("createUpdate");
+    }
+
+    @Override
+    protected String initializeMethodScript(@NonNull TableInfo table) {
+        List<TableFieldInfo> fields = table.getFieldList();
+        String columns = this.field2column(table, fields);
+        String properties = this.field2property(table, "entity.", fields);
+        String updates = "<foreach collection=\"update.expressions.entrySet()\" " +
+                "index=\"column\" item=\"value\" separator=\",\">${column}${value}</foreach>";
+        return String.format(
+                "<script>\nINSERT INTO %s (%s) VALUES (%s)\n ON DUPLICATE KEY UPDATE %s\n</script>",
+                table.getTableName(), columns, properties, updates
+        );
+    }
+}

+ 11 - 8
framework-database/src/main/java/com/chelvc/framework/database/support/EnhanceMapper.java

@@ -3,6 +3,7 @@ package com.chelvc.framework.database.support;
 import java.util.Collection;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 数据模型增强操作接口
@@ -15,31 +16,33 @@ public interface EnhanceMapper<T> extends BaseMapper<T> {
      * 创建或忽略实体
      *
      * @param entity 实体对象实例
-     * @return 新增行数
+     * @return 影响行数
      */
-    int insertIgnore(T entity);
+    int createIgnore(T entity);
 
     /**
      * 创建或修改实体
      *
      * @param entity 实体对象实例
-     * @return 更新行数
+     * @param update 数据更新对象实例
+     * @return 影响行数
      */
-    int insertUpdate(T entity);
+    int createUpdate(@Param("entity") T entity, @Param("update") Updates.Update<T> update);
 
     /**
      * 批量创建或忽略实体
      *
      * @param entities 实体对象实例集合
-     * @return 新增行数
+     * @return 影响行数
      */
-    int batchInsertIgnore(Collection<T> entities);
+    int batchCreateIgnore(Collection<T> entities);
 
     /**
      * 批量创建或修改实体
      *
      * @param entities 实体对象实例集合
-     * @return 更新行数
+     * @param update   数据更新对象实例
+     * @return 影响行数
      */
-    int batchInsertUpdate(Collection<T> entities);
+    int batchCreateUpdate(@Param("entities") Collection<T> entities, @Param("update") Updates.Update<T> update);
 }

+ 26 - 4
framework-database/src/main/java/com/chelvc/framework/database/support/EnhanceService.java

@@ -26,7 +26,7 @@ public interface EnhanceService<T> extends IService<T>, EventService<T> {
      * @return true/false
      */
     default boolean createIgnore(@NonNull T entity) {
-        return ((EnhanceMapper<T>) this.getBaseMapper()).insertIgnore(entity) > 0;
+        return ((EnhanceMapper<T>) this.getBaseMapper()).createIgnore(entity) > 0;
     }
 
     /**
@@ -36,7 +36,18 @@ public interface EnhanceService<T> extends IService<T>, EventService<T> {
      * @return true/false
      */
     default boolean createUpdate(@NonNull T entity) {
-        return ((EnhanceMapper<T>) this.getBaseMapper()).insertUpdate(entity) > 0;
+        return this.createUpdate(entity, Updates.all(this.getEntityClass()));
+    }
+
+    /**
+     * 创建或修改实体
+     *
+     * @param entity 实体对象实例
+     * @param update 数据更新对象实例
+     * @return true/false
+     */
+    default boolean createUpdate(@NonNull T entity, @NonNull Updates.Update<T> update) {
+        return ((EnhanceMapper<T>) this.getBaseMapper()).createUpdate(entity, update) > 0;
     }
 
     /**
@@ -46,7 +57,7 @@ public interface EnhanceService<T> extends IService<T>, EventService<T> {
      * @return true/false
      */
     default boolean batchCreateIgnore(@NonNull Collection<T> entities) {
-        return !entities.isEmpty() && ((EnhanceMapper<T>) this.getBaseMapper()).batchInsertIgnore(entities) > 0;
+        return !entities.isEmpty() && ((EnhanceMapper<T>) this.getBaseMapper()).batchCreateIgnore(entities) > 0;
     }
 
     /**
@@ -56,7 +67,18 @@ public interface EnhanceService<T> extends IService<T>, EventService<T> {
      * @return true/false
      */
     default boolean batchCreateUpdate(@NonNull Collection<T> entities) {
-        return !entities.isEmpty() && ((EnhanceMapper<T>) this.getBaseMapper()).batchInsertUpdate(entities) > 0;
+        return this.batchCreateUpdate(entities, Updates.all(this.getEntityClass()));
+    }
+
+    /**
+     * 批量创建或修改实体
+     *
+     * @param entities 实体对象实例集合
+     * @param update   数据更新对象实例
+     * @return true/false
+     */
+    default boolean batchCreateUpdate(@NonNull Collection<T> entities, @NonNull Updates.Update<T> update) {
+        return !entities.isEmpty() && ((EnhanceMapper<T>) this.getBaseMapper()).batchCreateUpdate(entities, update) > 0;
     }
 
     /**

+ 4 - 4
framework-database/src/main/java/com/chelvc/framework/database/support/EnhanceSqlInjector.java

@@ -15,10 +15,10 @@ public class EnhanceSqlInjector extends DefaultSqlInjector {
     @Override
     public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
         List<AbstractMethod> methods = super.getMethodList(mapperClass);
-        methods.add(new InsertIgnoreMethod());
-        methods.add(new InsertUpdateMethod());
-        methods.add(new BatchInsertIgnoreMethod());
-        methods.add(new BatchInsertUpdateMethod());
+        methods.add(new CreateIgnoreMethod());
+        methods.add(new CreateUpdateMethod());
+        methods.add(new BatchCreateIgnoreMethod());
+        methods.add(new BatchCreateUpdateMethod());
         return methods;
     }
 }

+ 0 - 54
framework-database/src/main/java/com/chelvc/framework/database/support/InsertUpdateMethod.java

@@ -1,54 +0,0 @@
-package com.chelvc.framework.database.support;
-
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
-import com.baomidou.mybatisplus.core.metadata.TableInfo;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import com.chelvc.framework.common.util.ObjectUtils;
-import com.chelvc.framework.database.annotation.CreateUpdate;
-import lombok.NonNull;
-
-/**
- * 插入或修改方法实现
- *
- * @author Woody
- * @date 2024/2/27
- */
-public class InsertUpdateMethod extends AbstractInsertMethod {
-    public InsertUpdateMethod() {
-        super("insertUpdate");
-    }
-
-    @Override
-    protected String initializeMethodScript(@NonNull TableInfo table) {
-        List<TableFieldInfo> fields = table.getFieldList();
-        String columns = this.field2column(table, fields);
-        String properties = this.field2property(table, fields);
-        String updates = fields.stream().map(field -> {
-            CreateUpdate annotation = field.getField().getAnnotation(CreateUpdate.class);
-            if (annotation != null && !annotation.enabled()) {
-                return null;
-            }
-            String column = field.getColumn();
-            StringBuilder buffer = new StringBuilder().append(column).append(" = ");
-            CreateUpdate.Mode mode = ObjectUtils.ifNull(annotation, CreateUpdate::mode);
-            if (mode == CreateUpdate.Mode.ADD) {
-                buffer.append(column).append(" + ");
-            } else if (mode == CreateUpdate.Mode.SUBTRACT) {
-                buffer.append(column).append(" - ");
-            } else if (mode == CreateUpdate.Mode.MULTIPLY) {
-                buffer.append(column).append(" * ");
-            } else if (mode == CreateUpdate.Mode.DIVIDE) {
-                buffer.append(column).append(" / ");
-            }
-            return buffer.append("VALUES(").append(column).append(")");
-        }).filter(Objects::nonNull).collect(Collectors.joining(StringPool.COMMA));
-        return String.format(
-                "<script>\nINSERT IGNORE INTO %s (%s) VALUES (%s)\n ON DUPLICATE KEY UPDATE %s\n</script>",
-                table.getTableName(), columns, properties, updates
-        );
-    }
-}

+ 364 - 0
framework-database/src/main/java/com/chelvc/framework/database/support/Updates.java

@@ -0,0 +1,364 @@
+package com.chelvc.framework.database.support;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.Objects;
+
+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.chelvc.framework.common.util.AssertUtils;
+import com.chelvc.framework.common.util.StringUtils;
+import com.chelvc.framework.database.entity.Creatable;
+import com.chelvc.framework.database.entity.Deletable;
+import com.google.common.collect.Maps;
+import lombok.NonNull;
+import org.apache.ibatis.reflection.property.PropertyNamer;
+
+/**
+ * 数据修改处理工具类
+ *
+ * @author Woody
+ * @date 2024/5/18
+ */
+public final class Updates {
+    private Updates() {
+    }
+
+    /**
+     * 获取数据更新对象
+     *
+     * @param <T> 数据类型
+     * @return 更新对象实例
+     */
+    public static <T> Update<T> update() {
+        return new Update<>();
+    }
+
+    /**
+     * 更新所有字段
+     *
+     * @param clazz 对象类型
+     * @param <T>   数据类型
+     * @return 更新对象实例
+     */
+    public static <T> Update<T> all(@NonNull Class<T> clazz) {
+        Update<T> update = update();
+        return update.all(clazz);
+    }
+
+    /**
+     * 相等
+     *
+     * @param column 列名
+     * @param <T>    数据类型
+     * @return 更新对象实例
+     */
+    public static <T> Update<T> eq(@NonNull String column) {
+        Update<T> update = update();
+        return update.eq(column);
+    }
+
+    /**
+     * 相等
+     *
+     * @param getter 属性Getter方法
+     * @param <T>    数据类型
+     * @return 更新对象实例
+     */
+    public static <T> Update<T> eq(@NonNull SFunction<T, ?> getter) {
+        Update<T> update = update();
+        return update.eq(getter);
+    }
+
+    /**
+     * 相加
+     *
+     * @param column 列名
+     * @param <T>    数据类型
+     * @return 更新对象实例
+     */
+    public static <T> Update<T> add(@NonNull String column) {
+        Update<T> update = update();
+        return update.add(column);
+    }
+
+    /**
+     * 相加
+     *
+     * @param getter 属性Getter方法
+     * @param <T>    数据类型
+     * @return 更新对象实例
+     */
+    public static <T> Update<T> add(@NonNull SFunction<T, ?> getter) {
+        Update<T> update = update();
+        return update.add(getter);
+    }
+
+    /**
+     * 相减
+     *
+     * @param column 列名
+     * @param <T>    数据类型
+     * @return 更新对象实例
+     */
+    public static <T> Update<T> subtract(@NonNull String column) {
+        Update<T> update = update();
+        return update.subtract(column);
+    }
+
+    /**
+     * 相减
+     *
+     * @param getter 属性Getter方法
+     * @param <T>    数据类型
+     * @return 更新对象实例
+     */
+    public static <T> Update<T> subtract(@NonNull SFunction<T, ?> getter) {
+        Update<T> update = update();
+        return update.subtract(getter);
+    }
+
+    /**
+     * 相乘
+     *
+     * @param column 列名
+     * @param <T>    数据类型
+     * @return 更新对象实例
+     */
+    public static <T> Update<T> multiply(@NonNull String column) {
+        Update<T> update = update();
+        return update.multiply(column);
+    }
+
+    /**
+     * 相乘
+     *
+     * @param getter 属性Getter方法
+     * @param <T>    数据类型
+     * @return 更新对象实例
+     */
+    public static <T> Update<T> multiply(@NonNull SFunction<T, ?> getter) {
+        Update<T> update = update();
+        return update.multiply(getter);
+    }
+
+    /**
+     * 相除
+     *
+     * @param column 列名
+     * @param <T>    数据类型
+     * @return 更新对象实例
+     */
+    public static <T> Update<T> divide(@NonNull String column) {
+        Update<T> update = update();
+        return update.divide(column);
+    }
+
+    /**
+     * 相除
+     *
+     * @param getter 属性Getter方法
+     * @param <T>    数据类型
+     * @return 更新对象实例
+     */
+    public static <T> Update<T> divide(@NonNull SFunction<T, ?> getter) {
+        Update<T> update = update();
+        return update.divide(getter);
+    }
+
+    /**
+     * 添加更新表达式
+     *
+     * @param column 列名
+     * @param value  值
+     * @param <T>    数据类型
+     * @return 更新对象实例
+     */
+    public static <T> Update<T> expression(@NonNull String column, @NonNull String value) {
+        Update<T> update = update();
+        return update.expression(column, value);
+    }
+
+    /**
+     * 重复数据更新对象
+     *
+     * @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();
+        }
+
+        /**
+         * 更新所有字段
+         *
+         * @param clazz 对象类型
+         * @return 更新对象实例
+         */
+        public Update<T> all(@NonNull Class<T> clazz) {
+            this.initializeColumnCache(clazz);
+            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);
+            this.columns.forEach((property, column) -> {
+                if (!Objects.equals(property, key)
+                        && !(creatable && ("CREATOR".equals(property) || "CREATETIME".equals(property)))
+                        && !(deletable && "DELETED".equals(property))) {
+                    this.eq(column.getColumn());
+                }
+            });
+            return this;
+        }
+
+        /**
+         * 相等
+         *
+         * @param column 列名
+         * @return 更新对象实例
+         */
+        public Update<T> eq(@NonNull String column) {
+            return this.expression(column, " = VALUES(" + column + ")");
+        }
+
+        /**
+         * 相等
+         *
+         * @param getter 属性Getter方法
+         * @return 更新对象实例
+         */
+        public Update<T> eq(@NonNull SFunction<T, ?> getter) {
+            return this.eq(this.getter2column(getter));
+        }
+
+        /**
+         * 相加
+         *
+         * @param column 列名
+         * @return 更新对象实例
+         */
+        public Update<T> add(@NonNull String column) {
+            return this.expression(column, " = " + column + " + VALUES(" + column + ")");
+        }
+
+        /**
+         * 相加
+         *
+         * @param getter 属性Getter方法
+         * @return 更新对象实例
+         */
+        public Update<T> add(@NonNull SFunction<T, ?> getter) {
+            return this.add(this.getter2column(getter));
+        }
+
+        /**
+         * 相减
+         *
+         * @param column 列名
+         * @return 更新对象实例
+         */
+        public Update<T> subtract(@NonNull String column) {
+            return this.expression(column, " = " + column + " - VALUES(" + column + ")");
+        }
+
+        /**
+         * 相减
+         *
+         * @param getter 属性Getter方法
+         * @return 更新对象实例
+         */
+        public Update<T> subtract(@NonNull SFunction<T, ?> getter) {
+            return this.subtract(this.getter2column(getter));
+        }
+
+        /**
+         * 相乘
+         *
+         * @param column 列名
+         * @return 更新对象实例
+         */
+        public Update<T> multiply(@NonNull String column) {
+            return this.expression(column, " = " + column + " * VALUES(" + column + ")");
+        }
+
+        /**
+         * 相乘
+         *
+         * @param getter 属性Getter方法
+         * @return 更新对象实例
+         */
+        public Update<T> multiply(@NonNull SFunction<T, ?> getter) {
+            return this.multiply(this.getter2column(getter));
+        }
+
+        /**
+         * 相除
+         *
+         * @param column 列名
+         * @return 更新对象实例
+         */
+        public Update<T> divide(@NonNull String column) {
+            return this.expression(column, " = " + column + " / VALUES(" + column + ")");
+        }
+
+        /**
+         * 相除
+         *
+         * @param getter 属性Getter方法
+         * @return 更新对象实例
+         */
+        public Update<T> divide(@NonNull SFunction<T, ?> getter) {
+            return this.divide(this.getter2column(getter));
+        }
+
+        /**
+         * 添加更新表达式
+         *
+         * @param column 列名
+         * @param value  值
+         * @return 更新对象实例
+         */
+        public Update<T> expression(@NonNull String column, @NonNull String value) {
+            this.expressions.put(column, value);
+            return this;
+        }
+
+        /**
+         * 获取表达式字段/值映射表
+         *
+         * @return 表达式字段/值映射表
+         */
+        public Map<String, String> getExpressions() {
+            return Collections.unmodifiableMap(this.expressions);
+        }
+    }
+}