按照官方文档的步骤完成了自动填入字段功能:
1、定义实体类
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 创建人
*/
private String createUser;
/**
* 更新时间
*/
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
/**
* 更新人
*/
private String updateUser;
2、实现 MetaObjectHandler
@Slf4j
@Component
public class AutoFillFieldHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
3、添加注解
在MetaObjectHandler的实现类前增加注解@Component或者是@Bean
结果:
官方文档说轻轻松松实现自动填充字段,发现没有效果,又看了后面的注意事项:
- 自动填充是直接给实体类的属性设置值。
- 如果属性没有值,入库时会是
null
。 MetaObjectHandler
提供的默认方法策略是:如果属性有值则不覆盖,如果填充值为null
则不填充。- 字段必须声明
@TableField
注解,并设置fill
属性来选择填充策略。 - 填充处理器需要在 Spring Boot 中声明为
@Component
或@Bean
。 - 使用
strictInsertFill
或strictUpdateFill
方法可以根据注解FieldFill.xxx
、字段名和字段类型来区分填充逻辑。 - 如果不需区分,可以使用
fillStrategy
方法。 - 在
update(T entity, Wrapper<T> updateWrapper)
时,entity
不能为空,否则自动填充失效。 - 在
update(Wrapper<T> updateWrapper)
时不会自动填充,需要手动赋值字段条件。
但是还是没有效果。百度寻找问题的解决方案,发现有一个可能的原因:配置数据源的时候做了局部的处理,把默认的机制给改了,需要手动指定实现MetaObjectHandler的类。原文请参考:Mybatis-Plus自动填充失效原因和解决方案 - HangBlog - 博客园
最终解决方案:
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
factoryBean.setDataSource(druidDataSource());
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("classpath*:/mapper/**/*.xml");
factoryBean.setMapperLocations(resources);
// 设置 MyBatis-Plus 分页插件 注意此处myBatisPlugin一定要放在后面
List<Interceptor> pluginsList = new ArrayList<>();
pluginsList.add(paginationInterceptor);
if (dataScopePlugin != null) {
pluginsList.add(dataScopePlugin);
}
factoryBean.setPlugins(pluginsList.toArray(new Interceptor[pluginsList.size()]));
factoryBean.setGlobalConfig(new GlobalConfig().setMetaObjectHandler(new AutoFillFieldHandler()));
return factoryBean.getObject();
}
增加了:
factoryBean.setGlobalConfig(new GlobalConfig().setMetaObjectHandler(new AutoFillFieldHandler()));
数据源全局配置增加自动填充字段的实现类。