SpringBoot+MyBatisPlus 自动填充字段 MetaObjectHandler 不生效问题 坑

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

在这里插入图片描述
完美解决!!!

参考致谢: https://www.cnblogs.com/stephen-java/p/11247020.html.

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
要配置MyBatis Plus的拦截器以实现字段自动填充,你可以按照以下步骤进行操作: 1. 创建一个类实现`MetaObjectHandler`接口,该接口包含了字段自动填充的方法。在这个类中,你可以实现`insertFill`和`updateFill`方法,在插入和更新操作时自动填充指定字段。 ```java @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createUser", String.class, "defaultUser"); this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateUser", String.class, "defaultUser"); this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); } } ``` 在这个示例中,我们在插入和更新操作时分别填充了`createUser`、`createTime`、`updateUser`和`updateTime`字段。 2. 在你的配置类中添加对拦截器的配置。例如: ```java @Configuration public class MyBatisPlusConfig { @Autowired private MyMetaObjectHandler myMetaObjectHandler; @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new MybatisPlusInnerInterceptor()); // 添加自动填充拦截器 interceptor.addInnerInterceptor(new IAutoFillInnerInterceptor(myMetaObjectHandler)); return interceptor; } } ``` 在这个示例中,我们创建了一个`MybatisPlusInterceptor`对象,并通过`addInnerInterceptor`方法添加了自定义的内部拦截器`IAutoFillInnerInterceptor`,并将`MyMetaObjectHandler`作为参数传递给拦截器。 3. 创建一个自定义的内部拦截器`IAutoFillInnerInterceptor`,继承自`AbstractSqlParserHandler`,并实现其中的方法。 ```java public class IAutoFillInnerInterceptor extends AbstractSqlParserHandler { private final MetaObjectHandler metaObjectHandler; public IAutoFillInnerInterceptor(MetaObjectHandler metaObjectHandler) { this.metaObjectHandler = metaObjectHandler; } @Override public SqlNode handler(MetaObject metaObject, SqlNode sqlNode) { // 在这里执行字段自动填充逻辑 metaObjectHandler.insertFill(metaObject); metaObjectHandler.updateFill(metaObject); return super.handler(metaObject, sqlNode); } } ``` 在这个示例中,我们在`handler`方法中调用了`MetaObjectHandler`的插入和更新填充方法。 通过以上步骤,你就可以成功配置MyBatis Plus的拦截器,并实现字段自动填充了。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值