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 接口重写更新方法
不知道你这个问题是否已经解决, 如果还没有解决的话:可以通过自定义公共填充策略来实现只更新某一个字段的目标。下面是一个具体的解决方案:
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());
}
} ```
该类中重写了insertFill
和updateFill
方法用于填充字段值。在insertFill
方法中填充所有字段的默认值(根据需求修改默认值),在updateFill
方法中只填充createTime
字段的更新值。
```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可以识别并使用该自定义公共填充策略。
@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)
注解指定字段的填充策略为只在插入时填充,默认的策略是在插入和更新时都填充,对于只更新某个字段的情况需要自定义填充策略。
这样,当插入或更新实体对象时,会根据自定义的公共填充策略进行字段值的填充,满足只更新某一个字段的要求。