使用mybatisplus逻辑删除,修改含有逻辑删除的字段爆错

mybatisplus在配置文件中配置如下

c630a9ded39d4a258d38bea3157d6cc6.png

 以上是全局逻辑删除配置。

当使用mybatisplus生成的修改方法,修改含有showStatus对应的字段时,会报错。

错误sql语句如下

440a93089fa5482d9160bbee1218e3b4.png

 而我要修改的如下:

c7808a6c241f4fb2ad4c738f4690c26f.png

 正确的修改的sql语句应该如下:

b554c0d6d4294da2980cf9304b83e816.png

 所以我们可以在xml文件中单独写sql语句

或者不在配置文件中设置逻辑删除字段名 使用@TableLogic注解

如下:

f0b86d7543c94987a88d4e0455c31614.png

 showStatus是表示此信息是否显示。

5d0e336d693a41798d31656bdad83749.png

 表示 show_status等于0时 brand_id (即id)=1591652104429125634 的信息不显示。

这样我们就是局部使用逻辑删除。

 

### MyBatis-Plus 逻辑删除的实现方法 #### 配置逻辑删除支持 为了启用 MyBatis-Plus逻辑删除功能,需要在项目的配置类中注册 `LogicSqlInjector` 插件。这可以通过创建一个名为 `MybatisPlusConfig` 的配置类并定义如下方法完成: ```java import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.LogicDeleteInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MybatisPlusConfig { // 注册逻辑删除插件 @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new LogicDeleteInnerInterceptor()); return interceptor; } } ``` 此部分代码实现了对逻辑删除的支持[^3]。 --- #### 数据库设计与实体映射 在数据库层面,需为每张表添加一个逻辑删除字段(通常命名为 `deleted`),其默认值为 `0` 表示未删除,而当该字段被更新为 `1` 则表示已被逻辑删除。 对应的实体类也需要标注相应的注解以告知框架哪些字段参与逻辑删除机制: ```java import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableLogic; public class UserEntity { private Long id; @TableField(value = "name") private String name; @TableLogic private Integer deleted; // 默认值为 0 (未删除),逻辑删除后变为 1 } ``` 在此处,`@TableLogic` 注解指定了当前字段是一个逻辑删除标志位[^1]。 --- #### 自动化逻辑删除操作 一旦完成了上述配置,在执行增删查改操作时即可利用 MyBatis-Plus 提供的方法简化流程。例如,要实现一条记录的逻辑删除,只需调用 `BaseMapper.deleteById()` 或者 `removeById()` 方法即可: ```java @Service public class UserServiceImpl implements UserService { @Autowired private BaseMapper<UserEntity> baseMapper; public void deleteById(Long userId) { boolean success = baseMapper.deleteById(userId); System.out.println("删除成功:" + success); // 如果返回 true,则表明逻辑删除成功 } } ``` 这里需要注意的是,虽然表面上看起来像是物理删除的操作,但实际上它只是将对应记录的 `deleted` 字段由 `0` 修改成了 `1` 而已[^2]。 --- #### 特殊场景下的注意事项 尽管逻辑删除极大地方便了数据管理过程,但在实际应用过程中也存在一些潜在风险。例如有些开发者可能会误用逻辑删除字段去表达其他含义,从而引发混乱。因此建议针对特定业务需求单独设立额外的状态标识列而非滥用通用型逻辑删除标记[^4]。 此外还有一种情况就是当项目早期阶段并未考虑周全而导致现有架构难以调整时,可通过自定义查询条件的方式绕过默认行为限制。具体做法是在构建 QueryWrapper 对象的时候明确指定过滤规则: ```java QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("deleted", 1).eq("id", userId); List<UserEntity> resultList = baseMapper.selectList(queryWrapper); if (!resultList.isEmpty()) { System.out.println("找到符合条件的结果!"); } else { System.out.println("无匹配项..."); } ``` 这样即使全局设置了忽略状态为 “已删除”的条目也能灵活应对特殊情况的需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值