关于逻辑删除的案例

考虑一个电商场景

商品表(goodsId int primary key,......);

订单表(orderId int,goodsId ......foreign key goodsId references 商品表(goodsId));

订单表中的goodsId被商品表中的goodsId约束

要是想下架某个商品,可以直接将商品表删除吗?显然是不行的,因为外键约束的存在,商品表作为父表不能在其子表删除前删除,那就是要将订单表全删除吗?也不行,订单表数量多且需保留给客户。那要如何在有外键约束存在的前提下将商品下架呢?

解决方法就是,将要下架的商品隐藏起来,让客户查找商品时查不到已经下架的商品,但商品表的数据还在,不会影响到订单表的数据。

通过在商品表中添加一个列(isOk),单独表示商品的状态,1表示在线,0表示下架。当商品要下架的时候,使用update将该商品表的isOk改为0,即可实现商品下架,客户在搜索商品时,系统都会加上isOk = 1的条件,查询到的都是在线的商品。

电脑上的文件删除也是逻辑删除,删除文件并清空回收站,其实并没有真正将文件彻底删除,而是将这份文件的硬盘数据标成无效,能够通过一些技术手段进行恢复。直到之后有数据占用了这个文件的位置才真正地将文件删除干净了。

### MyBatis-Plus 逻辑删除失效的原因及解决方案 #### 可能原因分析 1. **全局配置错误** 如果 `application.yml` 中的全局配置项设置不正确,可能导致逻辑删除功能无法正常工作。例如,如果未正确定义 `logic-delete-field` 或其对应的值(如 `logic-not-delete-value` 和 `logic-delete-value`),则框架可能不会识别该字段作为逻辑删除标志[^1]。 2. **实体类缺少注解** 即使全局配置已启用逻辑删除支持,但如果实体类中的逻辑删除字段未标注 `@TableLogic` 注解,则 MyBatis-Plus 不会将其视为逻辑删除字段[^3]。 3. **SQL 执行过程中被覆盖** 在某些情况下,开发者可能会手动编写 SQL 并绕过 MyBatis-Plus 的自动处理机制。这种做法容易导致逻辑删除字段未被更新或忽略。通过源码分析可以发现,只有当 `logicDelete` 参数为 `true` 时,才会触发逻辑删除行为[^2]。 4. **版本兼容性问题** 使用较旧版本的 MyBatis-Plus 时可能存在 Bug 导致逻辑删除功能异常。建议升级到最新稳定版以修复潜在问题[^3]。 5. **数据库字段类型不符** 数据库表中用于存储逻辑删除状态的字段应与 Java 实体类属性的数据类型一致。如果不匹配,也可能引发逻辑删除失败的情况。 --- #### 解决方案 ##### 配置检查 确保项目中的 `application.yml` 文件包含如下正确的全局配置: ```yaml mybatis-plus: global-config: db-config: logic-delete-field: deleted # 逻辑删除字段名 logic-not-delete-value: 0 # 逻辑删除值 logic-delete-value: 1 # 逻辑删除值 ``` ##### 实体类调整 确认实体类中代表逻辑删除状态的字段添加了 `@TableLogic` 注解。例如: ```java import com.baomidou.mybatisplus.annotation.TableLogic; public class User { private Long id; @TableLogic private Integer deleted; // 对应数据库中的逻辑删除字段 } ``` ##### 自定义 Mapper 方法验证 若自定义了 `BaseMapper` 接口的方法而遇到逻辑删除失效现象,需仔细排查实现细节是否遵循官方推荐的最佳实践。必要时可通过调试工具跟踪调用链路并定位具体环节是否存在偏差[^2]。 ##### 版本管理优化 当前使用的依赖版本较低,存在一定的风险隐患。可考虑将相关组件升级至更高版本来获得更完善的特性支持以及性能改进。以下是示例 POM 文件片段供参考: ```xml <dependencies> <!-- MyBatis Plus Core --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3</version> <!-- 替换为最新的稳定版本号 --> </dependency> <!-- Code Generator (Optional) --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.3</version> </dependency> </dependencies> ``` ##### 测试案例构建 为了进一步验证修正措施的有效性,可以通过单元测试的方式模拟不同场景下的增删改查操作流程。下面给出一段简单的代码样例展示如何针对单条记录执行逻辑删除动作: ```java @Test void testLogicDelete() { LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(User::getId, 1L); boolean result = userMapper.delete(queryWrapper); Assertions.assertTrue(result); // 断言删除成功 } // 查询已被标记为“已删除”的数据 @Test void testSelectDeletedRecords() { List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("deleted", 1)); System.out.println(users.size()); } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值