逻辑删除

逻辑删除并不会真正的从数据库中将数据删除掉,而是将当前被删除的这条数据中的一个逻辑删除字段置为删除状态。比如该数据有一个字段 deleted_flag,当其值为 0 表示未删除,值为 1 表示删除。那么逻辑删除就是将 0 变成 1

1、实现步骤

  • 假设 UserInfo 表中有一个 deleted_flag 字段作为逻辑删除字段:

逻辑删除字段说明:

  • 字段支持所有数据类型(推荐使用 IntegerBooleanLocalDateTime
  • 如果使用 LocalDateTime,建议逻辑未删除值设置为字符串 null,逻辑删除值只支持数据库函数例如 now()

java pojo逻辑删除 逻辑删除字段_mysql

  • 然后给对应的实体类字段上加上 @TableLogic 注解:
@Data
public class UserInfo {
    private Integer id;
    private String userName;
    private String passWord;
    private Integer age;
    @TableLogic
    private Integer deletedFlag;
}

2、开始测试

  1. 我们使用 MyBatis-Plus 自带方法删除一条记录:
userInfoMapper.deleteById(2);
  1. 查看数据库可以发现这条数据仍然存在,只不过删除字段值被设置为 1

java pojo逻辑删除 逻辑删除字段_spring_02

  1. 使用 MyBatis-Plus 自带方法查询时是不会查到被逻辑删除的记录(会自动添加过滤条件):
List<UserInfo> users = userInfoMapper.selectList(null);

java pojo逻辑删除 逻辑删除字段_数据库_03

3、全局配置参数

  1. 如果项目代码比较规范,所有表的逻辑删除字段使用相同的名称(比如:deleted_flag),我们可以在 application.properties 中添加如下统一的配置,这样对应的实体类字段上就不需要再添加 @TableLogic 注解了:

注意:如果设置了全局逻辑删除字段值,实体类上仍然有 @TableLogic 则以实体上的为准,忽略全局。

#全局逻辑删除字段值
mybatis-plus.global-config.db-config.logic-delete-field=deleted_flag
  1. 默认情况下,逻辑已删除值为 1,逻辑未删除值为 0。我们也可以在 application.properties 中进行修改:
#逻辑已删除值(默认为 1)
mybatis-plus.global-config.db-config.logic-delete-value=1
#逻辑未删除值(默认为 0)
mybatis-plus.global-config.db-config.logic-not-delete-value=0