SpringBoot+MyBatisPlus 自动填充字段 MetaObjectHandler 不生效问题 坑!
场景复原:
springboot项目,使用mybatis_plus记录mysql数据表记录插入,变更时间
依赖::
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
以下按照官方配置进行配置:
附官方指导文档:
链接: https://baomidou.com/pages/4c6bcf/.
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_campaign")
public class Campaign implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 活动主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 活动标题
*/
@TableField("title")
private String title;
/**
* 开始时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@TableField("start_time")
private Date startTime;
/**
* 结束时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@TableField("end_time")
private Date endTime;
@TableField(value = "add_time", fill = FieldFill.INSERT)
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date addTime;
@TableField(value = "edit_time", fill =FieldFill.INSERT_UPDATE)
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date editTime;
}
实现元对象处理器接口:
@Component
public class MetaObjectHandlerConfig implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "addTime", Date.class, new Date());
this.strictInsertFill(metaObject, "editTime", Date.class, new Date());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "editTime", Date.class, new Date());
}
}
数据表:
测试类:
/**
* @author Song
* @date 2021/12/14 17:41
* @Version 1.0
*/
@SpringBootTest(classes = Application.class)
@RunWith(SpringRunner.class)
public class Test {
@Autowired
private MPCampaignService mpCampaignService;
@org.junit.Test
public void test() {
Campaign campaign = new Campaign();
mpCampaignService.save(campaign);
}
}
测试结果:
先看看sql打印:
JDBC Connection [HikariProxyConnection@288398804 wrapping com.mysql.cj.jdbc.ConnectionImpl@4f4d05b3] will not be managed by Spring
==> Preparing: INSERT INTO t_campaign ( title, add_time, edit_time ) VALUES ( ?, ?, ? )
==> Parameters: 测试配置是否生效(String), null, null
<== Updates: 1
数据表:
发现并没有给add_time , edit_time赋值!!!,配置并不生效
解决办法:
1.先检查字段属性是否一致问题
2.检查时间类型问题,使用 java.util下的Date类
3.检查fill 有没有指派正确
@TableField(value = “add_time”, fill = FieldFill.INSERT)
@TableField(value = “edit_time”, fill =FieldFill.INSERT_UPDATE)
4.尝试引入以下配置类
@Configuration
public class MybatisPlusConfig {
/**
* MyBatis 字段值自动填充
* @return
*/
@Bean
public MybatisSqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws IOException {
MybatisSqlSessionFactoryBean mybatisPlus = new MybatisSqlSessionFactoryBean();
//加载数据源
mybatisPlus.setDataSource(dataSource);
//全局配置
GlobalConfig globalConfig = new GlobalConfig();
//配置填充器
globalConfig.setMetaObjectHandler(new MetaObjectHandlerConfig());
mybatisPlus.setGlobalConfig(globalConfig);
return mybatisPlus;
}
}
再次测试:
==> Preparing: INSERT INTO t_campaign ( title, add_time, edit_time ) VALUES ( ?, ?, ? )
==> Parameters: 测试配置是否生效(String), 2021-12-15 10:00:10.481(Timestamp), 2021-12-15 10:00:10.484(Timestamp)
<== Updates: 1
完美解决!!!