1.物理删除与逻辑删除 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据。 逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。
2.实现逻辑删除步骤
1)实体类添加deleted 字段 加上 @TableLogic 注解 和 @TableField(fill = FieldFill.INSERT) 注解
@Data
@Entity
public class Users {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //auto_increment类型
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;
}
2)元对象处理器接口添加deleted的insert默认值
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class);
@Override
public void insertFill(MetaObject metaObject) {
LOGGER.info("start insert fill ....");
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
this.setFieldValByName("deleted", 0, metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
LOGGER.info("start update fill ....");
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
3)在 MybatisPlusConfig 中注册 Bean. 新建config包,创建MpConfig配置类。
@Configuration
@MapperScan("com.simoniu.mpdemo.mapper")
public class MpConfig {
//逻辑删除插件
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
}
4)application.properties 加入配置 此为默认值,如果你的默认值和mp默认的一样,该配置可无。
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
5)配置控制台打印完整带参数SQL语句 为了方便测试,mybatis-plus配置控制台打印完整带参数SQL语句。
#mybatis日志,为了显示SQL语句
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
6)测试
//测试添加单个用户资料
@Test
public void testInsert() {
Users u = new Users();
u.setName("admin");
u.setEmail("admin@qq.com");
u.setAge(30);
int result = usersMapper.insert(u);
System.out.println("受影响的记录条数是:" + result);
System.out.println("新增记录的主键是:" + u.getId());
}
//测试根据ID删除
@Test
public void testDeleteById() {
int result = usersMapper.deleteById(2L);
System.out.println("受影响的记录条数是:" + result);
}
测试后发现,新增一条数据后deleted字段默认值为0。删除一条数据后, 数据并没有被物理删除,测试后分析打印的sql语句,删除是执行一条update语句,deleted字段的值由0变成了1。
mybatisplus 3.4.0版本后,对逻辑删除做了进一步精简配置。省略了注册删除插件。具体改变如下:
1.在application.yml中配置逻辑字段和默认值。
mybatis-plus:
global-config:
db-config:
#配置mybatisplus的逻辑删除功能
logic-delete-value: false #默认删除的值
logic-not-delete-value: true #默认未删除的值
logic-delete-field: flag #逻辑删除的字段名字
2.在实体类的逻辑删除字段上添加@TableLogic。
@TableLogic //表示是逻辑删除字段
@TableField(fill = FieldFill.INSERT)
protected boolean flag;