mybatis可通过自定义interceptor拦截executor.update方法,在insert/update前反射填充createtime和updatetime字段:insert时两者均设为当前时间,update仅更新updatetime;需兼容pojo/map/parammap参数类型,推荐使用localdatetime并规范字段命名与空值判断。

MyBatis 本身不提供自动填充字段的机制,但可以通过 Interceptor(拦截器) 在 SQL 执行前动态修改参数对象,实现创建时间(createTime)、更新时间(updateTime)等字段的自动赋值。核心思路是拦截 Executor.update 方法,在执行 INSERT / UPDATE 前,检查并填充目标字段。
1. 编写自定义拦截器
实现 org.apache.ibatis.plugin.Interceptor 接口,重点关注对 Executor 的 update 方法的拦截:
- 只处理
INSERT和UPDATE操作(通过MappedStatement.getSqlCommandType()判断) - 获取实际传入的参数(可能是 POJO、Map 或 ParamMap),递归/反射遍历,识别含
createTime、updateTime字段的对象 - 对
INSERT:若createTime为空,则设为当前时间;updateTime同样填充(或与createTime一致) - 对
UPDATE:仅填充updateTime(不覆盖createTime)
2. 支持多种参数类型
MyBatis 的参数可能是以下任一种,拦截器需兼容:
- 单个 POJO 对象:直接反射设值
- Map(如 @Param 注解):遍历 value,对其中的 POJO 或嵌套 Map 处理
- ParamMap(多个参数时 MyBatis 自动封装):取其 values,再逐个判断是否为需填充的对象
建议使用工具类(如 Spring 的 BeanUtils 或 Apache Commons BeanUtils)安全地读写属性,避免空指针和类型异常。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
3. 配置拦截器生效
在 MyBatis 配置文件(如 mybatis-config.xml)或 Spring Boot 的 @Configuration 类中注册:
Spring Boot 中更推荐用 @Bean 方式注入 SqlSessionFactoryBean 并设置 plugins 属性。
4. 注意字段命名与空值判断逻辑
为避免误填充,建议约定规范:
- 字段名统一为
createTime/updateTime(或通过注解如@TableField(fill = FieldFill.INSERT)标识,增强可读性) - 判空逻辑用
Objects.isNull(value)(对 Date)或LocalDateTime.now().isAfter(...)(对 LocalDateTime),避免用== null粗暴判断 - 时间类型优先使用
LocalDateTime(配合 MyBatis-Plus 或自定义 TypeHandler),避免Date时区问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










