From 95ae900334af6c8d67b300a17f4cd960cdad0ee6 Mon Sep 17 00:00:00 2001 From: nieqiurong Date: Sat, 8 Jun 2024 22:48:48 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=89=B9=E9=87=8F=E5=88=A0?= =?UTF-8?q?=E9=99=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../injector/methods/DeleteBatchByIds.java | 22 ++++++++++++++++++- .../mybatisplus/core/mapper/BaseMapper.java | 14 ++---------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/methods/DeleteBatchByIds.java b/mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/methods/DeleteBatchByIds.java index 6482feffc..b619ccd96 100644 --- a/mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/methods/DeleteBatchByIds.java +++ b/mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/methods/DeleteBatchByIds.java @@ -17,11 +17,20 @@ import com.baomidou.mybatisplus.core.enums.SqlMethod; import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.SqlSource; +import java.util.List; + +import static java.util.stream.Collectors.joining; +import static java.util.stream.Collectors.toList; + /** * 根据 ID 集合删除 * @@ -68,11 +77,22 @@ public MappedStatement injectMappedStatement(Class mapperClass, Class mode * @since 3.5.0 */ public String logicDeleteScript(TableInfo tableInfo, SqlMethod sqlMethod) { + List fieldInfos = tableInfo.getFieldList().stream() + .filter(TableFieldInfo::isWithUpdateFill) + .filter(f -> !f.isLogicDelete()) + .collect(toList()); + String sqlSet = "SET "; + if (CollectionUtils.isNotEmpty(fieldInfos)) { + sqlSet += SqlScriptUtils.convertIf(fieldInfos.stream() + .map(i -> i.getSqlSet(Constants.ENTITY + StringPool.DOT)).collect(joining(EMPTY)), String.format("%s != null", Constants.ENTITY), true); + } + sqlSet += StringPool.EMPTY + tableInfo.getLogicDeleteSql(false, false); return String.format(sqlMethod.getSql(), tableInfo.getTableName(), - sqlLogicSet(tableInfo), tableInfo.getKeyColumn(), SqlScriptUtils.convertForeach( + sqlSet, tableInfo.getKeyColumn(), SqlScriptUtils.convertForeach( SqlScriptUtils.convertChoose("@org.apache.ibatis.type.SimpleTypeRegistry@isSimpleType(item.getClass())", "#{item}", "#{item." + tableInfo.getKeyProperty() + "}"), COLL, null, "item", COMMA), tableInfo.getLogicDeleteSql(true, true)); } + } diff --git a/mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/mapper/BaseMapper.java b/mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/mapper/BaseMapper.java index 2212601f4..b5c2f6106 100644 --- a/mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/mapper/BaseMapper.java +++ b/mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/mapper/BaseMapper.java @@ -36,7 +36,6 @@ import org.apache.ibatis.session.SqlSessionFactory; import java.io.Serializable; -import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -199,19 +198,10 @@ default int deleteByIds(@Param(Constants.COLL) Collection collections, boolea SqlSession sqlSession = mybatisMapperProxy.getSqlSession(); Class mapperInterface = mybatisMapperProxy.getMapperInterface(); TableInfo tableInfo = TableInfoHelper.getTableInfo(entityClass); + Map params = new HashMap<>(); if (useFill && tableInfo.isWithLogicDelete() && tableInfo.isWithUpdateFill()) { - List ids = new ArrayList<>(collections.size()); - for (Object obj : collections) { - // TODO 乐观锁待定(感觉都要删除了,可以不用考虑乐观锁的情况了)... - if (entityClass.isAssignableFrom(obj.getClass())) { - ids.add(tableInfo.getPropertyValue(obj, tableInfo.getKeyProperty())); - } else { - ids.add(obj); - } - } - return this.update(tableInfo.newInstance(), Wrappers.update().in(tableInfo.getKeyColumn(), ids)); + params.put(Constants.ENTITY, tableInfo.newInstance()); } - Map params = new HashMap<>(); params.put(Constants.COLL, collections); return sqlSession.delete(mapperInterface.getName() + StringPool.DOT + SqlMethod.DELETE_BATCH_BY_IDS.getMethod(), params); }