MybatisPlus中的删除和逻辑删除及区别介绍

删除又分为逻辑删除和物理删除,那么它们有什么区别呢?
物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据。
逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。
在我们日常开发中,为了保留数据,经常会使用逻辑删除的方式进行数据删除,下面我们就来看看物理删除与逻辑删除怎么实现的吧
首先假设我有这样一张表

实体类:

package com.atguigu.mybatis_plus.entity;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;
@Data
public class User {
  @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.UPDATE)
  @TableField(fill = FieldFill.INSERT_UPDATE)
  private Date updateTime;

}

userMapper接口:

package com.atguigu.mybatis_plus.mapper;
import com.atguigu.mybatis_plus.entity.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
// 继承BaseMapper后UserMapper就具有了CRUD功能
public interface UserMapper extends BaseMapper<User>{
}

一、物理删除

1、根据id删除记录

@Test
  public void testLogicDelete() {
    int count = userMapper.deleteById(1L); // 删除id为1的数据
    System.out.println("受影响的行数"+count);
  }

2、批量删除

@Test
public void testDeleteBatchIds() {
  int result = userMapper.deleteBatchIds(Arrays.asList(2, 3, 4)); // 删除id为2,3,4的数据
  System.out.println(result);
}

结果:

物理删除比较简单,接下来我们看看逻辑删除怎么实现吧!

二、逻辑删除

(1)数据库修改,添加 deleted字段

(2)实体类修改,添加deleted 字段,并加上 @TableLogic 注解

/*
  加@TableLogic的情况下,程序内部会将delete语句变为update语句
  实际上我们写的代码并不需要做出什么改变
  */
  @TableLogic
  private Integer deleted;

(3)测试

	/**
   * 逻辑删除
   */
  @Test
  public void testLogicDelete() {
    int count = userMapper.deleteById(5L);
    System.out.println("受影响的行数"+count);
  }

结果:


  • 测试后发现,数据并没有被删除,deleted字段的值由0变成了1
  • 测试后分析打印的sql语句,是一条update
  • 注意:被删除前,数据的deleted 字段的值必须是 0,才能被选取出来执行逻辑删除的操作

(5)测试逻辑删除后的查询,MyBatis Plus中查询操作也会自动添加逻辑删除字段的判断

@Test
  public void testSelect() {
    List<User> users = userMapper.selectList(null); // 查询所有记录
    users.forEach(System.out::println); // 遍历输出
  }

结果:

总结

