【Mybatis Plus】使用删除时间进行软删除的简单实现

文章介绍了如何在Java项目中,利用MybatisPlus框架,通过deleted_at字段实现软删除功能,以解决与唯一约束冲突的问题。方法是创建一个测试表,设置deleted_at为TIMESTAMP类型,并在实体类中使用@TableLogic注解,指定value为null,delval为now(),从而实现新表的时间空值软删除逻辑,同时不影响已有表的原有逻辑。

使用删除时间进行软删除的简单实现

最近在做一个 Java 的项目,这个项目使用了 Mybatis Plus 来进行数据库操作,Mybatis Plus 的软删除默认使用 0,1 来进行标识。由此造成了用户表中软删除和电话号码的唯一约束不能共存的问题,具体可以见这篇博客简而言之,我需要使用删除时间是否为空来进行软删除

在百度上查阅了一些资料,很少有人有这个需求,有一些博客写的方法也不太可行,官方代码库的 issues 里的一些介绍也还是没有很好的讲清楚方法,在看了几篇博客 + 官方文档 + 尝试了一番后,找到了简单的解决方案。

由于我们的项目已经在线上运行了,所以希望以前的表继续使用原来的软删除逻辑,新表使用时间是否为空进行软删除。

具体演示

首先创一个表,用 deleted_at 来标识删除与否

-- 测试表建表函数
-- 表结构
CREATE TABLE test
(
    `id`                     BIGINT       NOT NULL AUTO_INCREMENT,
    `remark`                 TEXT COMMENT '备注',
    `deleted_at`             TIMESTAMP    NULL     DEFAULT NULL COMMENT '删除标志位,NULL-未删除,时间-已删除',
    PRIMARY KEY (`id`) USING BTREE
) CHARACTER SET = utf8mb4
  COLLATE = utf8mb4_unicode_ci COMMENT '测试表';

然后创建实体类,在 @TableLogic 后面再加一个 (value = "null", delval = "now()")。这样就 ok 啦,这样修改只有这张表会使用这个逻辑来进行软删除,别的表依旧沿用别的软删除逻辑(前提:不是使用修改配置文件,全局定义软删除方式

// 实体类

@TableName(value ="test")
@Data
public class Test implements Serializable {
	...
	
    /**
     * 删除标志位
     */
    @TableLogic(value = "null", delval = "now()")
    @JsonIgnore
    private Date deletedAt;

    ...
}

以上就是本文的全部内容,感谢观看!

<think>好的,我现在需要解决用户关于MyBatis Plus实现自动删除逻辑的问题。首先,用户提到的“自动删除逻辑”可能指的是逻辑删除,也就是删除,即不实际从数据库删除数据,而是通过一个标记字段来标识记录是否被删除。我需要确认这一点,但根据常见的MyBatis Plus用法,应该是这样。 接下来,我需要回忆MyBatis Plus中逻辑删除的配置方法。通常,逻辑删除可以通过注解和全局配置来实现。首先是在实体类中使用@TableLogic注解标记逻辑删除字段。例如,在用户表中有一个deleted字段,0表示未删除,1表示已删除。然后,在配置类中配置逻辑删除的全局值,指定未删除和已删除的值。 此外,可能还需要在数据库表中添加对应的字段,比如deleted,并设置默认值为0。这样,当调用MyBatis Plus的deleteById方法时,实际执行的是UPDATE语句,将deleted改为1,而不是真正的DELETE。查询的时候会自动加上deleted=0的条件,排除已删除的记录。 用户可能需要具体的代码示例,所以需要展示实体类的写法、配置类的设置,以及如何使用删除和查询方法。同时,需要解释每个步骤的作用,确保用户理解配置的逻辑。 还需要考虑可能的相关问题,例如如何恢复被逻辑删除的数据,或者如何查询包括已删除的数据。此外,逻辑删除和物理删除的区别、如何自定义逻辑删除的字段和值,以及多租户情况下如何处理逻辑删除,这些都是常见的问题,可以作为后续问题提出。 现在需要将这些步骤整理成清晰的回答,分步骤说明如何配置,并给出示例代码。同时,解释为什么需要这些配置,比如@TableLogic的作用,全局配置的意义等。最后,准备几个相关问题,帮助用户进一步了解逻辑删除的相关内容。</think><< MyBatis Plus实现自动逻辑删除删除)主要通过`@TableLogic`注解和全局配置实现。以下是具体实现步骤: ### 1. 实体类注解配置 ```java @Data @TableName("user") public class User { @TableId(type = IdType.AUTO) private Long id; private String name; @TableLogic private Integer deleted; // 0-未删除 1-已删除 } ``` ### 2. 全局配置(Spring Boot) ```yaml # application.yml mybatis-plus: global-config: db-config: logic-delete-field: deleted # 全局逻辑删除字段 logic-delete-value: 1 # 删除标记值 logic-not-delete-value: 0 # 未删除标记值 ``` ### 3. 自动过滤查询条件 执行删除操作时: ```java userMapper.deleteById(1L); // 实际执行UPDATE user SET deleted=1 WHERE id=1 ``` 执行查询操作时: ```java userMapper.selectList(null); // 自动添加WHERE deleted=0 ``` ### 实现原理: 1. `@TableLogic`注解标记逻辑删除字段 2. MyBatis Plus的SQL解析器会自动在CRUD操作时: - 删除操作转换为UPDATE语句 - 查询操作自动添加未删除条件 3. 可通过配置文件统一管理逻辑删除策略 ### 注意事项: 1. 数据库需要存在对应的逻辑删除字段 2. 需要设置字段默认值为未删除状态(如DEFAULT 0) 3. 需避免在自定义SQL中忘记处理逻辑删除状态
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值