一 、逻辑删除的概念
         逻辑删除不会在数据库中删除数据,只是通过一个字段用来标识被删除的记录,数据仍然保存在数据库中。在实际的工作当中,因为数据非常重要,为了防止因用户误操作删除数据后无法恢复的问题,我们通常不会对数据做物理删除,即将数据从数据库中直接删除。而是多采用逻辑删除的方式,即不会真正在删除库删除数据,而是使用一个字段来标识它已经被删除。
如使用 isDeleted 字段标识该条记录是否已经被删除,0代表未删除,1代表已删除。此时对数据库做增删改查的SQL语句会发生如下变化:
插入:没有变化;
删除:转变为修改操作,即修改字段 isDeleted 为1;
修改:需要追加 where 子句,以排除 isDeleted 为1 的数据;
查询:需要追加 where 子句,以排除 isDeleted 为1 的数据。
例如:查询数据:select * from user WHERE isDeleted=0
删除数据:UPDATE user SET isDeleted=1 WHERE id=10 AND isDeleted=0
二、利用 MyBatis-plus 实现逻辑删除功能
1、创建数据库user表
CREATE TABLE `user` (
  `user_id` int(6) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `user_name` varchar(10) NOT NULL COMMENT '用户名',
  `user_password` varchar(510) NOT NULL DEFAULT '123' COMMENT '用户密码 密文',
  `auth` int(2) DEFAULT NULL COMMENT '用户权限 1、超级管理员;2、计划管理员;3、操作员;4、三方检测员',
  `nick_name` varchar(12) DEFAULT NULL COMMENT '昵称',
  `tel` varchar(11) DEFAULT NULL COMMENT '用户手机号',
  `is_delete` int(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除 0未删除1删除,默认0',
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT; 

2、修改配置文件 (在 yml 配置文件中,添加逻辑删除配置项 )
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  # 控制台打印sql语句
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  # 全局配置
  global-config:
    db_config:
      # 全局逻辑删除的字段名
      logic-delete-field: isDeleted
      # 逻辑已删除值
      logic-delete-value: 1
      # 逻辑未删除值
      logic-not-delete-value: 0 

3、创建实体类(并在实体类中使用注解 @TableLogic 进行修饰)
@Data
@TableName("user")
public class User extends Model<User> {
    @TableId(value = "user_id",type = IdType.AUTO)
    private Integer userId;
    private String userName;
    private String userPassword;
    private Integer auth;
    private String nickName;
    private String tel;
//    @TableLogic(value = "1",delval = "0")		//逻辑删除注解
    @TableLogic
    private int isDeleted;
} 
4、创建接口类

5、创建 controller 层

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    UserDao userDao;
    @PostMapping("/deleteUserById")
    public boolean deleteUserById(long id){
        //调用mybatis-plus提供的删除方法
        int result = userDao.deleteById(id);
        if (result>0){
            return true;
        }else {
            return false;
        }
    }
}
 
6、在 postman 中进行测试

当然不要写三层,觉得麻烦的话,直接在测试类中去写也可以,可以参考以下代码:
@SpringBootTest
public class LogDeleteTest {
    @Test
    public void testAddUser2(){
        User user = new User();
        user.setUserName("李世民");
        user.setUserPassword("12345");
        user.setNickName("唐太宗");
        boolean res = user.insert();
        System.out.println(res);
    }
    @Test
    public void testDeleteUserByID(){
        User user = new User();
        if(user.deleteById(2)){
            System.out.println("删除成功");
        }
        else{
            System.out.println("删除失败");
        }
    }
    @Test
    //执行全量记录的查询用例
    public void testSelectUserAll(){
        User user = new User();
        List<User> res = user.selectAll();
        res.forEach(System.out::println);
    }
} 

( 因为之前删除过了)
 
 
三、需要注意的地方
记得在启动类处加上
@MapperScan("XXXXXXXXXXXXXX") 



















