软删除是通过标记字段(如is_deleted或deleted_at)逻辑标识删除而非物理删除,需在表结构、查询sql、更新操作及恢复/彻底删除四方面由开发者基于jdbc协同实现。

软删除不是真正从数据库中删除记录,而是通过标记字段(如 is_deleted 或 deleted_at)标识该记录“逻辑上已删除”。JDBC 本身不提供软删除机制,需由开发者在 SQL 和 Java 代码中协同实现。
1. 数据库表结构需支持软删除字段
在建表时添加用于标识删除状态的列,推荐使用以下两种方式之一:
-
布尔型字段:如
is_deleted TINYINT(1) DEFAULT 0(0 表示未删除,1 表示已删除) -
时间戳字段:如
deleted_at DATETIME NULL(NULL 表示未删除,有值表示删除时间)
建议配合索引提升查询性能,例如对 is_deleted 或 deleted_at 建立复合索引(尤其当常与 WHERE is_deleted = 0 一起使用时)。
2. 查询时默认过滤已删除记录
所有常规查询(如列表、详情)应默认排除软删除数据。在 JDBC 的 SQL 中显式添加条件:
SELECT id, name, email FROM user WHERE is_deleted = 0 AND status = 'active';
Java 中使用 PreparedStatement 防止 SQL 注入:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
String sql = "SELECT id, name, email FROM user WHERE is_deleted = ? AND status = ?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, 0); // 未删除 ps.setString(2, "active"); ResultSet rs = ps.executeQuery();
3. 删除操作改为更新标记字段
不再使用 DELETE FROM user WHERE id = ?,而是执行 UPDATE 修改软删除字段:
- 用布尔字段:
UPDATE user SET is_deleted = 1 WHERE id = ? AND is_deleted = 0 - 用时间戳字段:
UPDATE user SET deleted_at = NOW() WHERE id = ? AND deleted_at IS NULL
Java 示例(布尔方式):
String sql = "UPDATE user SET is_deleted = 1 WHERE id = ? AND is_deleted = 0";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setLong(1, userId);
int rows = ps.executeUpdate();
if (rows == 0) {
throw new RuntimeException("记录不存在或已被删除");
}
注意添加 AND is_deleted = 0 条件可防止重复软删除,也避免误操作。
4. 恢复删除与彻底删除需单独处理
软删除后可能需要“恢复”或“物理删除”,应在业务层明确区分:
-
恢复操作:执行反向 UPDATE,如
UPDATE user SET is_deleted = 0 WHERE id = ? - 彻底删除:仅限管理后台或归档场景,使用真实 DELETE,并做好权限和日志控制
物理删除语句示例(谨慎使用):
DELETE FROM user WHERE id = ? AND is_deleted = 1;
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










