MyBatis-Plus 逻辑删除
准备数据:MySQL-User 数据表信息
id | name | age | create_time | update_time | |
---|---|---|---|---|---|
1 | Jone | 18 | test1@baomidou.com | 2022-02-22 08:56:15 | 2022-02-01 08:56:20 |
2 | Jack | 20 | test2@baomidou.com | 2022-02-16 09:00:44 | 2022-02-17 09:00:48 |
3 | Tom | 28 | test3@baomidou.com | 2022-02-10 09:00:52 | 2022-02-19 09:00:57 |
4 | Sandy | 21 | test4@baomidou.com | 2022-02-14 09:01:02 | 2022-02-21 09:01:06 |
5 | Billie | 24 | test5@baomidou.com | 2022-02-09 09:01:13 | 2022-02-18 09:01:19 |
6 | YCloud | 22 | test6@baomidou.com | 2022-02-22 09:02:19 | 2022-02-22 09:02:23 |
7 | TrainingL | 23 | test7@baomidou.com | 2022-02-01 09:02:57 | 2022-02-10 09:03:01 |
8 | Demo | 22 | test8@baomidou.com | 2022-02-04 09:03:24 | 2022-02-14 09:03:28 |
9 | Geoffrey | 30 | test9@baomidou.com | 2022-01-12 09:04:30 | 2022-02-10 09:04:34 |
10 | George | 27 | test10@baomidou.com | 2022-02-09 09:05:09 | 2022-02-12 09:05:12 |
11 | William | 42 | test11@baomidou.com | 2022-02-22 09:05:45 | 2022-02-22 09:05:47 |
12 | Glen | 30 | test12@baomidou.com | 2022-02-08 09:07:03 | 2022-02-28 09:07:06 |
1、MyBatis-Plus 删除操作
根据主键 id 删除记录(唯一性):int deleteById(Serializable id)
//测试删除
@Test
public void testDeleteById(){
//根据主键id删除记录
int res = userMapper.deleteById(12L);
System.out.println(res); //影响的行数
}
通过 id 集合批量删除数据记录:int deleteBatchIds(Collection asList)
//测试id批量删除
@Test
public void testDeleteBatchId(){
List<Integer> asList = Arrays.asList(9, 10, 11);
//传递一个集合参数
int i = userMapper.deleteBatchIds(asList);
//打印受影响的行数
System.out.println(i);
}
通过 map 字典条件删除数据:int deleteByMap(map)
//通过map条件删除
@Test
public void testDeleteMap(){
HashMap<String, Object> map = new HashMap<>();
map.put("name", "Demo");
map.put("age", 22);
int i = userMapper.deleteByMap(map);
System.out.println(i);
}
2、逻辑删除(如何实现?)
我们在实际项目开发中,并不会真正将数据库的某一条数据删除,而是采用一个逻辑字段,将想要删除的数据进行标记隐藏,这种删除方式被称为逻辑删除。
- 逻辑删除:直接将数据库中的数据记录移除;
- 逻辑删除:记录在数据库中的实际上并没有被删除,而是通过一个变量(deleted)来标记数据失效,使用户不再可以被访问;
逻辑删除的数据可以在后台被系统管理员查看,目的是为了防止数据丢失,类似于计算机的回收站。
1、在数据表中增加一个 deleted
字段;
注:设置 deleted 为 int 类型,长度为1,且默认值为 0.
2、在实体类中增加逻辑删除字段;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String name;
private Integer age;
private String email;
//逻辑删除
@TableLogic
private Integer deleted;
//字段添加填充内容
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
3、配置逻辑删除的组件;
//配置删除组件
@Bean
public ISqlInjector sqlInjector(){
return new LogicSqlInjector();
}
如果 IDEA 提示 【Cannot resolve symbol ‘LogicSqlInjector’】,原因是 MyBatis-Plus 的版本太高,高版本则不用再配置该插件了,即上述 Java 代码无需编写,跳过这一步。参考来源
4、在 application.yml
配置文件中添加配置项;
mybatis-plus:
# 配置日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 配置逻辑删除
global-config:
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
5、编写测试代码;
//通过deleteById删除id=1的数据
@Test
public void testLogicDelete(){
int i = userMapper.deleteById(1L);
System.out.println(i);
}
可以发现后台走的是更新操作,而不是删除操作,这条记录依旧在数据库中,但是其 deleted
字段的值已经发生变化了。
那么我们接着去查询这条记录,观察是否会查到这条记录呢?
@Test
public void testSelectById(){
//通过主键id查询记录
User user = userMapper.selectById(1L);
System.out.println(user);
}
可以发现查询时会增加条件 deleted=0
,且刚才删除的 id=1L
的数据并没有被查到。 至此介绍完了 MyBatis-Plus 逻辑删除的实现。