文章目录
- 什么是逻辑删除?
- 为什么用到逻辑删除?
- 在springboot使用Mybatis-Plus提供的逻辑删除
- 1、在application.yml配置
- 2、 实体类字段上加上@TableLogic注解
- 演示
什么是逻辑删除?
逻辑删除的本质是修改操作,并不是真正的删除,而是在表中将对应的是否删除标识(delete_flag)做修改操作。比如0是未删除,1是删除。在逻辑上数据是被删除的,但数据本身依然存在库中。
逻辑删除sql语句为:
update user set deleted=1 where id = 1 and deleted=0
这种设计,后端每次向数据库查询数据时,只查deleted=0(未删除)的数据。拿上面sql举例,那么客户端进行查询id为1的信息,服务器就不会提供信息。
查询sql为:
select id,name,deleted from user where deleted=0
为什么用到逻辑删除?
比如:在一家销售公司中,有两个员工在一月份离职了,后台管理人员在办离职时,如果直接将数据库中与这两个员工相关的信息删除了,那么当经理想要看一月份的销售记录的时候,只能看到部分销售记录,销售金额对不上。这种情况肯定是不允许发生的
如下图:
本来一月总共销售了17,000,00元,结果删除后只剩下了5,000,00。
只需要在员工工号后面加delete_flag字段,用于标记是否被删除即可。
在springboot使用Mybatis-Plus提供的逻辑删除
字段类型支持说明:
支持所有数据类型(推荐使用 Integer,Boolean,LocalDateTime)
如果数据库字段使用datetime,逻辑未删除值和已删除值支持配置为字符串null,另一个值支持配置为函数来获取值如now()
1、在application.yml配置
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)
2、 实体类字段上加上@TableLogic注解
@Data
public class UserPO implements Serializable {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String userName;
private String password;
private String nickName;
@TableLogic
private int delFlag;
}
演示
数据库t_user表中数据:
UserPOMapper:
@Mapper
public interface UserPOMapper extends BaseMapper<UserPO> {
}
IUserService:
public interface IUserService extends IService<UserPO> {
}
IUserServiceImpl:
@Service
public class IUserServiceImpl extends ServiceImpl<UserPOMapper, UserPO> implements IUserService {
}
Controller:
@RequestMapping("/open/del")
public ResultUtil del(UserParam userParam){
UserPO one = iUserService.getOne(new LambdaQueryWrapper<UserPO>()
.eq(UserPO::getUserName, userParam.getUserName()));
boolean b = iUserService.removeById(one);
System.out.println(b);
return ResultUtil.success(b);
}
ResultUtil:
@Data
public class ResultUtil {
private String code;
private String message;
private Object data;
public static ResultUtil success(Object data){
ResultUtil resultUtil = new ResultUtil();
resultUtil.setCode("200");
resultUtil.setMessage("请求成功");
resultUtil.setData(data);
return resultUtil;
}
}
浏览器请求:
数据库t_user表中数据:
可以看到,加了@TableLogic注解的字段对应的数据库字段,由0(未删除)改为1(已删除)