SpringBoot 结合 MyBatis-plus 进行逻辑删除

一 、逻辑删除的概念


        逻辑删除不会在数据库中删除数据,只是通过一个字段用来标识被删除的记录,数据仍然保存在数据库中。在实际的工作当中,因为数据非常重要,为了防止因用户误操作删除数据后无法恢复的问题,我们通常不会对数据做物理删除,即将数据从数据库中直接删除。而是多采用逻辑删除的方式,即不会真正在删除库删除数据,而是使用一个字段来标识它已经被删除。

        如使用 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;

SpringBoot 结合 MyBatis-plus 进行逻辑删除_第1张图片

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

SpringBoot 结合 MyBatis-plus 进行逻辑删除_第2张图片

3、创建实体类(并在实体类中使用注解 @TableLogic 进行修饰)

@Data
@TableName("user")
public class User extends Model {
    @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、创建接口类

SpringBoot 结合 MyBatis-plus 进行逻辑删除_第3张图片

5、创建 controller 层 

SpringBoot 结合 MyBatis-plus 进行逻辑删除_第4张图片

@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 中进行测试

SpringBoot 结合 MyBatis-plus 进行逻辑删除_第5张图片

当然不要写三层,觉得麻烦的话,直接在测试类中去写也可以,可以参考以下代码:

@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 res = user.selectAll();
        res.forEach(System.out::println);
    }
}

SpringBoot 结合 MyBatis-plus 进行逻辑删除_第6张图片

SpringBoot 结合 MyBatis-plus 进行逻辑删除_第7张图片( 因为之前删除过了)

SpringBoot 结合 MyBatis-plus 进行逻辑删除_第8张图片 SpringBoot 结合 MyBatis-plus 进行逻辑删除_第9张图片 

 三、需要注意的地方

记得在启动类处加上 

@MapperScan("XXXXXXXXXXXXXX")

SpringBoot 结合 MyBatis-plus 进行逻辑删除_第10张图片

 

你可能感兴趣的:(数据库,spring,boot,后端)