MyBatis-Plus 逻辑删除

MyBatis-Plus 逻辑删除

准备数据:MySQL-User 数据表信息

idnameageemailcreate_timeupdate_time
1Jone18test1@baomidou.com2022-02-22 08:56:152022-02-01 08:56:20
2Jack20test2@baomidou.com2022-02-16 09:00:442022-02-17 09:00:48
3Tom28test3@baomidou.com2022-02-10 09:00:522022-02-19 09:00:57
4Sandy21test4@baomidou.com2022-02-14 09:01:022022-02-21 09:01:06
5Billie24test5@baomidou.com2022-02-09 09:01:132022-02-18 09:01:19
6YCloud22test6@baomidou.com2022-02-22 09:02:192022-02-22 09:02:23
7TrainingL23test7@baomidou.com2022-02-01 09:02:572022-02-10 09:03:01
8Demo22test8@baomidou.com2022-02-04 09:03:242022-02-14 09:03:28
9Geoffrey30test9@baomidou.com2022-01-12 09:04:302022-02-10 09:04:34
10George27test10@baomidou.com2022-02-09 09:05:092022-02-12 09:05:12
11William42test11@baomidou.com2022-02-22 09:05:452022-02-22 09:05:47
12Glen30test12@baomidou.com2022-02-08 09:07:032022-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 逻辑删除的实现。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值