跳到主要内容

3.5 逻辑删除

逻辑删除

自动识别

当目标数据库表中存在配置的逻辑删除列时,查询、普通更新和删除会启用逻辑删除。默认列名是 deleted。Pojo 批量插入若要把默认值同步回填到对象,还需要 Bean 中存在对应映射字段;批量更新的特殊边界见 批量操作

配置

dlz:
db:
logic-delete-field: deleted

自动行为

查询自动过滤:

DB.pojo.selectWrapper(User.class).eq(User::getStatus, 1).queryBeanList();
// → SELECT * FROM user WHERE status = 1 AND deleted = 0

删除变更新:

DB.pojo.deleteWrapper(User.class).eq(User::getId, 1).execute();
// → UPDATE user SET deleted = 1 WHERE id = 1 AND deleted = 0

更新自动过滤:

DB.pojo.updateById(user);
// → UPDATE user SET ... WHERE id = 1 AND deleted = 0

查询已删除数据

逻辑删除开启后查询自动带 deleted = 0 条件。当前 8.0 的便捷 SelectOption.INCLUDE_DELETED 可用于支持 DbOption... 的直接查询,例如按 ID 查询:

User user = DB.pojo.selectById(User.class, id, SelectOption.INCLUDE_DELETED);

当前 Pojo 查询 Wrapper 没有与此对称的稳定便捷方法。不要在查询 Wrapper 上调用 ignoreLogicDelete(true),该方法只存在于删除执行器。

物理删除

如需执行真正的 DELETE(绕过逻辑删除):

DB.pojo.deleteWrapper(User.class).eq(User::getId, 1).physical();
// → DELETE FROM user WHERE id = 1

// 直接 API
DB.pojo.deleteById(User.class, 1, DeleteOption.PHYSICAL);

写安全提醒

逻辑删除条件会被注入 WHERE,因此没有业务条件的删除 Wrapper 可能命中全部 deleted = 0 记录。不要依赖框架的 WHERE false 兜底;删除操作始终显式添加业务条件,并检查影响行数。