mybatis-plus公共字段自动填充功能

文章介绍了在开发中如何使用MyBatis-plus自动填充公共字段,如创建时间和创建人等。提供了两种方法:一是使用@TableField注解配合FieldFill枚举,分别在插入和更新时自动填充;二是自定义MetaObjectHandler,覆盖insertFill和updateFill方法来设置字段值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一.前言:

 二、解决方法

2.1原始代码(手动set公共字段)

 2.2方案一:注解自动填充

 2.2方案二: 自己编写自定义填充


一.前言:

      在我们平时开发中, 设计表的时候会有公共字段,比如PDManer(数据库设计软件) 我们导入数据域, 会有一些公共字段,这些字段在我们平时业务交互的时候是需要维护的,在我们添加或更新的时候会赋值,今天看一下我们如何自动填充公共字段并保存。

例如:

 mubatis-plus依赖

注:我的配置是基于MyBatis-plus 3.3.1的版本

<!--MyBatis-plus starter-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.1</version>
</dependency>
 
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>3.3.1</version>
</dependency>

 二、解决方法

2.1原始代码(手动set公共字段)

手动set公共值

添加:

public boolean saveTest(Test test) {
        test.setCreatedTime(new Date());
        test.setCreatedBy(RequestContext.getLoginUserId());
    return super.save(test);
}

更新:

public boolean updateTest(Test test) {
        test.updateBy(RequestContext.getLoginUserId());
        test.updateTime(new Date());
        return super.updateById(test);
    }

 手动是很麻烦的, 每次个添加接口和更新接口都需要set默认值

 2.2方案一:注解自动填充

  1. 实体类中(pojo类)需要自动填充的属性通过@TableField的fill属性进行标注
  2. FieldFill为字段填充策略枚举类,定义了DEFAULT(默认不处理)、INSERT(插入时填充字段)、UPDATE(更新时填充字段)、INSERT_UPDATE(插入和更新时填充字段)等4种填充策略

 注释:  @TableField注解

1、 主要用来解决实体类的字段名与数据库中的字段名不匹配的问题(数据库user_addr,字段useraddr未驼峰)

2、 实体类中的属性字段在表中不存在的问题

3.表示自动填充字段一般用于字段名

属性类型必须指定默认值描述
valueString""数据库字段名
existbooleantrue是否为数据库表字段
conditionString""字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 %s=#{%s}参考(opens new window)
updateString""字段 update set 部分注入,例如:当在version字段上注解update="%s+1" 表示更新时会 set version=version+1 (该属性优先级高于 el 属性)
insertStrategyEnumFieldStrategy.DEFAULT举例:NOT_NULL
insert into table_a(<if test="columnProperty != null">column</if>) values (<if test="columnProperty != null">#{columnProperty}</if>)
updateStrategyEnumFieldStrategy.DEFAULT
举例:IGNORED
update table_a set column=#{columnProperty}
whereStrategyEnumFieldStrategy.DEFAULT举例:NOT_EMPTY
where <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if>
fillEnumFieldFill.DEFAULT字段自动填充策略
selectbooleantrue是否进行 select 查询
keepGlobalFormatbooleanfalse是否保持使用全局的 format 进行处理
jdbcTypeJdbcTypeJdbcType.UNDEFINEDJDBC 类型 (该默认值不代表会按照该值生效)
typeHandlerClass<? extends TypeHandler>UnknownTypeHandler.class类型处理器 (该默认值不代表会按照该值生效)
numericScaleString""        指定小数点后保留的位数

代码:

@ApiModelProperty(value = "创建人")
    @TableField(fill = FieldFill.INSERT)
    private Long createdBy;

    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private Date createdTime;

    @ApiModelProperty(value = "更新人")
    @TableField(fill = FieldFill.INSERT)
    private Long updatedBy;

    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT)
    private Date updatedTime;

 2.2方案二: 自己编写自定义填充

这里是比较活泛的

/**
 * 自定义sql字段填充器,自动填充创建修改相关字段
 */
public class CustomMetaObjectHandler implements MetaObjectHandler {

    private static final String CREATE_USER = "createUser";

    private static final String INSERT_TIME = "insertTime";

    private static final String UPDATE_USER = "updateUser";

    private static final String UPDATE_TIME = "updateTime";

    @Override
    public void insertFill(MetaObject metaObject) {
        //为空则设置createUser
        Object createUser = metaObject.getValue(CREATE_USER);
        if(ObjectUtil.isNull(createUser)) {
            setFieldValByName(CREATE_USER, this.getUserUniqueId(), metaObject);
        }
        //为空则设置insertTime
        Object insertTime = metaObject.getValue(INSERT_TIME);
        if(ObjectUtil.isNull(insertTime)) {
            setFieldValByName(INSERT_TIME, new Date(), metaObject);
        }

    }

    @Override
    public void updateFill(MetaObject metaObject) {
        setFieldValByName(UPDATE_TIME, new Date(), metaObject);
        setFieldValByName(UPDATE_USER, this.getUserUniqueId(), metaObject);
    }

    /**
     * 获取用户唯一id
     */
    private Long getUserUniqueId() {
        return -1L;
        /*try {
            SysLoginUser sysLoginUser = LoginContextHolder.me().getSysLoginUserWithoutException();
            if(ObjectUtil.isNotNull(sysLoginUser)) {
                return sysLoginUser.getId();
            } else {
                return -1L;
            }
        } catch (Exception e) {
            //如果获取不到就返回-1
            return -1L;
        }*/
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值