Mybatis-plus逻辑删除和自动填充

发布于:2022-08-04 ⋅ 阅读:(359) ⋅ 点赞:(0)

逻辑删除

只对自动注入的 sql 起效:(官方)

插入: 不作限制
查找: 追加 where 条件过滤掉已删除数据,且使用 wrapper.entity 生成的 where 条件会忽略该字段
更新: 追加 where 条件防止更新到已删除数据,且使用 wrapper.entity 生成的 where 条件会忽略该字段
删除: 转变为 更新
例如:
删除: update user set deleted=1 where id = 1 and deleted=0
查找: select id,name,deleted from user where deleted=0
逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。

Springboot使用:

添加依赖

<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.×</version>  这里使用3.4版本
        </dependency>

配置数据源和逻辑删除

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai
    username: root
    password: 密码
    driver-class-name: com.mysql.cj.jdbc.Driver  #mysql8.0以上驱动
mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: flag
      logic-delete-value: 1 #1代表已删除
      logic-not-delete-value: 0  #0源数据

实体类

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;

    /*
    *insert 前自己 set 值 
    *可结合下方的自动填充 
    */
    @TableLogic  //该注解表示使用逻辑删除
    private Integer deleted; 
}

测试类测试(mybati-plus提供的CRUD查询相关资料)

//插入数据
    @Test
    void test1(){
        User user = new User();
        user.setAge(24);
        user.setName("汪巴旦");
        user.setEmail("1434241@fsd.com");
        System.out.println(userMapper.insert(user));
    }

在这里插入图片描述

执行了逻辑删除后 配置的deleted字段变为了1 表示已经删除

    @Test
    void del(){
        //逻辑删除
        userMapper.deleteById(1);
    }

在这里插入图片描述

再次查询该数据,为空!

    @Test
    void del(){
        //逻辑删除
        userMapper.deleteById(1);
        System.out.println(userMapper.selectById(1)); //查询
        
    }

在这里插入图片描述

自动填充

简单来说就是执行修改和插入的时候指定填充字段数据

在上方项目中继续测试

实现处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler

@Component
public class MybatisMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        //配置插入时候指定字段要填充的数据
        this.strictInsertFill(metaObject, "deleted", Integer.class, 0);
                                   //(要填充数据库的字段名称,数据类型,要填充的数据)
    }

    @Override
    public void updateFill(MetaObject metaObject) {
              //注意区分
        this.strictUpdateFill(metaObject, "deleted", Integer.class, 0);
        //修改和插入类似 只是更新的时候要更改的字段和数据
    }
}

在实体类中添加注解

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @TableLogic //上方的逻辑删除注解
    @TableField(fill = FieldFill.INSERT)  //使用该注解 表示新增数据自动填充该字段
    private Integer deleted;
}

测试插入

   @Test
    void test2(){
//        测试自动填充
        User user = new User();
        user.setAge(18);
        user.setName("页皆依");
        user.setEmail("3432@11.com");
        System.out.println(userMapper.insert(user));
        // user.setDeleted()会自动填充0
    }

插入数据后,配置器配置自动填充字段 0

在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到