物理删除 :真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据。
逻辑删除 :假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧看到此条记录。
根据id删除记录(物理删除)
@Test
void testDeleteDemo1() {
int i = userMapper.deleteById(5L);
System.out.println(i);
}
批量删除(物理删除)
@Test
void testDeleteDemo2() {
int i = userMapper.deleteBatchIds(Arrays.asList(2, 3, 4));
System.out.println(i);
}
简单条件查询删除(物理删除)
@Test
public void testDeleteByMap() {
HashMap<String, Object> map = new HashMap<>();
map.put("name", "Helen");
map.put("age", 18);
int result = userMapper.deleteByMap(map);
System.out.println(result);
}
逻辑删除
具体步骤
- 在数据库相应的表中添加deleted字段,设置默认值为0;
- 实体类添加deleted字段,并加上@TableLogic注解;
- 在application.properties中加入配置;
- 在配置类中加入逻辑删除插件;
具体实现
在MyBatis-Plus入门案例基础上进行修改。
在数据库相应的表中添加deleted字段,设置默认值为0;
实体类添加deleted字段,并加上@TableLogic注解;
package com.example.mybatis_plus_demo.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.util.Date;
@Data
public class User {
//@TableId(type = IdType.ID_WORKER) mp自带策略,生成19位值,数字类型使用这种策略,比如long
//@TableId(type = IdType.ID_WORKER_STR) mp自带策略,生成19位值,字符串类型使用这种策略
//@TableId(type = IdType.INPUT) 设置id值
//@TableId(type = IdType.UUID) 随机唯一值
@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;
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
@TableLogic
private Integer deleted;
}
在application.properties中加入配置;
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
spring.datasource.password=1234
spring.datasource.username=root
# 配置sql输出日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#配置逻辑删除标识
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
在配置类中加入逻辑删除插件;
package com.example.mybatis_plus_demo.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;
@MapperScan("com.example.mybatis_plus_demo.mapper")
@Configuration
public class MybatisPlusConfig {
//乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
//分页插件
@Bean
public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); }
//逻辑删除插件
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
}
测试
// 删除操作 物理删除/逻辑删除
@Test
void testDeleteDemo1() {
int i = userMapper.deleteById(5L);
System.out.println(i);
}
之后再次查询无法查询id为5的记录,但在数据库中这条记录仍然存在: