mybatisplus 公共填充,自定义策略

mybatisplus 公共填充公共字段,可以自定义策略吗?
我在定义的元数据对象中的 @TableField(fill = FieldFill.INSERT) 策略中定义了

        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("createUser", BaseContext.getCurrentId());
        metaObject.setValue("updateUser", BaseContext.getCurrentId());

但是我有一张表只有createTime 这一个字段,其他3个字段没有,我想自己定义一个策略实现只更新一个字段。

    metaObject.setValue("createTime", LocalDateTime.now());

实现 MetaObjectHandler 接口重写更新方法

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    可以通过自定义公共填充策略来实现只更新某一个字段的目标。下面是一个具体的解决方案:

    1. 创建一个实现MetaObjectHandler接口的自定义公共填充策略类,例如MyMetaObjectHandler

    ```java import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component;

    import java.time.LocalDateTime;

    @Component public class MyMetaObjectHandler implements MetaObjectHandler {

       @Override
       public void insertFill(MetaObject metaObject) {
           this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
           // 其他字段的填充
           this.strictInsertFill(metaObject, "createUser", Long.class, BaseContext.getCurrentId());
           this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
           this.strictInsertFill(metaObject, "updateUser", Long.class, BaseContext.getCurrentId());
       }
    
       @Override
       public void updateFill(MetaObject metaObject) {
           // 只更新createTime字段
           this.strictUpdateFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
       }
    

    } ```

    该类中重写了insertFillupdateFill方法用于填充字段值。在insertFill方法中填充所有字段的默认值(根据需求修改默认值),在updateFill方法中只填充createTime字段的更新值。

    1. 在Spring Boot中配置MyBatis Plus使用自定义的公共填充策略。

    ```java import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;

    @Configuration public class MyBatisPlusConfig {

       @Bean
       public ConfigurationCustomizer configurationCustomizer() {
           return configuration -> configuration.setObjectWrapperFactory(new MybatisMapWrapperFactory());
       }
    
       @Bean
       public MybatisPlusInterceptor mybatisPlusInterceptor() {
           MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
           interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
           return interceptor;
       }
    
       @Bean
       public MetaObjectHandler metaObjectHandler() {
           return new MyMetaObjectHandler();
       }
    

    } ```

    在Spring Boot的配置类中,通过@Bean注解创建MyMetaObjectHandler实例,并将其注册为MetaObjectHandler的组件,以便MyBatis Plus可以识别并使用该自定义公共填充策略。

    1. 在实体类中使用@TableField注解指定对应字段的填充策略。

    ```java import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data;

    @Data @TableName("your_table_name") public class YourEntity {

       @TableField(fill = FieldFill.INSERT)
       private LocalDateTime createTime;
    
       // 其他字段的定义省略
    

    } ```

    在实体类的字段上使用@TableField(fill = FieldFill.INSERT)注解指定字段的填充策略为只在插入时填充,默认的策略是在插入和更新时都填充,对于只更新某个字段的情况需要自定义填充策略。

    这样,当插入或更新实体对象时,会根据自定义的公共填充策略进行字段值的填充,满足只更新某一个字段的要求。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^