前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot 集成 MybatisPlus 九——逻辑删除

SpringBoot 集成 MybatisPlus 九——逻辑删除

原创
作者头像
用户8100582
发布2023-11-10 22:19:46
6160
发布2023-11-10 22:19:46
举报
文章被收录于专栏:Java多线程Java多线程

1 逻辑删除的概念

逻辑删除不会在数据库中删除数据,只是通过一个字段用来标识被删除的记录,数据仍然保存在数据库中。

在实际的工作当中,因为数据非常重要,为了防止因用户误操作删除数据后无法恢复的问题,我们通常不会对数据做物理删除,即将数据从数据库中直接删除。而是多采用逻辑删除的方式,即不会真正在删除库删除数据,而是使用一个字段来标识它已经被删除。

如使用 isDeleted 字段标识该条记录是否已经被删除,0代表未删除,1代表已删除。此时对数据库做增删改查的SQL语句会发生如下变化:

• 插入:没有变化;

• 删除:转变为修改操作,即修改字段 isDeleted 为1;

• 修改:需要追加 where 子句,以排除 isDeleted 为1 的数据;

• 查询:需要追加 where 子句,以排除 isDeleted 为1 的数据。

例如:

查询数据:select * from user WHERE isDeleted=0

删除数据:UPDATE user SET isDeleted=1 WHERE id=10 AND isDeleted=0

2 逻辑删除的应用

2.1 修改数据表

在数据表中增加一个字段 isDeleted,并设置为数值型,默认值为0。

2.2 修改配置文件

在程序的配置文件中,添加逻辑删除配置项

代码语言:# mybatis配置信息
复制
mybatis-plus:
  # 打印SQL语句
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  # 全局配置
  global-config:
    db_config:
      # 全局逻辑删除的字段名
      logic-delete-field: isDeleted
      # 逻辑已删除值
      logic-delete-value: 1
      # 逻辑未删除值
      logic-not-delete-value: 0 

2.3 修改实体类

在实体类中增加 isDeleted 属性并使用注解 @TableLogic 进行修饰。

在程序中还使用了 @TableField(value = "isDeleted"),因为字段名为驼峰命令,如果不指定列名,MybatisPlus会将列名自动识别为 is_deleted,这样就会导致与我们在数据库中设置的列名不匹配。

2.4 执行增删改查

2.4.1 增加

数据插入的操作不会受到影响

代码语言:txt
复制
@Test
public void testAddUser2(){
    User user = new User();
    user.setUsername("李世民");
    user.setGendar("男");
    user.setRemark("唐太宗");
    boolean res = user.insert();
    System.out.println(res);
}

==> Preparing: INSERT INTO user ( username, gendar, remark, version, isDeleted ) VALUES ( ?, ?, ?, ?, ? )

==> Parameters: 李世民(String), 男(String), 唐太宗(String), 0(Integer), 0(Integer)

<== Updates: 1

2.4.2 删除

删除数据时,我们并不需要直接去修改逻辑删除标识字段,MybatisPlus 会为我们在SQL语句后自动设置。

代码语言:txt
复制
@Test
public void testDeleteUserByID(){
    User user = new User();
    boolean res = user.deleteById(7);
    System.out.println(res);
}

在控制台的输出中,可以看到删除记录的SQL变为了 UPDATE,同时在SQL语句末尾,自动加上了 isDeleted=0 的内容。

==> Preparing: UPDATE user SET isDeleted=1 WHERE id=? AND isDeleted=0

==> Parameters: 7(Integer)

<== Updates: 1

2.4.3 修改

执行原先的修改用例

代码语言:txt
复制
@Test
public void testUpdateUserByID(){
    User user = new User();
    user.setRemark("1唐宗宋祖");
    user.setId(22);
    boolean res = user.updateById();
    System.out.println(res);
}

在SQL语句末尾,也同样自动加上了 isDeleted=0 的内容。

==> Preparing: UPDATE user SET remark=?, version=? WHERE id=? AND version=? AND isDeleted=0

==> Parameters: 1唐宗宋祖(String), 1(Integer), 22(Integer), 0(Integer)

<== Updates: 1

2.4.4 查询

执行全量记录的查询用例

代码语言:txt
复制
@Test
public void testSelectUserAll(){
    User user = new User();
    List<User> res = user.selectAll();
    res.forEach(System.out::println);
}

在SQL语句末尾,同样自动加上了 isDeleted=0 的内容。

==> Preparing: SELECT id,username,gendar,remark,version,isDeleted FROM user WHERE isDeleted=0

==> Parameters:

<== Columns: id, username, gendar, remark, version, isDeleted

<== Row: 8, 李磊, 男, 美术老师, 0, 0

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 逻辑删除的概念
  • 2 逻辑删除的应用
    • 2.1 修改数据表
      • 2.2 修改配置文件
        • 2.3 修改实体类
          • 2.4 执行增删改查
            • 2.4.1 增加
            • 2.4.2 删除
            • 2.4.3 修改
            • 2.4.4 查询
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档