MybatisPlus-自动填充功能-逻辑删除-通用枚举

366 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情

自动填充功能

有些时候我们可能会有这样的需求,插入或者更新数据时,希望有些字段可以自动填充数据,比如密码、version等。在MP中提供了这样的功能,可以实现自动填充。

添加@TableField注解

@TableField(fill = FieldFill.INSERT) //插入数据时进行填充 
private String password; 

为password添加自动填充功能,在新增数据时有效。

FieldFill提供了多种模式选择:

public enum FieldFill { 
/**
* 默认不处理 
*/ 
DEFAULT, 
/**
* 插入时填充字段 
*/ 
INSERT, 
/**
* 更新时填充字段 
*/ 
UPDATE, 
/**
* 插入和更新时填充字段 
*/ 
INSERT_UPDATE 
}

编写MyMetaObjectHandler

package com.wyh.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

/**
*  @description:  MP字段填充拦截器
*  @author:  魏一鹤
*  @createDate:  2022-09-07 21:54
**/

// 把配置文件加入到spring容器中
@Component
// 需要实现MetaObjectHandler接口并实现下面两个方法
public class MyMetaObjectHandler implements MetaObjectHandler {
    // 在插入数据的时候填充
@Override
    public void insertFill(MetaObject metaObject) {
        // 先获取到password的值进行判断
Object password = getFieldValByName( "password" , metaObject);
        // 如果为空就进行填充
 if(null==password){
            setFieldValByName( "password" , "888888" ,metaObject);
        }
        // 如果不为空就不做处理

}
    // 更新数据时填充
@Override
    public void updateFill(MetaObject metaObject) {

    }
}

测试

注意此时我们是没有给password赋值的 可以发现我们自动填充起效了

逻辑删除

开发系统时,有时候在实现功能时,删除操作需要实现逻辑删除,所谓逻辑删除就是将数据标记为删除,而并非真正 的物理删除(非DELETE操作),查询时需要携带状态条件,确保被标记的数据不被查询到。这样做的目的就是避免数据被真正的删除。

当然我们可以手动写update去修改状态,这样有些麻烦

MP就提供了这样的功能,方便我们使用,接下来我们一起学习下。

修改表结构

为tb_user表增加deleted字段,用于表示数据是否被删除,1代表删除,0代表未删除。

ALTER TABLE `tb_user` ADD COLUMN `deleted` int(1) NULL DEFAULT 0 COMMENT '1代表删除,0代表未删除' AFTER `version`; 

同时,也修改User实体,增加deleted属性并且添加@TableLogic注解:

@TableLogic 
private Integer deleted; 

我们这里最后一条数据状态为1 也就是说被删除了

配置

application.properties:

# 逻辑已删除值(默认为 1) 
mybatis-plus.global-config.db-config.logic-delete-value=1 
# 逻辑未删除值(默认为 0) 
mybatis-plus.global-config.db-config.logic-not-delete-value=0 

测试

可以发现确实把删除的操作改为修改了

UPDATE tb_user SET deleted=1 WHERE id=12 AND deleted=0 

但是查询的时候如何不查询出来删除的数据呢?

我们测试下查询方法

发现自动帮我们追加了查询条件 也就是只查询出状态正常的数据

SELECT id,user_name,password,name,age,email,deleted FROM tb_user WHERE id=12 AND deleted=0 

通用枚举

它解决了繁琐的配置,可以让mybatis 优雅的使用枚举属性!

它不仅可以在插入的时候使用,也可以在查询,条件查询的场景下使用!

修改表结构

新增一个sex字段 1-男,2-女

ALTER TABLE `tb_user` 
ADD COLUMN `sex` int(1) NULL DEFAULT 1 COMMENT '1-男,2-女' AFTER `deleted`; 

定义枚举

package com.wyh.enums;

import com.baomidou.mybatisplus.core.enums.IEnum;

/**
*  @description:  性别枚举
*  @author:  魏一鹤
*  @createDate:  2022-09-07 22:26
**/

public enum SexEnum implements IEnum<Integer> {

    MAN(1, "男" ),
    WOMAN(2, "女" );

    private int  value;
    private String desc;

    SexEnum(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }

    @Override
    public Integer getValue() {
        return this.value;
    }

    @Override
    public String toString() {
        return this.desc;
    }
}

配置

 # 配置枚举 扫描该包下面的全部枚举 放到mp中供我们使用
mybatis - plus.type - enums - package=com.wyh.enums

修改实体

 // 性别 枚举类型
private SexEnum sex;

测试

 // 测试AR新增操作
@Test
public void testInsert(){
    User user = new User();
    user.setName( "锐雯" );
    user.setEmail( "lol@qq.com" );
    user.setAge(99);
    user.setUserName( "xxx" );
    user.setSex(SexEnum.WOMAN);
    // 调用AR的插入方法插入数据
 boolean insert = user.insert();
    System.out.println(user.getId());
    System.out.println( "是否成功:" +insert);
}

如果是查询的话 我们也会字段帮我们改变枚举值