From 2d3df97d3a2a9c1dcb521173af7e48c3b6e14628 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Sat, 17 Jun 2023 12:05:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20LogicDeleteManager?= =?UTF-8?q?=EF=BC=8C=E7=94=A8=E4=BA=8E=E5=A4=84=E7=90=86=E8=B7=B3=E8=BF=87?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=88=A0=E9=99=A4=E7=9A=84=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/core/logic-delete.md | 14 +++++- .../core/logicdelete/LogicDeleteManager.java | 49 +++++++++++++++++++ .../core/logicdelete/package-info.java | 20 ++++++++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/LogicDeleteManager.java create mode 100644 mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/package-info.java diff --git a/docs/zh/core/logic-delete.md b/docs/zh/core/logic-delete.md index 70224cb7..16a93059 100644 --- a/docs/zh/core/logic-delete.md +++ b/docs/zh/core/logic-delete.md @@ -69,4 +69,16 @@ globalConfig.setNormalValueOfLogicDelete("..."); //设置数据已被删除时的值 globalConfig.setDeletedValueOfLogicDelete("..."); -``` \ No newline at end of file +``` + +## 跳过逻辑删除处理 + +在某些场景下,我们再执行查询、更新或删除数据时,有必要跳过 MyBatis-Flex 自动添加的逻辑删除的相关条件, +此时,我们可以使用 LogicDeleteManager.execWithoutLogicDelete() 方法处理,代码如下: + +```java +LogicDeleteManager.execWithoutLogicDelete(() -> + accountMapper.deleteById(1) + ); +``` +以上代码中,`accountMapper` 会直接对 `Account` 数据进行物理删除,忽略逻辑删除字段配置。 \ No newline at end of file diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/LogicDeleteManager.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/LogicDeleteManager.java new file mode 100644 index 00000000..73f8753c --- /dev/null +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/LogicDeleteManager.java @@ -0,0 +1,49 @@ +package com.mybatisflex.core.logicdelete; + +import java.util.function.Supplier; + +public class LogicDeleteManager { + + private static final ThreadLocal skipFlags = new ThreadLocal<>(); + + + /** + * 跳过逻辑删除字段处理,直接进行数据库物理操作 + */ + public static T execWithoutLogicDelete(Supplier supplier) { + try { + skipLogicDelete(); + return supplier.get(); + } finally { + restoreLogicDelete(); + } + } + + /** + * 跳过逻辑删除字段处理 + */ + public static void skipLogicDelete() { + skipFlags.set(Boolean.TRUE); + } + + + /** + * 恢复逻辑删除字段处理 + */ + public static void restoreLogicDelete() { + skipFlags.remove(); + } + + + public static String getLogicDeleteColumn(String logicDeleteColumn) { + if (logicDeleteColumn == null) { + return null; + } + Boolean skipFlag = skipFlags.get(); + if (skipFlag == null) { + return logicDeleteColumn; + } + + return skipFlag ? null : logicDeleteColumn; + } +} diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/package-info.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/package-info.java new file mode 100644 index 00000000..470c1d97 --- /dev/null +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/logicdelete/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). + *

+ * 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 + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * 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.mybatisflex.core.logicdelete; \ No newline at end of file