java如何逻辑删除
逻辑删除的实现方法
在Java中实现逻辑删除通常涉及在数据库表中添加一个标记字段(如is_deleted),通过更新该字段而非物理删除数据来达到删除效果。以下是常见的实现方式:
使用MyBatis-Plus实现逻辑删除
MyBatis-Plus提供了便捷的逻辑删除注解配置:
// 实体类中添加逻辑删除字段
@Data
public class User {
private Long id;
private String name;
@TableLogic
private Integer isDeleted; // 1表示删除,0表示未删除
}
在application.yml中配置逻辑删除的全局值:
mybatis-plus:
global-config:
db-config:
logic-delete-field: isDeleted # 全局逻辑删除字段
logic-not-delete-value: 0 # 未删除值
logic-delete-value: 1 # 删除值
JPA实现逻辑删除
通过@SQLDelete和@Where注解实现:
@Entity
@Table(name = "user")
@SQLDelete(sql = "UPDATE user SET is_deleted = 1 WHERE id = ?")
@Where(clause = "is_deleted = 0")
public class User {
@Id
private Long id;
private String name;
@Column(name = "is_deleted")
private boolean deleted;
}
手动实现逻辑删除
对于不使用ORM框架的场景,可以直接编写SQL:
// 删除操作改为更新
String sql = "UPDATE table_name SET is_deleted = 1 WHERE id = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setLong(1, id);
ps.executeUpdate();
查询时的注意事项
所有查询语句需要自动过滤已逻辑删除的数据:
SELECT * FROM user WHERE is_deleted = 0;
在MyBatis-Plus或JPA中,框架会自动添加该条件。手动实现时需要确保每个查询都包含过滤条件。
逻辑删除的优缺点
优点
保留数据完整性,便于数据恢复和审计追踪
避免外键约束问题

缺点
增加查询复杂度,需要始终考虑过滤条件
数据库表体积会持续增长
需要定期归档真正不需要的数据






