Browse Source

BaseMapper、ServiceImpl添加UpdateForSet
1.方法为自定义Set行为,支持type = type + 1操作;
2.添加该方法测试用例;
3.格式化代码

Caratacus 7 years ago
parent
commit
3eb3f44c53

+ 16 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/test/h2/H2MetaObjAndVersionAndOptLockTest.java

@@ -264,6 +264,22 @@ public class H2MetaObjAndVersionAndOptLockTest extends H2Test {
         Assert.assertEquals("自定义update需要自己控制version", 1, user.getVersion().intValue());
     }
 
+    @Test
+    public void testUpdateForSet() {
+        Long id = 100899L;
+        H2UserVersionAndLogicDeleteEntity user = new H2UserVersionAndLogicDeleteEntity();
+        user.setId(id);
+        user.setName("myUpdate");
+        user.setVersion(1);
+        user.setTestType(1);
+        userMapper.insert(user);
+        userMapper.updateForSet("`name` = 'myUpdateForSet',test_type=test_type+1", Condition.create().eq("test_id", id));
+        H2UserVersionAndLogicDeleteEntity dbUser = userMapper.selectById(id);
+        Assert.assertNotNull(dbUser);
+        Assert.assertEquals("myUpdateForSet", dbUser.getName());
+        Assert.assertEquals("自定义update test_type++", 2, dbUser.getTestType().intValue());
+    }
+
 
     @Test
     public void testCondition() {

+ 1 - 1
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/test/h2/entity/persistent/H2PersonInputPK.java

@@ -60,7 +60,7 @@ public class H2PersonInputPK extends SuSuperEntityCamel {
     private String desc;
 
     @TableField
-	private Date testDate;
+    private Date testDate;
 
     @Version
     private Integer version;

+ 8 - 3
mybatis-plus-generate/src/test/java/com/baomidou/mybatisplus/test/generator/CustomModuleGenerator.java

@@ -1,17 +1,22 @@
 package com.baomidou.mybatisplus.test.generator;
 
 import com.baomidou.mybatisplus.generator.AutoGenerator;
-import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.ConstVal;
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.GlobalConfig;
+import com.baomidou.mybatisplus.generator.config.PackageConfig;
+import com.baomidou.mybatisplus.generator.config.StrategyConfig;
 import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
 import com.baomidou.mybatisplus.generator.config.rules.DbType;
 import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
 
 /**
  * 自定义模块生成,临时解决方案.
+ *
  * @author nieqiurong 2018/5/1
  */
 public class CustomModuleGenerator {
-    
+
     public static void main(String[] args) {
         AutoGenerator mpg = new AutoGenerator().setGlobalConfig(
             new GlobalConfig().setOutputDir("/nieqiurong/baomidou/").setActiveRecord(true).setAuthor("苞米地")
@@ -31,5 +36,5 @@ public class CustomModuleGenerator {
         mpg.setConfig(config);
         mpg.execute();
     }
-    
+
 }

+ 1 - 0
mybatis-plus-support/src/main/java/com/baomidou/mybatisplus/enums/SqlMethod.java

@@ -52,6 +52,7 @@ public enum SqlMethod {
     UPDATE_BY_ID("updateById", "根据ID 选择修改数据", "<script>UPDATE %s %s WHERE %s=#{%s} %s</script>"),
     UPDATE_ALL_COLUMN_BY_ID("updateAllColumnById", "根据ID 修改全部数据", "<script>UPDATE %s %s WHERE %s=#{%s} %s</script>"),
     UPDATE("update", "根据 whereEntity 条件,更新记录", "<script>UPDATE %s %s %s</script>"),
+    UPDATE_FOR_SET("updateForSet", "根据 whereEntity 条件,自定义Set值更新记录", "<script>UPDATE %s %s %s</script>"),
 
     /**
      * 逻辑删除 -> 修改

+ 33 - 0
mybatis-plus-support/src/main/java/com/baomidou/mybatisplus/mapper/AutoSqlInjector.java

@@ -156,6 +156,8 @@ public class AutoSqlInjector implements ISqlInjector {
         this.injectDeleteByMapSql(mapperClass, table);
         /** 修改 */
         this.injectUpdateSql(mapperClass, modelClass, table);
+        /** 修改 (自定义 set 属性) */
+        this.injectUpdateForSetSql(mapperClass, modelClass, table);
         /** 查询 */
         this.injectSelectByMapSql(mapperClass, modelClass, table);
         this.injectSelectOneSql(mapperClass, modelClass, table);
@@ -381,6 +383,22 @@ public class AutoSqlInjector implements ISqlInjector {
         this.addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
     }
 
+    /**
+     * <p>
+     * 注入批量更新 SQL 语句
+     * </p>
+     *
+     * @param mapperClass
+     * @param modelClass
+     * @param table
+     */
+    protected void injectUpdateForSetSql(Class<?> mapperClass, Class<?> modelClass, TableInfo table) {
+        SqlMethod sqlMethod = SqlMethod.UPDATE_FOR_SET;
+        String sql = String.format(sqlMethod.getSql(), table.getTableName(), customSqlSet(), sqlWhereEntityWrapper(table));
+        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
+        this.addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
+    }
+
     /**
      * <p>
      * 注入查询 SQL 语句
@@ -597,6 +615,21 @@ public class AutoSqlInjector implements ISqlInjector {
         return set.toString();
     }
 
+    /**
+     * <p>
+     * SQL 自定义更新 set 语句
+     * </p>
+     *
+     * @return
+     */
+    protected String customSqlSet() {
+        StringBuilder set = new StringBuilder();
+        set.append("<trim prefix=\"SET\" suffixOverrides=\",\">");
+        set.append("\n${setStr}");
+        set.append("\n</trim>");
+        return set.toString();
+    }
+
     /**
      * <p>
      * 获取需要转义的SQL字段

+ 11 - 0
mybatis-plus-support/src/main/java/com/baomidou/mybatisplus/mapper/BaseMapper.java

@@ -127,6 +127,17 @@ public interface BaseMapper<T> {
      */
     Integer update(@Param("et") T entity, @Param("ew") Wrapper<T> wrapper);
 
+    /**
+     * <p>
+     * 根据 whereEntity 条件,更新记录
+     * </p>
+     *
+     * @param setStr  set字符串
+     * @param wrapper 实体对象封装操作类(可以为 null)
+     * @return
+     */
+    Integer updateForSet(@Param("setStr") String setStr, @Param("ew") Wrapper<T> wrapper);
+
     /**
      * <p>
      * 根据 ID 查询

+ 11 - 0
mybatis-plus-support/src/main/java/com/baomidou/mybatisplus/service/IService.java

@@ -185,6 +185,17 @@ public interface IService<T> {
      */
     boolean update(T entity, Wrapper<T> wrapper);
 
+    /**
+     * <p>
+     * 根据 whereEntity 条件,自定义set值更新记录
+     * </p>
+     *
+     * @param setStr  set值字符串
+     * @param wrapper 实体包装类 {@link Wrapper}
+     * @return boolean
+     */
+    boolean updateForSet(String setStr, Wrapper<T> wrapper);
+
     /**
      * <p>
      * 根据ID 批量更新

+ 6 - 0
mybatis-plus-support/src/main/java/com/baomidou/mybatisplus/service/impl/ServiceImpl.java

@@ -293,6 +293,12 @@ public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
         return retBool(baseMapper.update(entity, wrapper));
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean updateForSet(String setStr, Wrapper<T> wrapper) {
+        return retBool(baseMapper.updateForSet(setStr, wrapper));
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public boolean updateBatchById(List<T> entityList) {