逻辑删除
只对自动注入的 sql 起效:(官方)
插入: 不作限制
查找: 追加 where 条件过滤掉已删除数据,且使用 wrapper.entity 生成的 where 条件会忽略该字段
更新: 追加 where 条件防止更新到已删除数据,且使用 wrapper.entity 生成的 where 条件会忽略该字段
删除: 转变为 更新
例如:
删除: update user set deleted=1 where id = 1 and deleted=0
查找: select id,name,deleted from user where deleted=0
逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。
Springboot使用:
添加依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.×</version> 这里使用3.4版本
</dependency>
配置数据源和逻辑删除
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai
username: root
password: 密码
driver-class-name: com.mysql.cj.jdbc.Driver #mysql8.0以上驱动
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag
logic-delete-value: 1 #1代表已删除
logic-not-delete-value: 0 #0源数据
实体类
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
/*
*insert 前自己 set 值
*可结合下方的自动填充
*/
@TableLogic //该注解表示使用逻辑删除
private Integer deleted;
}
测试类测试(mybati-plus提供的CRUD查询相关资料)
//插入数据
@Test
void test1(){
User user = new User();
user.setAge(24);
user.setName("汪巴旦");
user.setEmail("1434241@fsd.com");
System.out.println(userMapper.insert(user));
}
执行了逻辑删除后 配置的deleted字段变为了1 表示已经删除
@Test
void del(){
//逻辑删除
userMapper.deleteById(1);
}
再次查询该数据,为空!
@Test
void del(){
//逻辑删除
userMapper.deleteById(1);
System.out.println(userMapper.selectById(1)); //查询
}
自动填充
简单来说就是执行修改和插入的时候指定填充字段数据
在上方项目中继续测试
实现处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
@Component
public class MybatisMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
//配置插入时候指定字段要填充的数据
this.strictInsertFill(metaObject, "deleted", Integer.class, 0);
//(要填充数据库的字段名称,数据类型,要填充的数据)
}
@Override
public void updateFill(MetaObject metaObject) {
//注意区分
this.strictUpdateFill(metaObject, "deleted", Integer.class, 0);
//修改和插入类似 只是更新的时候要更改的字段和数据
}
}
在实体类中添加注解
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
@TableLogic //上方的逻辑删除注解
@TableField(fill = FieldFill.INSERT) //使用该注解 表示新增数据自动填充该字段
private Integer deleted;
}
测试插入
@Test
void test2(){
// 测试自动填充
User user = new User();
user.setAge(18);
user.setName("页皆依");
user.setEmail("3432@11.com");
System.out.println(userMapper.insert(user));
// user.setDeleted()会自动填充0
}
插入数据后,配置器配置自动填充字段 0
本文含有隐藏内容,请 开通VIP 后查看