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