Browse Source

支持 lambda update set 自增自减

hubin 1 năm trước cách đây
mục cha
commit
8f5ded4b71

+ 28 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/LambdaUpdateWrapper.java

@@ -90,6 +90,34 @@ public class LambdaUpdateWrapper<T> extends AbstractLambdaWrapper<T, LambdaUpdat
         return typedThis;
     }
 
+    /**
+     * 字段自增变量 val 值
+     *
+     * @param condition 是否加入 set
+     * @param column    字段
+     * @param val       变量值 1 字段自增 + 1
+     */
+    public LambdaUpdateWrapper<T> setSelfIncr(boolean condition, SFunction<T, ?> column, Object val) {
+        return maybeDo(condition, () -> {
+            String realColumn = columnToString(column);
+            sqlSet.add(realColumn + Constants.EQUALS + realColumn + Constants.PLUS + val);
+        });
+    }
+
+    /**
+     * 字段自减变量 val 值
+     *
+     * @param condition 是否加入 set
+     * @param column    字段
+     * @param val       变量值 1 字段自减 - 1
+     */
+    public LambdaUpdateWrapper<T> setSelfDecr(boolean condition, SFunction<T, ?> column, Object val) {
+        return maybeDo(condition, () -> {
+            String realColumn = columnToString(column);
+            sqlSet.add(realColumn + Constants.EQUALS + realColumn + Constants.DASH + val);
+        });
+    }
+
     @Override
     public String getSqlSet() {
         if (CollectionUtils.isEmpty(sqlSet)) {

+ 31 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/conditions/LambdaUpdateWrapperTest.java

@@ -0,0 +1,31 @@
+package com.baomidou.mybatisplus.core.conditions;
+
+import com.baomidou.mybatisplus.core.MybatisConfiguration;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
+import com.baomidou.mybatisplus.test.User;
+import org.apache.ibatis.builder.MapperBuilderAssistant;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author miemie
+ * @since 2021-01-27
+ */
+class LambdaUpdateWrapperTest extends BaseWrapperTest {
+
+    @BeforeAll
+    static void initUser() {
+        TableInfo tableInfo = TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""), User.class);
+        Assertions.assertEquals("sys_user", tableInfo.getTableName());
+    }
+
+    @Test
+    void test() {
+        LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.setSelfIncr(true, User::getRoleId, 1).setSelfDecr(true, User::getName, 1).eq(User::getId, 1);
+        Assertions.assertEquals("role_id=role_id+1,username=username-1", wrapper.getSqlSet());
+    }
+}

+ 8 - 5
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/conditions/update/LambdaUpdateChainWrapper.java

@@ -18,7 +18,6 @@ package com.baomidou.mybatisplus.extension.conditions.update;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.Update;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import com.baomidou.mybatisplus.extension.conditions.AbstractChainWrapper;
 
@@ -28,7 +27,6 @@ import com.baomidou.mybatisplus.extension.conditions.AbstractChainWrapper;
  * @author miemie
  * @since 2018-12-19
  */
-@SuppressWarnings({"serial"})
 public class LambdaUpdateChainWrapper<T> extends AbstractChainWrapper<T, SFunction<T, ?>, LambdaUpdateChainWrapper<T>, LambdaUpdateWrapper<T>>
     implements ChainUpdate<T>, Update<LambdaUpdateChainWrapper<T>, SFunction<T, ?>> {
 
@@ -58,9 +56,14 @@ public class LambdaUpdateChainWrapper<T> extends AbstractChainWrapper<T, SFuncti
         return typedThis;
     }
 
-    @Override
-    public String getSqlSet() {
-        throw ExceptionUtils.mpe("can not use this method for \"%s\"", "getSqlSet");
+    public LambdaUpdateChainWrapper<T> setSelfIncr(boolean condition, SFunction<T, ?> column, Object val) {
+        wrapperChildren.setSelfIncr(condition, column, val);
+        return typedThis;
+    }
+
+    public LambdaUpdateChainWrapper<T> setSelfDecr(boolean condition, SFunction<T, ?> column, Object val) {
+        wrapperChildren.setSelfDecr(condition, column, val);
+        return typedThis;
     }
 
     @Override