Преглед изворни кода

新增 UpdateAllColumnById 选装方法

hubin пре 6 година
родитељ
комит
674886dce8

+ 1 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/enums/SqlMethod.java

@@ -47,14 +47,13 @@ public enum SqlMethod {
      * 修改
      */
     UPDATE_BY_ID("updateById", "根据ID 选择修改数据", "<script>\nUPDATE %s %s WHERE %s=#{%s} %s\n</script>"),
+    UPDATE_ALL_COLUMN_BY_ID("updateAllColumnById", "根据ID 选择修改数据", "<script>\nUPDATE %s SET %s WHERE %s=#{%s} %s\n</script>"),
     UPDATE("update", "根据 whereEntity 条件,更新记录", "<script>\nUPDATE %s %s %s\n</script>"),
 
     /**
      * 逻辑删除 -> 修改
      */
     LOGIC_UPDATE_BY_ID("updateById", "根据ID 修改数据", "<script>\nUPDATE %s %s WHERE %s=#{%s} %s\n</script>"),
-    LOGIC_UPDATE_ALL_COLUMN_BY_ID("updateAllColumnById", "根据ID 选择修改数据", "<script>\nUPDATE %s %s WHERE %s=#{%s} %s\n</script>"),
-
 
     /**
      * 查询

+ 4 - 4
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/methods/UpdateById.java

@@ -15,13 +15,14 @@
  */
 package com.baomidou.mybatisplus.core.injector.methods;
 
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlSource;
+
 import com.baomidou.mybatisplus.core.enums.SqlMethod;
 import com.baomidou.mybatisplus.core.injector.AbstractMethod;
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.mapping.SqlSource;
 
 /**
  * 根据 ID 更新有值字段
@@ -33,7 +34,6 @@ public class UpdateById extends AbstractMethod {
 
     @Override
     public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
-        String sql;
         boolean logicDelete = tableInfo.isLogicDelete();
         SqlMethod sqlMethod = SqlMethod.UPDATE_BY_ID;
         StringBuilder append = new StringBuilder("<if test=\"et instanceof java.util.Map\">")
@@ -44,7 +44,7 @@ public class UpdateById extends AbstractMethod {
         if (logicDelete) {
             append.append(tableInfo.getLogicDeleteSql(true, false));
         }
-        sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(),
+        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(),
             sqlSet(logicDelete, false, tableInfo, false, ENTITY, ENTITY_DOT),
             tableInfo.getKeyColumn(), ENTITY_DOT + tableInfo.getKeyProperty(),
             append);

+ 26 - 3
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableFieldInfo.java

@@ -15,20 +15,26 @@
  */
 package com.baomidou.mybatisplus.core.metadata;
 
-import com.baomidou.mybatisplus.annotation.*;
+import java.lang.reflect.Field;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.SqlCondition;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
+
 import lombok.AccessLevel;
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.ToString;
 
-import java.lang.reflect.Field;
-
 /**
  * 数据库表字段反射信息
  *
@@ -302,6 +308,17 @@ public class TableFieldInfo implements Constants {
      * @return sql 脚本片段
      */
     public String getSqlSet(final String prefix) {
+        return getSqlSet(false, prefix);
+    }
+
+    /**
+     * 获取 set sql 片段
+     *
+     * @param ignoreIf 忽略 IF 包裹
+     * @param prefix   前缀
+     * @return sql 脚本片段
+     */
+    public String getSqlSet(final boolean ignoreIf, final String prefix) {
         final String newPrefix = prefix == null ? EMPTY : prefix;
         // 默认: column=
         String sqlSet = column + EQUALS;
@@ -310,6 +327,12 @@ public class TableFieldInfo implements Constants {
         } else {
             sqlSet += SqlScriptUtils.safeParam(newPrefix + el);
         }
+        if (ignoreIf) {
+            /**
+             * 忽略 IF 条件
+             */
+            return sqlSet;
+        }
         sqlSet += COMMA;
         if (fieldFill == FieldFill.UPDATE || fieldFill == FieldFill.INSERT_UPDATE) {
             // 不进行 if 包裹

+ 1 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/StringPool.java

@@ -59,6 +59,7 @@ public interface StringPool {
     String LEFT_BRACE = "{";
     String LEFT_BRACKET = "(";
     String LEFT_CHEV = "<";
+    String DOT_NEWLINE = ",\n";
     String NEWLINE = "\n";
     String N = "n";
     String NO = "no";

+ 56 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/injector/methods/additional/UpdateAllColumnById.java

@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2011-2019, hubin (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * https://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.baomidou.mybatisplus.extension.injector.methods.additional;
+
+import static java.util.stream.Collectors.joining;
+
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlSource;
+
+import com.baomidou.mybatisplus.core.enums.SqlMethod;
+import com.baomidou.mybatisplus.core.injector.AbstractMethod;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+
+/**
+ * 根据 ID 更新所有字段
+ *
+ * @author hubin
+ * @since 2019-04-12
+ */
+public class UpdateAllColumnById extends AbstractMethod {
+
+    @Override
+    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
+        boolean logicDelete = tableInfo.isLogicDelete();
+        SqlMethod sqlMethod = SqlMethod.UPDATE_ALL_COLUMN_BY_ID;
+        StringBuilder append = new StringBuilder("<if test=\"et instanceof java.util.Map\">")
+            .append(" AND ${et.").append(Constants.MP_OPTLOCK_VERSION_COLUMN)
+            .append("}=#{et.").append(Constants.MP_OPTLOCK_VERSION_ORIGINAL).append(StringPool.RIGHT_BRACE)
+            .append("</if>");
+        if (logicDelete) {
+            append.append(tableInfo.getLogicDeleteSql(true, false));
+        }
+        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(),
+            tableInfo.getFieldList().stream().filter(i -> !(tableInfo.isLogicDelete() && i.isLogicDelete()))
+                .map(i -> i.getSqlSet(true, ENTITY_DOT)).collect(joining(DOT_NEWLINE)),
+            tableInfo.getKeyColumn(), ENTITY_DOT + tableInfo.getKeyProperty(),
+            append);
+        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
+        return addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
+    }
+}

+ 27 - 14
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/H2UserMapperTest.java

@@ -15,27 +15,34 @@
  */
 package com.baomidou.mybatisplus.test.h2;
 
+import static java.util.stream.Collectors.toList;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.test.h2.entity.H2User;
 import com.baomidou.mybatisplus.test.h2.entity.SuperEntity;
 import com.baomidou.mybatisplus.test.h2.enums.AgeEnum;
 import com.baomidou.mybatisplus.test.h2.mapper.H2UserMapper;
-import com.baomidou.mybatisplus.test.h2.entity.H2User;
-import org.junit.jupiter.api.*;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
-
-import javax.annotation.Resource;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static java.util.stream.Collectors.toList;
 
 /**
  * Mybatis Plus H2 Junit Test
@@ -143,11 +150,17 @@ class H2UserMapperTest extends BaseTest {
             }
         }
         Assertions.assertTrue(CollectionUtils.isNotEmpty(userMapper.selectMaps(new QueryWrapper<>(new H2User().setTestType(3)))));
+
+        // 测试自定义注入方法
+        h2User.setDesc("");
+        h2User.setTestDate(new Date());
+        Assertions.assertTrue(userMapper.updateAllColumnById(h2User) > 0);
+        Assertions.assertTrue("".equals(userMapper.selectById(h2User.getTestId()).getDesc()));
     }
 
     @Test
-    void testCall(){
-        Assertions.assertEquals("1",userMapper.testCall());
+    void testCall() {
+        Assertions.assertEquals("1", userMapper.testCall());
     }
 
     @Test

+ 48 - 24
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/config/MybatisPlusConfig.java

@@ -15,34 +15,43 @@
  */
 package com.baomidou.mybatisplus.test.h2.config;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.sql.DataSource;
+
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.apache.ibatis.type.EnumOrdinalTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ResourceLoader;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.core.MybatisConfiguration;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
+import com.baomidou.mybatisplus.core.injector.AbstractMethod;
+import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
 import com.baomidou.mybatisplus.core.parser.AbstractJsqlParser;
 import com.baomidou.mybatisplus.core.parser.ISqlParser;
 import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
+import com.baomidou.mybatisplus.extension.injector.methods.additional.InsertBatchSomeColumn;
+import com.baomidou.mybatisplus.extension.injector.methods.additional.LogicDeleteByIdWithFill;
+import com.baomidou.mybatisplus.extension.injector.methods.additional.UpdateAllColumnById;
 import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.SqlExplainInterceptor;
 import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
 import com.baomidou.mybatisplus.test.h2.H2MetaObjectHandler;
+
 import net.sf.jsqlparser.statement.delete.Delete;
 import net.sf.jsqlparser.statement.insert.Insert;
 import net.sf.jsqlparser.statement.select.SelectBody;
 import net.sf.jsqlparser.statement.update.Update;
-import org.apache.ibatis.plugin.Interceptor;
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.apache.ibatis.type.EnumOrdinalTypeHandler;
-import org.apache.ibatis.type.JdbcType;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.io.ResourceLoader;
-
-import javax.sql.DataSource;
-import java.util.ArrayList;
-import java.util.List;
 
 /**
  * Mybatis Plus Config
@@ -73,26 +82,26 @@ public class MybatisPlusConfig {
         PaginationInterceptor pagination = new PaginationInterceptor();
         SqlExplainInterceptor sqlExplainInterceptor = new SqlExplainInterceptor();
         List<ISqlParser> sqlParserList = new ArrayList<>();
-        sqlParserList.add(new AbstractJsqlParser(){
-    
+        sqlParserList.add(new AbstractJsqlParser() {
+
             @Override
             public void processInsert(Insert insert) {
-        
+
             }
-    
+
             @Override
             public void processDelete(Delete delete) {
-        
+
             }
-    
+
             @Override
             public void processUpdate(Update update) {
-        
+
             }
-    
+
             @Override
             public void processSelectBody(SelectBody selectBody) {
-        
+
             }
         });
         sqlExplainInterceptor.setSqlParserList(sqlParserList);
@@ -104,6 +113,21 @@ public class MybatisPlusConfig {
             new PerformanceInterceptor()
         });
         globalConfig.setMetaObjectHandler(new H2MetaObjectHandler());
+        globalConfig.setSqlInjector(new DefaultSqlInjector() {
+
+            /**
+             * 测试注入自定义方法
+             */
+            @Override
+            public List<AbstractMethod> getMethodList() {
+                List<AbstractMethod> methodList = super.getMethodList();
+                methodList.add(new LogicDeleteByIdWithFill());
+                methodList.add(new UpdateAllColumnById());
+                methodList.add(new InsertBatchSomeColumn(t -> !(t.getFieldFill() == FieldFill.UPDATE
+                    || t.isLogicDelete() || t.getProperty().equals("version"))));
+                return methodList;
+            }
+        });
         sqlSessionFactory.setGlobalConfig(globalConfig);
         sqlSessionFactory.setTypeEnumsPackage("com.baomidou.mybatisplus.test.h2.enums");
         return sqlSessionFactory.getObject();
@@ -115,9 +139,9 @@ public class MybatisPlusConfig {
         conf.setSqlInjector(new LogicSqlInjector())
             .setEnableSqlRunner(true)
             .setDbConfig(new GlobalConfig.DbConfig()
-            .setLogicDeleteValue("1")
-            .setLogicNotDeleteValue("0")
-            .setIdType(IdType.ID_WORKER));
+                .setLogicDeleteValue("1")
+                .setLogicNotDeleteValue("0")
+                .setIdType(IdType.ID_WORKER));
         return conf;
     }
 }

+ 13 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/mapper/SuperMapper.java

@@ -15,6 +15,10 @@
  */
 package com.baomidou.mybatisplus.test.h2.mapper;
 
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
 /**
  * 自定义父类 SuperMapper
  *
@@ -23,5 +27,13 @@ package com.baomidou.mybatisplus.test.h2.mapper;
  */
 public interface SuperMapper<T> extends com.baomidou.mybatisplus.core.mapper.BaseMapper<T> {
 
-    // 这里可以写 mapper 层公共方法、 注意!! 多泛型的时候请将泛型T放在第一位.
+    /**
+     * 这里注入自定义的公共方法
+     */
+
+    int updateAllColumnById(@Param("et") T entity);
+
+    int deleteByIdWithFill(T entity);
+
+    int insertBatchSomeColumn(List<T> entityList);
 }