MyBatisPlus(八)自动填充字段(createTime/updateTime)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 我们在项目中会用到createBy、createTime、updateBy、updateTime字段,来记录数据的插入和更新历史。若要实现这些字段的自动填充,MyBatisPlus需要增加一些配置,下面看具体内容吧。

我们在项目中会用到createBycreateTimeupdateByupdateTime字段,来记录数据的插入和更新历史。若要实现这些字段的自动填充,MyBatisPlus需要增加一些配置,下面看具体内容吧。

配置

配置需要两步:

  1. 在字段中增加注解@TableField(fill = FieldFill.INSERT),来表示填写字段,并可声明是在插入时填充,还是在更新时填充
@TableField(fill = FieldFill.INSERT)
private String createBy;
@TableField(fill = FieldFill.INSERT)
private Date createTime;

@TableField(fill = FieldFill.UPDATE)
private String updateBy;
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
....

FieldFill检举类原码:

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

在配置类中增加MetaObjectHandler的实现,并加入到SpringIOC容器中

注意:此处的数据类型要与填充字段数据类型保持一致

    /**
     * 配置自动填充
     *
     * @return
     */
    @Bean
    public MetaObjectHandler metaObjectHandler() {
   
        return new MetaObjectHandler() {
   
            @Override
            public void insertFill(MetaObject metaObject) {
   
                // 数据类型要与fileName一致
                this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
                this.strictInsertFill(metaObject, "createBy", String.class, "currentUser");
            }

            @Override
            public void updateFill(MetaObject metaObject) {
   
                // 数据类型要与fileName一致
                this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
                this.strictUpdateFill(metaObject, "updateBy", String.class, "currentUser");
            }
        };
    }

测试代码

插入一条记录

@Test
public void testInsert() {
   
    Dept dept = new Dept();
    dept.setName("运维部");
    int result = deptMapper.insert(dept);
    System.out.println(result);
}

执行日志:

JDBC Connection [HikariProxyConnection@130564501 wrapping com.mysql.cj.jdbc.ConnectionImpl@552ed807] will not be managed by Spring
==>  Preparing: INSERT INTO dept ( id, name, deleted, version, create_by, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
==> Parameters: fd1af5fffc430d515a5f132ab80eeabd(String), 运维部(String), false(Boolean), 0(Integer), currentUser(String), 2020-09-22 10:57:31.089(Timestamp)
<==    Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@141e879d]
1

通过执行日志我们可以看出,createBycreateTime字段已经自动填充上了

更新一条记录

@Test
public void testUpdateById() {
   
    Dept dept = deptMapper.selectById("fd1af5fffc430d515a5f132ab80eeabd");
    dept.setName("运维2部");
    int result = deptMapper.updateById(dept);
    System.out.println(result);
}

执行日志:

JDBC Connection [HikariProxyConnection@577037372 wrapping com.mysql.cj.jdbc.ConnectionImpl@3bec2275] will not be managed by Spring
==>  Preparing: SELECT id,name,deleted,version,create_by,create_time,update_by,update_time FROM dept WHERE id=? AND deleted=0
==> Parameters: fd1af5fffc430d515a5f132ab80eeabd(String)
<==    Columns: id, name, deleted, version, create_by, create_time, update_by, update_time
<==        Row: fd1af5fffc430d515a5f132ab80eeabd, 运维部, 0, 0, currentUser, 2020-09-22 10:57:31, null, null
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@141e879d]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@299270eb] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1966114624 wrapping com.mysql.cj.jdbc.ConnectionImpl@3bec2275] will not be managed by Spring
==>  Preparing: UPDATE dept SET name=?, version=?, create_by=?, create_time=?, update_by=?, update_time=? WHERE id=? AND version=? AND deleted=0
==> Parameters: 运维2(String), 1(Integer), currentUser(String), 2020-09-22 10:57:31.0(Timestamp), currentUser(String), 2020-09-22 11:00:06.151(Timestamp), fd1af5fffc430d515a5f132ab80eeabd(String), 0(Integer)
<==    Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@299270eb]
1

从日志中可以看出,updateByupdateTime字段已自动 填充上

注意事项

  • 填充原理是直接给entity的属性设置值!!!
  • 注解则是指定该属性在对应情况下必有值,如果无值则入库会是null
  • MetaObjectHandler提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null则不填充
  • 字段必须声明TableField注解,属性fill选择对应策略,该声明告知Mybatis-Plus需要预留注入SQL字段
  • 填充处理器MyMetaObjectHandler在 Spring Boot 中需要声明@Component@Bean注入
  • 要想根据注解FieldFill.xxx字段名以及字段类型来区分必须使用父类的strictInsertFill或者strictUpdateFill方法
  • 不需要根据任何来区分可以使用父类的fillStrategy方法

上一篇:SpringBoot 全家桶 | MyBatisPlus(七)乐观锁

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
8月前
|
SQL XML Java
【mybatis】第二篇:@Select注解中加入字段判断
【mybatis】第二篇:@Select注解中加入字段判断
|
4月前
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
346 8
|
13天前
|
SQL Java 数据库连接
Mybatis拦截器实现公共字段填充
通过使用MyBatis拦截器,可以实现对公共字段的自动填充,简化代码,提高开发效率。拦截器通过拦截SQL操作,在插入和更新操作时自动填充公共字段,使得开发者不再需要手动设置这些字段。本文详细介绍了实现步骤,并通过示例代码展示了具体实现方法,希望能为您的开发工作提供实用的指导和帮助。
55 13
|
2月前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
3月前
|
SQL Java 数据库连接
mybatis如何仅仅查询某个表的几个字段
【10月更文挑战第19天】mybatis如何仅仅查询某个表的几个字段
123 1
|
6月前
|
Java 数据库连接 数据库
mybatis plus 更新值为null的字段
mybatis plus 更新值为null的字段
75 7
|
7月前
|
数据库
MyBatis-Plus如何自动填充数据表的创建时间和更新时间
MyBatis-Plus如何自动填充数据表的创建时间和更新时间
284 1
|
6月前
|
数据库
MybatisPlus3---常用注解,驼峰转下滑线作为表明 cteateTime 数据表中的 cteate_time,@TableField,与数据库字段冲突要使用转义字符“`order`“,is
MybatisPlus3---常用注解,驼峰转下滑线作为表明 cteateTime 数据表中的 cteate_time,@TableField,与数据库字段冲突要使用转义字符“`order`“,is
|
8月前
|
SQL Java 数据库连接
Mybatis Plus字段为空值时未更新解决方案
Mybatis Plus字段为空值时未更新解决方案
807 1
|
8月前
|
SQL 存储 算法
Mybatis-Plus- CRUD接口-主键策略-自动填充和乐观锁-分页-逻辑删除-条件构造器和常用接口
Mybatis-Plus- CRUD接口-主键策略-自动填充和乐观锁-分页-逻辑删除-条件构造器和常用接口