|
@@ -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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|