首先看一下数据库中表的数据:
物理删除:
真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据
1、根据 ID 删除记录
//根据ID删除记录(物理删除)
@Test
public void testDeleteById(){
int result = userMapper.deleteById(1L);
System.out.println(result);
}
运行,看数据库中 user 表中 id 为 1 的数据是否被删除
2、批量删除
//批量删除(物理删除)
@Test
public void testDeleteBatchIds() {
int result = userMapper.deleteBatchIds(Arrays.asList(2,3));
System.out.println(result);
}
运行,看数据库中 user 表中 id 为 2和3 的数据是否被删除
逻辑删除:
假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
1、向表中添加逻辑删除的字段
ALTER TABLE `user` ADD COLUMN `deleted` boolean
此时表结构为:
2、向对应的实体类中添加 deleted 属性,并且在该属性上添加 @TableLogic 注解
//deleted
@TableLogic//用于逻辑删除
@TableField(fill = FieldFill.INSERT)//添加这个注解是为了在后面设置初始值,不加也可以
private Integer deleted;
3、元对象处理器接口添加 deleted 的 insert 默认值
package cn.henu.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component//注意在这个类上加@Component注解,或者@Service或者@Repository表示将这个类交给Spring进行管理
public class MyMetaObjectHandler implements MetaObjectHandler {
//使用mp实现添加的操作,这个方法就会执行
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
//设置版本号version的初始值为1
//不加这个也可以,version的默认值为null,加了就是设置version的值从1开始
this.setFieldValByName("version",1,metaObject);
//添加deleted的初始值为0,也就是默认值
this.setFieldValByName("deleted", 0, metaObject);
}
//使用mp实现修改的操作,这个方法就会执行
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
4、配置逻辑删除插件
package cn.henu.config;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration//表示将这个类作为配置类
//@MapperScan("cn.henu.mapper"):在启动时扫描Mapper接口,找到里面的内容
@MapperScan("cn.henu.mapper")
public class MpConfig {
//乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
//分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
//逻辑删除插件
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
}
5、在 application.properties 中添加一个配置(如果删除为1,不删除为0,这一步就可以不用配置)
#该配置表示删除时为1,不删除时为0
#也可以不配置这两行,因为默认就是删除为1,不删除为0
#如果设置删除为111,不删除为000等配置时,就要加上这两行配置
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
6、先添加一条数据,看其 deleted 字段的值是否为 0
@Test
void addUser3(){
User user = new User();
user.setName("tainqi");
user.setAge(20);
user.setEmail("tianqi@qq.com");
int insert = userMapper.insert(user);
System.out.println("insert:"+insert);
}
7、运行,可以看到数据库中新添加的数据的 deleted 字段的值为 0(将其他数据的deleted字段手动设置为0,标志为未删除状态)
8、使用上面物理删除的代码执行一下,将刚刚添加的数据删除
//根据ID删除记录(物理删除)
@Test
public void testDeleteById(){
int result = userMapper.deleteById(1347539342478635010L);
System.out.println(result);
}
9、运行,可以看到,虽然使用的是物理删除的代码,但是数据库中 id 为 1347539342478635010 的记录还存在,只是其 deleted 字段的值由 0 变为了 1,也就是由未删除状态变为删除状态。
10、再执行查询语句,看刚刚逻辑删除的数据能不能被查询出来
//查询User表所有数据
@Test
void findAll() {
List<User> users = userMapper.selectList(null);
System.out.println(users);
}
运行,看控制台的打印情况:
可以看到刚刚逻辑删除的那条数据已经查询不到了,但是它并没有真的被删除,只是其 deleted 字段的值由0变为了1
如果想要查询那条被逻辑删除的数据,就需要自己手动编写SQL语句查询,MybatisPlus没有实现这个查询功能。