MyBatis Plus 逻辑删除
Posted 我有一只肥螳螂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis Plus 逻辑删除相关的知识,希望对你有一定的参考价值。
何为逻辑删除
-
删除数据,可以通过物理删除,也可以通过逻辑删除。
-
物理删除指的是直接将数据从数据库中删除,不保留。
-
逻辑删除指的是修改数据的某个字段,使其表示为已删除状态,而非删除数据,保留该数据在数据库中,但是查询时不显示该数据(查询时过滤掉该数据)。
方案
给数据表增加一个字段:is_del,用于表示该数据是否被逻辑删除,初始值为 0。0 表示未删除, 1 表示删除。
方法一
实体类字段上加上注解
- value = “未删除的值,默认值为0”;若设置为2,则查询时 where 后面自动拼接 is_del = 2
- delval = “删除后的值,默认值为1”
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty("是否删除标识 0:未删除 1:删除")
@TableLogic(value = "0",delval = "1")
private int isDel;
执行删除,原 deleteById 会物理删除,现在实现逻辑删除
testMapper.deleteById(id);
执行删除后,id 对应行数据的 is_del 字段会变成 1
由于 isDel 添加了 @TableLogic 注解,MyBatis Plus 做所有查询操作时,自动会在 where 条件后面拼上 is_del = 0,所以 is_del 置一后,实现了逻辑删除
思考:一般情况下,我们表设计会有两个时间字段,一个时创建时间,另一个是最后更新时间;通过最后更新时间我们可以知道该数据被删除的时间,那么方法一 deleteById 后,同时更新最后修改时间吗?
答:不可以,如需改变最后修改时间,请选择方法二
方法二
思路就是通过 update 方法来把 is_del 从 0 更新为 1,通过 MyBatis Plus 提供的自动填充功能,可以自动更新最后修改时间和最后修改人
配置自动填充
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class MyObjectHandler implements MetaObjectHandler
@Override
public void updateFill(MetaObject metaObject)
this.strictInsertFill(metaObject, "mender", () -> this.getUserName(), String.class);
this.strictInsertFill(metaObject, "menderId", () -> this.getUserId(), Long.class);
this.strictInsertFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class);
private String getUserName()
return "username";
private Long getUserId()
return -1L;
service 层执行,找出 id 对应的一行,然后把 is_del 字段更新成 1
public void deleteById(Long id)
LambdaUpdateWrapper<TestPO> updateWrapper = new UpdateWrapper<TestPO>().lambda();
updateWrapper.set(TestPO::getIsDel, 1).eq(TestPO::getId, id);
baseMapper.update(new TestPO(), updateWrapper);
此时最后修改人和最后修改时间等于删除人和删除时间,完美
MyBatis-Plus逻辑删除
MyBatis-Plus逻辑删除指,在数据库中删除数据时,并没有真正的删除,而是更改指定字段的值,这个字段的值可以为0或1,0代表未删除,1代表已删除,所以delete操作实际上是update操作,查询操作也是要加where条件过滤掉已删除的数据
MyBatis-Plus配置逻辑删除:
1.#MyBatisPlus全局配置
global-config:
db-config:
#全局配置逻辑删除字段名
logic-delete-field: deleted
#逻辑已删除值(默认1)
logic-delete-value: 1
#逻辑未删除值(默认0)
logic-not-delete-value: 0
2.在实体类和表中添加对应属性,并在属性上方添加@TableLogic注解
调用删除方法时,底层的sql语句自动转为更新语句
以上是关于MyBatis Plus 逻辑删除的主要内容,如果未能解决你的问题,请参考以下文章
mybatis-plus(3.0-RELEASE)逻辑删除的坑
#yyds干货盘点#mybatis-plus学习与实践逻辑删除
Mybatis-Plus:逻辑删除(@TableLogic 将数据标记为删除,而并非真正 的物理删除(非DELETE操作))