目录
一、什么是逻辑删除?
二、为什么使用逻辑删除?
三、在springboot使用Mybatis-Plus提供的逻辑删除
3.1、在application.yml配置
3.2、实体类字段上加上@TableLogic注解
3.3、演示
3.4、UserMapper
3.5、IUserService
3.6、UserServiceImpl
3.7、controller
3.8、ResultUtil
3.9、浏览器请求
3.10、数据库的数据
逻辑删除的本质是修改操作,并不是真正的删除,而是在表中将对应的是否删除标识(del_flag)做修改操作。比如0是未删除,1是删除。在逻辑上数据是被删除的,但数据本身依然存在库中。
逻辑删除sql语句为:
update user set del_flag=1 where id = 1 and del_flag=0
这种设计,后端每次向数据库查询数据时,只查del_flag=0(未删除)的数据。拿上面sql举例,那么客户端进行查询id为1的信息,服务器就不会提供信息。
查询sql为:
select id,name,del_flag from user where del_flag=0
- 方便数据恢复,保护数据本身的价值。
- 保证数据连续性,对主键的影响可能会导致底层B+树重建,而 delete 和 update id 都会影响主键。
事实上,在大多数公司里,都会采用逻辑删除的方式,因为数据的价值更大,被删除的数据也非常有记录价值,这样的操作也并不会提高太多的操作难度。
字段类型支持说明:
支持所有数据类型(推荐使用 Integer,Boolean,LocalDateTime)
如果数据库字段使用datetime,逻辑未删除值和已删除值支持配置为字符串null,另一个值支持配置为函数来获取值如now()
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)
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
/**
* 用户订单
*
* @author yunyan
*/
@TableName("t_user")
@Data
public class UserPO implements Serializable {
/**
* id
*/
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/**
* 用户名
*/
private String userName;
/**
* 密码
*/
private String password;
/**
* 昵称
*/
private String nickName;
/**
* 删除标识
*/
@TableLogic
private Integer delFlag;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.testinterface.entity.po.UserPO;
import org.apache.ibatis.annotations.Mapper;
/**
* 用户映射器
*
* @author yunyan
*/
@Mapper
public interface UserMapper extends BaseMapper {
}
/**
* 用户服务
*
* @author yunyan
*/
public interface IUserService extends IService {
}
/**
* 用户服务impl
*
* @author yunyan
*/
@Service
public class UserServiceImpl extends ServiceImpl implements IUserService {
}
@RequestMapping("/open/del")
public ResultUtil del(UserParam userParam){
UserPO one = userService.getOne(new LambdaQueryWrapper()
.eq(UserPO::getUserName, userParam.getUserName()));
boolean b = userService.removeById(one);
System.out.println(b);
return ResultUtil.success(b);
}
@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;
}
}
可以看到,加了@TableLogic注解的字段对应的数据库字段,由0(未删除)改为1(已删除)