告别手动赋值!优雅处理 MyBatis-Plus 的创建时间和更新时间

背景

Spring JPA 提供了 @CreatedDate@LastModifiedDate 注解,用于自动赋值实体类的创建时间和更新时间。但我们的团队主要使用 MyBatis-Plus 作为 ORM 框架,需要提供同类的机制支持。

目标

为 MyBatis-Plus 提供自动填充功能。

实现

MyBatis-Plus 也提供了自动填充功能,通过实现 com.baomidou.mybatisplus.core.handlers.MetaObjectHandler 接口来实现。笔者定了 AutofillMetaObjectHandler 类实现,如下。

java 复制代码
@RequiredArgsConstructor
public class AutofillMetaObjectHandler implements MetaObjectHandler {

	private final String createdDateFieldName;

	private final String lastModifiedDateFieldName;

	/**
	 * 插入元对象字段填充(用于插入时对公共字段的填充)
	 *
	 * @param metaObject 元对象
	 */
	@Override
	public void insertFill(MetaObject metaObject) {
		LocalDateTime now = LocalDateTime.now();
		this.strictInsertFill(metaObject, createdDateFieldName, LocalDateTime.class, now);
		this.strictUpdateFill(metaObject, lastModifiedDateFieldName, LocalDateTime.class, now);
	}

	/**
	 * 更新元对象字段填充(用于更新时对公共字段的填充)
	 *
	 * @param metaObject 元对象
	 */
	@Override
	public void updateFill(MetaObject metaObject) {
		LocalDateTime now = LocalDateTime.now();
		this.strictUpdateFill(metaObject, lastModifiedDateFieldName, LocalDateTime.class, now);
	}
}

预留了 createdDateFieldNamelastModifiedDateFieldName 字段,提供给 @Configuration 配置类扩展。

java 复制代码
@AutoConfigureAfter(MybatisPlusAutoConfiguration.class)
@ConditionalOnClass({
	SqlSessionFactory.class,
	SqlSessionFactoryBean.class,
	MybatisConfiguration.class
})
@ConditionalOnProperty(name = "mybatis-plus.extension.auto-fill.enabled", havingValue = "true")
@EnableConfigurationProperties({MybatisPlusExtensionProperties.class})
@Slf4j
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
@Configuration(proxyBeanMethods = false)
public class MybatisPlusExtensionAutoConfiguration {

	@ConditionalOnMissingBean
	@Bean
	public MetaObjectHandler metaObjectHandler(MybatisPlusExtensionProperties properties) {
		log.debug("Autowired MetaObjectHandler");
		return new AutofillMetaObjectHandler(properties.getAutoFill().getCreatedDateFieldName(),
			properties.getAutoFill().getLastModifiedDateFieldName());
	}
}

@Data
@ConfigurationProperties(prefix = "mybatis-plus.extension")
public class MybatisPlusExtensionProperties {

	private final AutoFill autoFill = new AutoFill();

	@Data
	public static class AutoFill {

		private boolean enabled = true;

		private String createdDateFieldName = "created_date"; 

		private String lastModifiedDateFieldName = "last_modified_date";
	}
}

MybatisPlusExtensionProperties 属性类默认设置 created_date 字段为 SQL 表的创建时间,last_modified_date 为最后修改时间,业务方可以通过 mybatis-plus.extension.auto-fill.created-date-field-namemybatis-plus.extension.auto-fill.last-modified-date-field-name 自行调整。

业务方在项目配置 mybatis-plus.extension.auto-fill.enabled=true 启用 MyBatis-Plus 自动填充,在实体类中使用 @TableField 注解来标记哪些字段需要自动填充,并指定填充的策略,如下。

java 复制代码
public class User {

    @TableField(fill = FieldFill.INSERT)
    private String createTime;

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

    // 其他字段...
}

这样就完成了 MyBatis-Plus 的自动填充功能,根据这个思路,也可以实现 @CreatedBy 创建人和 @LastModifiedBy 最后修改人。

产出

一般我们在设计表都会保留两个字段:创建时间和最后修改时间,引入这个组件,可以简化业务的处理。

本文涉及的代码完全开源,感兴趣的伙伴可以查阅 eden-mybatis-spring-boot-starter

相关推荐
Database_Cool_11 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
Database_Cool_12 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白13 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
liuxiaowei314 小时前
【绝版教程】新版MySQL DBA高级实战进阶班 MySQL8.0 姜承尧-腾讯数据库总监
数据库·mysql·dba
sg_knight16 小时前
MySQL 存储过程详解:从入门到实战
android·数据库·mysql·database·dba·关系型数据库·db
Database_Cool_18 小时前
企业级多模态分析计算引擎选型:首选 AnalyticDB MySQL 向量 + SQL + 实时一体化方案
数据库·sql·mysql
宇宙第一小趴菜20 小时前
五、Oracle vs MySQL 架构深度对比笔记
mysql·oracle·架构
Database_Cool_1 天前
云数据仓库开通指南:阿里云 AnalyticDB MySQL 10 分钟从 0 到分析实战教程
数据仓库·mysql·阿里云
—Miss. Z—1 天前
计算机二级MySQL——简单应用题(事件&视图)
android·mysql·adb
会编程的土豆1 天前
MySQL 中的 IN 和 EXISTS(零基础笔记)
数据库·笔记·mysql