mybatis-plus逻辑删除不生效的问题:
在开发过程想执行逻辑删除,将is_deleted字段置为1,结果除了id_deleted字段没被更新,其他字段都被更新了。
错误写法:
@Service
@AllArgsConstructor
@Slf4j
public class OrderMainTableServiceImpl extends BaseServiceImpl<OrderMainTableMapper, OrderMainTable> implements IOrderMainTableService {
// 无效写法,逻辑删除不生效
@Override
public Boolean deleteOrderMainTable(String id) {
//********************逻辑省略********************
orderMainTable.setId(id);
orderMainTable.setStatus(1);
orderMainTable.setIsDeleted(1);
this.updateById(orderMainTable);
//********************逻辑省略********************
return true;
}
}
结果就是status被置成了1,is_deleted字段没变化
正确写法:
@Service
@AllArgsConstructor
@Slf4j
public class OrderMainTableServiceImpl extends BaseServiceImpl<OrderMainTableMapper, OrderMainTable> implements IOrderMainTableService {
// 正确写法,逻辑删除不生效
@Override
public Boolean deleteOrderMainTable(String id) {
//********************逻辑省略********************
this.update(Wrappers.<OrderMainTable>update().lambda().set(OrderMainTable::getIsDeleted, 1).set(OrderMainTable::getStatus, 1).eq(OrderMainTable::getId, id));
//********************逻辑省略********************
return true;
}
}
当然,如果只进行逻辑删除,不更新其他字段,可以直接用service的removeById()方法或baseMapper的deleteById()方法。
public Boolean deleteOrderMainTable(String id) {
//********************逻辑省略********************
this.removeById(id);
// 或
baseMapper.deleteById(id);
//********************逻辑省略********************
return true;
}
如果上面写法逻辑删除都没生效,可以检查下mybatis-plus的配置是否正确
#mybatis-plus配置
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
或查看isDeleted字段上是否有@TableLogic注解
/**
* 是否已删除
*/
@TableLogic
@ApiModelProperty(value = "是否已删除")
private Integer isDeleted;
如果表里没有is_deleted字段,或者业务要求物理删除这条数据,这时推荐直接用mybatis手写sql
<delete id="deleteById">
DELETE FROM order_main_table where id = #{id}
</delete>
可以参考官方文档:mybatis官方文档