首页 > 其他分享 >SpringBoot 集成 MybatisPlus 九——逻辑删除

SpringBoot 集成 MybatisPlus 九——逻辑删除

时间:2023-04-14 23:36:39浏览次数:48  
标签:集成 MybatisPlus SpringBoot 删除 res user SQL isDeleted User

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。

SpringBoot 集成 MybatisPlus 九——逻辑删除_数据

SpringBoot 集成 MybatisPlus 九——逻辑删除_User_02

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,这样就会导致与我们在数据库中设置的列名不匹配。

SpringBoot 集成 MybatisPlus 九——逻辑删除_数据_03

2.4 执行增删改查

2.4.1 增加

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

@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语句后自动设置。

@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 修改

执行原先的修改用例

@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 查询

执行全量记录的查询用例

@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


标签:集成,MybatisPlus,SpringBoot,删除,res,user,SQL,isDeleted,User
From: https://blog.51cto.com/u_113754/6191131

相关文章

  • SpringBoot常用注解
    本文整理了SpringBoot常用注解,主要讲解这些注解的用法,并附上一致思维导图。SpringBoot常用注解组件相关注解@Controller用于修饰MVC中controller层的组件,SpringBoot中的组件扫描功能会识别到该注解,并为修饰的类实例化对象,通常与@RequestMapping联用,当SpringMVC获取到请求时......
  • 未来源码|什么是数据集成?超全的SeaTunnel 集成工具介绍
    以下文章来源于大数据与云原生技术分享,作者liugp推荐语:随着互联网流量爆发式增长,越来越多的公司业务需要支撑海量数据存储,对高并发、高可用、高可扩展性等特性提出了更高的要求。这也促使各种类型的数据库快速发展,至今常见数据库已经达到200多个。与之相伴的便是,各种数据库之间......
  • SpringBoot 整合 MongoDB
    SpringBoot整合MongoDB好久没搞SpringBoot相关的东西勒,但最近看的代码涉及到了这部分,虽然之前没做过也能看懂,但还是从基础开始搞起比较好。准备工作SpringBoot项目创建这个本来都不用说的,SpringBoot创建项目还能不会啊,但因为某些限制,现在用不了专业版IDEA,只能用社区版,......
  • springboot打成jar包resources下文件的获取
    importorg.apache.poi.util.IOUtils;importorg.springframework.boot.system.ApplicationHome;importorg.springframework.core.io.ClassPathResource;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream......
  • Springboot集成MongoDB存储文件、读取文件
    一、前言和开发环境及配置可以转载,但请注明出处。  之前自己写的SpringBoot整合MongoDB的聚合查询操作,感兴趣的可以点击查阅。https://www.cnblogs.com/zaoyu/p/springboot-mongodb.html 使用mongodb存储文件并实现读取,通过springboot集成mongodb操作。 可以有两种实现......
  • springboot-web-mybatis
    Restful开发规范Restful是网络应用接口程序的接口设计风格,基于HTTP协议GET:查询POST:新增PUT:修改DELETE:删除Restful是一种风格,可以不遵守如何为请求参数设置默认值可以在Service层判断是否为null,如果为true则给它赋值默认值可以在Controller层参数列表添加@RequstPa......
  • Java SpringBoot 中,动态执行 bean 对象中的方法
    根据不同的条件,调用不同的bean对象,执行对象中的方法SpringUtils工具类packagecom.vipsoft.web.utils;importcn.hutool.core.util.ArrayUtil;importorg.springframework.aop.framework.AopContext;importorg.springframework.beans.BeansException;importorg.sprin......
  • FFmpeg 编译集成至android
    FFmpeg编译问题记录1.此前没有编译大型的C项目的场景,甚至对整个编译过程已经陌生了,重拾编译之路,以前的编译都是开IDE去操作,现在需要使用编译工具链去编译整套项目,所以需要了解CMake,configure等工具的使用。2.简单学习configure,cmake等构建工具后,开始编译Cmake学习记录3.ffmp......
  • melange+ apko 基于的alpine docker 镜像集成玩法
    主要是一个集成,同时可以提供方便的alpineapk包管理以及维护参考集成  备注:以上中使用git进行配置管理,使用melange进行apk包的构建,同时可以结合s3将数据存储到s3中,如果构建基于alpine镜像的可以直接使用构建的私服,同时也可以结合apko进行oci镜像构建,也比较高效......
  • SpringBoot 集成 MybatisPlus 八——插件
    1Mybatis插件机制Mybatis插件是对Executor、StatementHandler、ParameterHandler、ResultSetHandler这四个接口上的方法进行拦截,利用JDK动态代理机制,为这些接口的实现类创建代理对象,在执行方法时,先去执行代理对象的方法,从而执行自己编写的拦截逻辑。ExecutorMyBatis的内部执行器......