本文概括
场景需求
在业务表设计中,常需要在新增记录时自动填充创建时间,在编辑记录时自动刷新更新时间。手动赋值会导致代码冗余且易遗漏,本文将演示如何通过MyBatis-Plus的MetaObjectHandler
接口实现自动化赋值。
实现步骤
引入依赖
确保pom.xml
包含MyBatis-Plus依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
创建元数据处理器
新建MyMetaObjectHandler.java
实现自动填充逻辑:
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, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "createBy", String.class, getCurrentUser());
}
// 更新时自动填充
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, "updateBy", String.class, getCurrentUser());
}
// 获取当前用户(需根据实际系统实现)
private String getCurrentUser() {
return "system_user";
}
}
实体类注解
在业务实体类中标记需要自动填充的字段:
public class BusinessEntity {
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private String createBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
}
启用自动填充
在Spring Boot启动类或配置类中添加注解:
@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
核心注解说明
注解/方法 | 作用 |
---|---|
@TableField(fill=...) | 标记字段填充时机:INSERT /UPDATE /INSERT_UPDATE |
strictInsertFill() | 严格模式填充,确保字段类型匹配 |
strictUpdateFill() | 更新时填充,避免覆盖已有值 |
注意事项
- 字段类型一致性:处理器中的值类型必须与实体类字段类型完全匹配。
- 高版本MyBatis-Plus:使用≥3.3.0版本时,需通过
@Component
注解将处理器加入Spring容器。 - 敏感字段处理:创建时间建议只在插入时赋值,更新时不修改。
- 多数据源场景:需为每个数据源单独配置处理器。
效果验证
执行插入/更新操作后,数据库字段值将自动填充:
INSERT INTO business_table (...) VALUES (...);
-- create_time、update_time自动赋值为当前时间
UPDATE business_table SET ... WHERE id=1;
-- update_time自动刷新为最新时间
扩展应用
- 填充其他字段:如租户ID、操作IP等,只需在处理器中补充逻辑。
- 自定义填充策略:继承
MetaObjectHandler
实现更复杂的填充规则。