使用 MyBatis-Plus 实现自动填充功能 Create_time、Update_time自动更新

本文介绍了如何使用MyBatis-Plus中的MetaObjectHandler接口创建自动填充处理器,配置自动填充字段,以及在插入和更新操作时自动填充时间戳。通过@TableField注解和@JsonFormat简化开发流程,提高效率。
摘要由CSDN通过智能技术生成

介绍

在数据库表中,通常会存在一些需要在插入或更新操作时自动填充的字段,比如记录创建时间和更新时间等。为了简化开发流程,MyBatis-Plus 提供了自动填充功能,可以在执行插入或更新操作时自动填充这些字段的值。

本文将介绍如何使用 MyBatis-Plus 实现自动填充功能,并在代码中演示示例。

步骤

  1. 编写自动填充处理器

    首先,我们需要编写一个实现了 MyBatis-Plus 的 MetaObjectHandler 接口的自动填充处理器,用于在插入和更新操作时填充字段的值。以下是一个示例:

    java
    @Slf4j
    @Component(value = "myMetaObjectHandler")
    @Primary
    public class MyMetaObjectHandler implements MetaObjectHandler {
        @Override
        public void insertFill(MetaObject metaObject) {
            log.info("start insert fill ....");
            this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
            this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
            log.info("start update fill ....");
            this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
        }
    }
    

  2. 配置自动填充字段

    在实体类中,使用 @TableField 注解并指定 fill 属性为 FieldFill.INSERTFieldFill.INSERT_UPDATE,以指示需要自动填充的字段。同时,可以使用 @JsonFormat 注解指定日期格式。

    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime updateTime;
    

  3. 执行插入操作

    在插入操作时,调用 baseMapper.insert() 方法插入数据,自动填充的字段的值将会在插入时自动填充。

@Override
public void add(Student student) {
    int b = baseMapper.insert(student);
    if (b < 0) {
        throw new IllegalArgumentException("参数错误");
    }
}

结论

通过以上步骤,我们实现了使用 MyBatis-Plus 实现自动填充功能。在执行插入或更新操作时,无需手动设置填充字段的值,MyBatis-Plus 会自动填充这些字段的值,简化了开发流程,提高了开发效率。

在Spring Boot项目中使用MyBatis-Plus实现查询时给公共字段`create_by`赋值,通常需要使用MyBatis-Plus提供的钩子函数(Hook Methods)或者注解来实现。`create_by`字段通常用于记录数据创建者的标识,比如用户的ID。以下是几种实现方式: 1. 使用`@TableField`注解: 在你的实体类中,可以为`create_by`字段使用`@TableField`注解,并设置`fill`属性为`FieldFill.INSERT`或`FieldFill.INSERT_UPDATE`。这样在执行插入或更新操作时,MyBatis-Plus自动填充这个字段。 ```java import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.extension.activerecord.Model; public class YourEntity extends Model<YourEntity> { // 其他字段... @TableField(fill = FieldFill.INSERT) private Long createBy; // 省略getter和setter方法... } ``` 然后,你需要自定义一个`MetaObjectHandler`的实现类,并在Spring Boot的配置中注册它,以便在插入或更新时自动填充`create_by`字段。 ```java import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize; import com.baomidou.mybatisplus.extension.service.IService; import org.apache.ibatis.reflection.MetaObject; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.time.LocalDateTime; @Configuration public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); return paginationInterceptor; } @Bean public MyMetaObjectHandler myMetaObjectHandler() { return new MyMetaObjectHandler(); } } import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createBy", Long.class, 1L); // 假设1L是当前用户ID } @Override public void updateFill(MetaObject metaObject) { // 更新时不需要填充create_by字段 } } ``` 2. 在Mapper接口中重写方法: 如果需要在查询时也填充`create_by`字段,可以在自定义的Mapper接口中重写查询方法,并在方法中手动设置该字段的值。 ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper public interface YourEntityMapper extends BaseMapper<YourEntity> { default YourEntity selectWithCreateBy(Long id, Long userId) { YourEntity entity = selectById(id); if (entity != null) { entity.setCreateBy(userId); } return entity; } } ``` 使用这种方式需要注意的是,每次进行查询操作时,都必须调用带有`create_by`字段填充的方法,否则`create_by`字段将不会被设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值