From a4d018b86fb088201482e5cf5bd93e738b95f49f 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, 4 Mar 2023 17:36:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20"=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=88=A0=E9=99=A4"=20=E7=9A=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/logic_delete.md | 58 +++++++++++++++++++ .../java/com/mybatisflex/test/Account.java | 13 +++++ .../mybatisflex/test/AccountSqlTester.java | 12 +++- 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 docs/zh/logic_delete.md diff --git a/docs/zh/logic_delete.md b/docs/zh/logic_delete.md new file mode 100644 index 00000000..56f5a0b2 --- /dev/null +++ b/docs/zh/logic_delete.md @@ -0,0 +1,58 @@ +# 逻辑删除 + +## 逻辑删除简介 + +逻辑删除指的是在删除数据的时候,并非真正的去删除,而是将表中列所对应的状态字段(status)做修改操作, +实际上并未删除目标数据。 + +我们可以在做表的字段设计的时候,用一个列表标识该数据的 "删除状态",在 mybatis-flex 中,正常状态的值为 0, 已删除 +的值为 1。 + +## Mybatis-Flex 逻辑删除示例 + +假设在 tb_account 表中,存在一个为 is_deleted 的字段,用来标识该数据的逻辑删除,那么 tb_account 表 +对应的 "Account.java" 实体类应该配置如下: + +```java + +@Table("tb_account") +public class Account { + + @Column(isLogicDelete = true) + private Boolean isDelete; + + //Getter Setter... +} +``` + +此时,当我们执行如下的删除代码是: + +```java +accountMapper.deleteById(1); +``` +Mybatis 执行的 SQL 如下: + +```sql +UPDATE `tb_account` SET `is_delete` = 1 +WHERE `id` = ? AND `is_delete` = 0 +``` +可以看出,当执行 deleteById 时,Mybatis 只是进行了 update 操作,而非 delete 操作。 + +## 注意事项 + +当 "tb_account" 的数据被删除时( is_delete = 1 时),我们通过 Mybatis-Flex 的 selectOneById 去查找数据时,会查询不到数据。 +原因是 `selectOneById` 会自动添加上 `is_delete = 0` 条件,执行的 sql 如下: + +```java +SELECT * FROM tb_account where id = ? and is_delete = 0 +``` + +不仅仅是 selectOneById 方法会添加 `is_delete = 0` 条件,BaseMapper 的以下方法也都会添加该条件: + +- selectOneByMap +- selectOneByQuery +- selectListByIds +- selectListByMap +- selectListByQuery +- selectCountByQuery +- paginate \ No newline at end of file diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/test/Account.java b/mybatis-flex-core/src/test/java/com/mybatisflex/test/Account.java index cf4d3917..43d40ea9 100644 --- a/mybatis-flex-core/src/test/java/com/mybatisflex/test/Account.java +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/test/Account.java @@ -1,5 +1,6 @@ package com.mybatisflex.test; +import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.Table; @@ -21,6 +22,10 @@ public class Account { private boolean isNormal; + @Column(isLogicDelete = true) + private Boolean isDelete; + + public Long getId() { return id; } @@ -68,4 +73,12 @@ public class Account { public void setNormal(boolean normal) { isNormal = normal; } + + public Boolean getDelete() { + return isDelete; + } + + public void setDelete(Boolean delete) { + isDelete = delete; + } } diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/test/AccountSqlTester.java b/mybatis-flex-core/src/test/java/com/mybatisflex/test/AccountSqlTester.java index b7dbaa22..8d0366fe 100644 --- a/mybatis-flex-core/src/test/java/com/mybatisflex/test/AccountSqlTester.java +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/test/AccountSqlTester.java @@ -1,9 +1,11 @@ package com.mybatisflex.test; -import com.mybatisflex.core.dialect.IDialect; import com.mybatisflex.core.dialect.CommonsDialectImpl; +import com.mybatisflex.core.dialect.IDialect; import com.mybatisflex.core.querywrapper.CPI; import com.mybatisflex.core.querywrapper.QueryWrapper; +import com.mybatisflex.core.table.TableInfo; +import com.mybatisflex.core.table.TableInfos; import org.junit.Test; import java.util.Arrays; @@ -158,6 +160,14 @@ public class AccountSqlTester { System.out.println(sql); } + @Test + public void testDeleteSql() { + IDialect dialect = new CommonsDialectImpl(); + TableInfo tableInfo = TableInfos.ofEntityClass(Account.class); + String sql = dialect.forDeleteEntityById(tableInfo); + System.out.println(sql); + } + @Test public void testrSelectLimitSql() {