mybatisplus自动填充不起效
时间: 2025-06-20 08:57:30 浏览: 33
### MyBatisPlus自动填充功能无效的解决方案
在多数据源环境下,MyBatisPlus 的自动填充功能可能会失效。以下是一些可能的原因及对应的解决方法:
#### 1. 自定义自动填充处理器未正确配置
如果项目中使用了多数据源,每个数据源需要独立配置 `SqlSessionFactory` 和 `SqlSessionTemplate`。此时,必须确保为每个数据源都正确设置了自定义的 `MetaObjectHandler`[^1]。
```java
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
this.strictInsertFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
}
}
```
#### 2. 使用了 `strictInsertFill` 或 `strictUpdateFill` 导致更新失效
当实体类中的字段未被标记为可填充时,`strictInsertFill` 或 `strictUpdateFill` 方法会跳过这些字段,从而导致自动填充失效。建议检查实体类是否正确添加了注解 `@TableField(fill = FieldFill.INSERT)` 或 `@TableField(fill = FieldFill.UPDATE)`[^2]。
```java
@Data
public class User {
@TableId(type = IdType.AUTO)
private Long id;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
}
```
#### 3. `MetaObjectHandler` 未生效
如果 `MetaObjectHandler` 未被正确注入到 Spring 容器中,可能导致自动填充功能无法触发。可以通过以下方式确保其生效[^4]:
```java
@Configuration
public class MyBatisConfig {
@Bean
public GlobalConfig globalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setMetaObjectHandler(new MyMetaObjectHandler());
return globalConfig;
}
}
```
#### 4. 字段类型不匹配
自动填充功能要求字段类型与填充值类型一致。例如,如果字段类型为 `LocalDateTime`,则填充值也应为 `LocalDateTime` 类型。如果类型不匹配,会导致自动填充失败[^3]。
```java
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
```
#### 5. 使用自定义 SQL 导致自动填充失效
如果在 Mapper 中使用了自定义 SQL(如 `<insert>` 标签),自动填充功能可能不会生效。建议尽量使用 MyBatisPlus 提供的标准 CRUD 方法,或者在自定义 SQL 中手动设置相关字段。
---
### 示例代码
以下是一个完整的配置示例:
```java
// 自定义 MetaObjectHandler
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
this.strictInsertFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
}
}
// 全局配置
@Configuration
public class MyBatisConfig {
@Bean
public GlobalConfig globalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setMetaObjectHandler(new MyMetaObjectHandler());
return globalConfig;
}
}
// 实体类
@Data
public class User {
@TableId(type = IdType.AUTO)
private Long id;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
}
```
---
阅读全文
相关推荐


















