Browse Source

解决逻辑删除同时存在非逻辑删除逻辑, 逻辑删除支持 delete set 其他字段, update 排除逻辑删除字段

hubin 7 years ago
parent
commit
a54e0b2d8b

+ 20 - 13
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/AbstractMethod.java

@@ -115,13 +115,13 @@ public abstract class AbstractMethod {
      * SQL 更新 set 语句
      * </p>
      *
-     * @param selective 是否选择判断
-     * @param ew        是否存在 UpdateWrapper 条件
-     * @param table     表信息
-     * @param prefix    前缀
+     * @param logic  是否逻辑删除注入器
+     * @param ew     是否存在 UpdateWrapper 条件
+     * @param table  表信息
+     * @param prefix 前缀
      * @return
      */
-    protected String sqlSet(boolean selective, boolean ew, TableInfo table, String prefix) {
+    protected String sqlSet(boolean logic, boolean ew, TableInfo table, String prefix) {
         StringBuilder set = new StringBuilder();
         set.append("<trim prefix=\"SET\" suffixOverrides=\",\">");
 
@@ -129,10 +129,24 @@ public abstract class AbstractMethod {
         boolean ifTag;
         List<TableFieldInfo> fieldList = table.getFieldList();
         for (TableFieldInfo fieldInfo : fieldList) {
+            // 逻辑删除逻辑
+            if (logic && fieldInfo.isLogicDelete()) {
+                if (null != prefix) {
+                    // 更新排除逻辑删除字段
+                    continue;
+                }
+                set.append(fieldInfo.getColumn()).append("=");
+                if (StringUtils.isCharSequence(fieldInfo.getPropertyType())) {
+                    set.append("'").append(fieldInfo.getLogicDeleteValue()).append("',");
+                } else {
+                    set.append(fieldInfo.getLogicDeleteValue()).append(",");
+                }
+                continue;
+            }
             // 判断是否更新忽略,在FieldIgnore,UPDATE,INSERT_UPDATE设置为false
             ifTag = !(FieldFill.UPDATE == fieldInfo.getFieldFill()
                 || FieldFill.INSERT_UPDATE == fieldInfo.getFieldFill());
-            if (selective && ifTag) {
+            if (ifTag) {
                 if (StringUtils.isNotEmpty(fieldInfo.getUpdate())) {
                     set.append(fieldInfo.getColumn()).append("=")
                         .append(String.format(fieldInfo.getUpdate(), fieldInfo.getColumn())).append(",");
@@ -145,13 +159,6 @@ public abstract class AbstractMethod {
                     set.append(fieldInfo.getEl()).append("},")
                         .append(convertIfTag(true, fieldInfo, null, true));
                 }
-            } else if (FieldFill.INSERT != fieldInfo.getFieldFill()) {
-                // 排除填充注解字段
-                set.append(fieldInfo.getColumn()).append("=#{");
-                if (null != prefix) {
-                    set.append(prefix);
-                }
-                set.append(fieldInfo.getEl()).append("},");
             }
         }
         // UpdateWrapper SqlSet 部分

+ 2 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/methods/Update.java

@@ -35,8 +35,8 @@ public class Update extends AbstractMethod {
     @Override
     public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
         SqlMethod sqlMethod = SqlMethod.UPDATE;
-        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), this.sqlSet(true, true, tableInfo, "et."),
-            this.sqlWhereEntityWrapper(tableInfo));
+        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(),
+            sqlSet(false, true, tableInfo, "et."), sqlWhereEntityWrapper(tableInfo));
         SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
         return this.addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
     }

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

@@ -36,7 +36,7 @@ public class UpdateById extends AbstractMethod {
     public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
         SqlMethod sqlMethod = SqlMethod.UPDATE_BY_ID;
         String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(),
-            sqlSet(true, false, tableInfo, "et."),
+            sqlSet(false, false, tableInfo, "et."),
             tableInfo.getKeyColumn(), "et." + tableInfo.getKeyProperty(),
             new StringBuilder("<if test=\"et instanceof java.util.Map\">")
                 .append("<if test=\"et.MP_OPTLOCK_VERSION_ORIGINAL!=null\">")

+ 18 - 7
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/injector/LogicAbstractMethod.java

@@ -32,6 +32,10 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
  */
 public abstract class LogicAbstractMethod extends AbstractMethod {
 
+    public LogicAbstractMethod() {
+        // TO DO NOTHING
+    }
+
     /**
      * <p>
      * SQL 更新 set 语句
@@ -43,9 +47,13 @@ public abstract class LogicAbstractMethod extends AbstractMethod {
     public String getLogicDeleteSql(TableInfo table) {
         StringBuilder sql = new StringBuilder();
         List<TableFieldInfo> fieldList = table.getFieldList();
+        int i = 0;
         for (TableFieldInfo fieldInfo : fieldList) {
             if (fieldInfo.isLogicDelete()) {
-                sql.append(" AND ").append(fieldInfo.getColumn());
+                if (++i > 1) {
+                    sql.append(" AND ");
+                }
+                sql.append(fieldInfo.getColumn());
                 if (StringUtils.isCharSequence(fieldInfo.getPropertyType())) {
                     sql.append("='").append(fieldInfo.getLogicNotDeleteValue()).append("'");
                 } else {
@@ -90,7 +98,7 @@ public abstract class LogicAbstractMethod extends AbstractMethod {
     protected String sqlWhereEntityWrapper(TableInfo table) {
         if (table.isLogicDelete()) {
             StringBuilder where = new StringBuilder(128);
-            where.append("<if test=\"ew!=null and !ew.emptyOfWhere\">");
+            where.append("<choose><when test=\"ew!=null and !ew.emptyOfWhere\">");
             where.append("<trim prefix=\"WHERE\" prefixOverrides=\"AND|OR\">");
             where.append("<if test=\"ew.entity!=null\">");
             if (StringUtils.isNotEmpty(table.getKeyProperty())) {
@@ -106,13 +114,16 @@ public abstract class LogicAbstractMethod extends AbstractMethod {
                     fieldInfo.getColumn(), "ew.entity." + fieldInfo.getEl()));
                 where.append(convertIfTag(fieldInfo, true));
             }
-            where.append("</if>");
+            where.append("</if> AND ");
             // 删除逻辑
             where.append(getLogicDeleteSql(table));
             // SQL 片段
             where.append("<if test=\"ew.sqlSegment!=null and ew.sqlSegment!=''\"> AND ${ew.sqlSegment}</if>");
             where.append("</trim>");
-            where.append("</if>");
+            where.append("</when><otherwise>WHERE ");
+            // 删除逻辑
+            where.append(getLogicDeleteSql(table));
+            where.append("</otherwise></choose>");
             return where.toString();
         }
         // 正常逻辑
@@ -123,15 +134,15 @@ public abstract class LogicAbstractMethod extends AbstractMethod {
     protected String sqlWhereByMap(TableInfo table) {
         if (table.isLogicDelete()) {
             return new StringBuilder()
+                .append("<trim prefix=\"WHERE\" prefixOverrides=\"AND\">")
                 .append("<if test=\"cm!=null and !cm.isEmpty\">")
-                .append("<where>")
                 .append("<foreach collection=\"cm\" index=\"k\" item=\"v\" separator=\"AND\">")
                 .append("<choose><when test=\"v==null\"> ${k} IS NULL </when>")
                 .append("<otherwise> ${k}=#{v} </otherwise></choose>")
                 .append("</foreach>")
+                .append("</if> AND ")
                 .append(getLogicDeleteSql(table))
-                .append("</where>")
-                .append("</if>")
+                .append("</trim>")
                 .toString();
         }
         // 正常逻辑

+ 8 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/injector/methods/LogicDelete.java

@@ -34,9 +34,15 @@ public class LogicDelete extends LogicAbstractMethod {
 
     @Override
     public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
+        String sql;
         SqlMethod sqlMethod = SqlMethod.LOGIC_DELETE;
-        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), sqlLogicSet(tableInfo),
-            sqlWhereEntityWrapper(tableInfo));
+        if (tableInfo.isLogicDelete()) {
+            sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), sqlSet(true, true, tableInfo, null),
+                sqlWhereEntityWrapper(tableInfo));
+        } else {
+            sqlMethod = SqlMethod.DELETE;
+            sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), this.sqlWhereEntityWrapper(tableInfo));
+        }
         SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
         return addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
     }

+ 9 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/injector/methods/LogicDeleteBatchByIds.java

@@ -34,9 +34,16 @@ public class LogicDeleteBatchByIds extends LogicAbstractMethod {
 
     @Override
     public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
+        String sql;
         SqlMethod sqlMethod = SqlMethod.LOGIC_DELETE_BATCH_BY_IDS;
-        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), sqlLogicSet(tableInfo), tableInfo.getKeyColumn(),
-            "<foreach item=\"item\" collection=\"coll\" separator=\",\">#{item}</foreach>");
+        if (tableInfo.isLogicDelete()) {
+            sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), sqlLogicSet(tableInfo), tableInfo.getKeyColumn(),
+                "<foreach item=\"item\" collection=\"coll\" separator=\",\">#{item}</foreach>");
+        } else {
+            sqlMethod = SqlMethod.DELETE_BATCH_BY_IDS;
+            sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), tableInfo.getKeyColumn(),
+                "<foreach item=\"item\" collection=\"coll\" separator=\",\">#{item}</foreach>");
+        }
         SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
         return addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
     }

+ 9 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/injector/methods/LogicDeleteById.java

@@ -34,9 +34,16 @@ public class LogicDeleteById extends LogicAbstractMethod {
 
     @Override
     public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
+        String sql;
         SqlMethod sqlMethod = SqlMethod.LOGIC_DELETE_BY_ID;
-        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), sqlLogicSet(tableInfo),
-            tableInfo.getKeyColumn(), tableInfo.getKeyProperty());
+        if (tableInfo.isLogicDelete()) {
+            sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), sqlLogicSet(tableInfo),
+                tableInfo.getKeyColumn(), tableInfo.getKeyProperty());
+        } else {
+            sqlMethod = SqlMethod.DELETE_BY_ID;
+            sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), tableInfo.getKeyColumn(),
+                tableInfo.getKeyProperty());
+        }
         SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
         return addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
     }

+ 7 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/injector/methods/LogicDeleteByMap.java

@@ -36,9 +36,14 @@ public class LogicDeleteByMap extends LogicAbstractMethod {
 
     @Override
     public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
+        String sql;
         SqlMethod sqlMethod = SqlMethod.LOGIC_DELETE_BY_MAP;
-        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), sqlLogicSet(tableInfo),
-            sqlWhereByMap(tableInfo));
+        if (tableInfo.isLogicDelete()) {
+            sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), sqlLogicSet(tableInfo), sqlWhereByMap(tableInfo));
+        } else {
+            sqlMethod = SqlMethod.DELETE_BY_MAP;
+            sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), this.sqlWhereByMap(tableInfo));
+        }
         SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, Map.class);
         return addUpdateMappedStatement(mapperClass, Map.class, sqlMethod.getMethod(), sqlSource);
     }

+ 1 - 1
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/injector/methods/LogicUpdateById.java

@@ -40,7 +40,7 @@ public class LogicUpdateById extends LogicAbstractMethod {
             new StringBuilder("<if test=\"et instanceof java.util.Map\">")
                 .append("<if test=\"et.MP_OPTLOCK_VERSION_ORIGINAL!=null\">")
                 .append(" AND ${et.MP_OPTLOCK_VERSION_COLUMN}=#{et.MP_OPTLOCK_VERSION_ORIGINAL}")
-                .append("</if></if>").append(getLogicDeleteSql(tableInfo)));
+                .append("</if></if> AND ").append(getLogicDeleteSql(tableInfo)));
         SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
         return addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
     }

+ 3 - 4
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/H2UserMapperTest.java

@@ -103,10 +103,10 @@ public class H2UserMapperTest extends BaseTest {
 
         h2User.setAge(3);
         h2User.setDesc(null);
-        Assert.assertTrue(1 == userMapper.update(h2User,
+        Assert.assertTrue(userMapper.update(h2User,
             new UpdateWrapper<H2User>().lambda()
                 .set(H2User::getDesc, "")
-                .eq(H2User::getName, NQQ)));
+                .eq(H2User::getName, "Jerry")) > 0);
 
         log(userMapper.selectOne(new QueryWrapper<>(new H2User().setName(NQQ).setAge(3))));
 
@@ -135,8 +135,7 @@ public class H2UserMapperTest extends BaseTest {
                 System.out.println(m);
             }
         }
-        Assert.assertTrue(CollectionUtils.isNotEmpty(userMapper.selectMaps(
-            new QueryWrapper<>(new H2User().setAge(3)).eq("name", NQQ))));
+        Assert.assertTrue(CollectionUtils.isNotEmpty(userMapper.selectMaps(new QueryWrapper<>(new H2User().setAge(18)))));
     }