到此这篇关于MybatisPlus中的删除和逻辑删除及区别介绍的文章就介绍到这了,更多相关MybatisPlus删除和逻辑删除内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mybatis-plus getOne和逻辑删除问题详解

    1.getOne 如果查询出的结果有多个,这时候会抛异常 这样就不用每次getOne的Wrapper后面还跟last("limit 1") 2.@TableLogic 就不用每次list查询的时候跟上 .eq("deleted",false)了 PS:下面再次强调下Mybatis-Plus中的逻辑删除 1. 需要在删除的字段上添加注解@TableLogic 2. 在配置文件中写上配置 mybatis-plus: global-config: db-config: l

  • MyBatisPlus中使用or()和and()遇到的问题

    在项目中使用MyBatisPlus中的or()查询时由于误用,导致查询数据不对,仅作记录. 写法一: LambdaQueryWrapper<Task> queryWrapper = new QueryWrapper<Task>().lambda(); queryWrapper .eq(Task::getUserId, "15") .eq(Task::getStatus, 2) .or() .eq(Task::getFileSize, 3251544304L);

  • Mybatis-Plus通用枚举的使用详解

    解决了繁琐的配置,让 mybatis 优雅的使用枚举属性! 修改表结构 ALTER TABLE `tb_user` ADD COLUMN `sex` INT ( 1 ) NULL DEFAULT 1 COMMENT '1-男,2-女' AFTER `deleted`; 定义枚举 public enum SexEnum implements IEnum<Integer> { MAN(1, "男"), WOMAN(2, "女"); private int v

  • mybatis-plus 表名添加前缀的实现方法

    1.使用mybatis-plus自身的查询构造去,只需要在全局配置中添加如下配置 mybatis-plus: mapper-locations: classpath:mappers/*Mapper.xml # mapper映射文件 global-config: db-config: table-prefix: tr_ 2.自定义sql语句中添加表名前缀 在yml文件中添加如下配置 mybatis-plus: mapper-locations: classpath:mappers/*Mapper.

  • MybatisPlus中的删除和逻辑删除及区别介绍

    删除又分为逻辑删除和物理删除,那么它们有什么区别呢? 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据. 逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为"被删除状态",之后在数据库中仍旧能看到此条数据记录. 在我们日常开发中,为了保留数据,经常会使用逻辑删除的方式进行数据删除,下面我们就来看看物理删除与逻辑删除怎么实现的吧 首先假设我有这样一张表 实体类: package com.atguigu.mybatis_plus.entity; import

  • mybatis-plus 通用字段自动化(如逻辑删除和更新时间等)

    一般来说某些项目比较规范的情况下,大多数表都会有逻辑删除字段和通用字段,例如更新时间,创建时间,更新人,创建人等等,但是在代码开发上会产生很多冗余的代码,逻辑删除的话,自己写比较繁琐,而且容易有遗漏逻辑. 本来打算自己写切面去实现,偶然发现mybatis-plus已经帮封装实现了,试了一下,很好用,所以分享一下. 逻辑删除 逻辑删除的意思就是某些业务表,在用户删除某条数据的时候,不真正删除,而是将此数据某字段改成类似"已删除",而查询语句.更新语句等会忽略此条被逻辑删除的数据. 这里就

  • MyBatis-Plus的物理删除和逻辑删除(使用场景)

    物理删除:真实删除,将数据从数据库中删除,删除后查询不到被删除的数据 逻辑删除:假删除,方便删除之后的数据恢复 在表中添加一个status字段,作为删除的标准,每次删除时,修改标志位,0代表没有删除,1代表删除 被删除记录的status字段被修改为"被删除状态"(1),删除后还可以查询到数据 逻辑删除的使用场景 1.需要进行数据恢复 2.有关联数据,不便删除 # mysql //测试逻辑删除 status int null default null # 实体类 //实现逻辑删除 @Ta

  • 正则表达式中test、exec、match的区别介绍及括号的用法

    test.exec.match的简单区别 1.test test 返回 Boolean,查找对应的字符串中是否存在模式. var str = "1a1b1c"; var reg = new RegExp("1.", ""); alert(reg.test(str)); // true 2.exec exec 查找并返回当前的匹配结果,并以数组的形式返回. var str = "1a1b1c"; var reg = new Re

  • MySQL中in与exists的使用及区别介绍

    先放一段代码 for(int i=0;i<1000;i++){ for(int j=0;j<5;j++){ System.out.println("hello"); } } for(int i=0;i<5;i++){ for(int j=0;j<1000;j++){ System.out.println("hello"); } } 分析以上代码可以看到两行代码除了循环的次序不一致意外,其他并无区别,在实际执行时两者所消耗的时间和空间应该也是一

  • python requests包的request()函数中的参数-params和data的区别介绍

    如下所示: import requests url='http://www.baidu.com' #下面使用requests.request(method, url, **kwargs) re=requests.request('GET',url) 经验证,可用. 我们试着传入一个字典,首先用params参数. 结果为: 亮点在url和args. 我们还用get方法,把dic这个字典传给data试试看. 亮点还是在args和url.惊喜地发现,dic这个字典没传进去. 这是因为: params是

  • C++中两种字符串定义方式和区别介绍

    目录 前言 概念 定义方式 计算机的存储方式 总结 前言 在学习字符串这方面的内容时,发现字符串定义的两种方式虽然内容相同但还是有细微的区别 概念 字符串就是一串用双引号连接起来的字符串字面值,简称为字符串 定义方式 上代码 char acter1[]="Hello world";//第一种定义方式 char acter2[]={'H','e','l','l','o','w','o','r','l','d'}; 第二种定义方式 此时并不能看出这两种定义方式的区别,拿到VS调试器看看 很

  • Angular.js中ng-if、ng-show和ng-hide的区别介绍

    前言 大家都知道在使用anularjs开发前端页面时,常常使用ng-show.ng-hide.ng-if功能来控制页面元素的显示或隐藏,那他们之间有什么不同呢?下面通过这篇文章来一起看看吧. 实现原理 ng-show/ng-hide是通过修改CSS样式方式控制元素显示与隐藏,对应的DOM元素会一直存在于当前页面中,而ng-if根据表达式的值动态的在当前的页面中添加删除页面元素.如果赋值表达式的值为false,那么这个元素就会从页面中删除,否则会添加一个元素.ng-if创建元素时用的是被它编译后的

  • PHP中数字检测is_numeric与ctype_digit的区别介绍

    is_numeric:检测是否为数字字符串,可为负数和小数 ctype_digit:检测字符串中的字符是否都是数字,负数和小数会检测不通过 注意,参数一定要是字符串,如果不是字符串,则会返回0/FASLE 下面是测试例子: 复制代码 代码如下: $a = 0001111222 ; var_dump($a); var_dump(is_numeric($a)); //true var_dump(ctype_digit($a)); //true $a = 0.1 ; var_dump($a); var

  • PHP中new static() 和 new self() 的区别介绍

    长夜漫漫啊! 今天领导本地搭建一个站.发现用PHP 5.2 搭建不起来,站PHP代码里面有很多5.3以上的部分,领导让苦逼我更改在5.2下能运行. 改着改着发现了一个地方 复制代码 代码如下: return new static($val); 这尼玛是神马,只见过 复制代码 代码如下: return new self($val); 于是上网查了下,他们两个的区别. self – 就是这个类,是代码段里面的这个类. static – PHP 5.3加进来的只得是当前这个类,有点像$this的意思,

随机推荐