MyBatis-Plus自动填充功能失效导致的原因及解决
1:先检查 字段有没有加上注解 @TableField(fill = FieldFill.INSERT_UPDATE)
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updatedTime;
2:有没有实现 MetaObjectHandler 接口 ,并且加入到 Spring 容器中
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createdTime", Date.class, new Date());
this.strictInsertFill(metaObject, "updatedTime", Date.class, new Date());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updatedTime", Date.class, new Date());
}
}
3: @Component 是否扫码注入进去
4: baseMapper.update(null,Wrappers.<Users>lambdaUpdate()) 这样的写法是没有拦截到的,所以无效
xml 写的也无效
@update 注解也无效
baseMapper.update(null, Wrappers.<Users>lambdaUpdate()
.set(Users::getConcernType,2)
.eq(Users::getId,userId));
应该改为
baseMapper.update(users, Wrappers.<Users>lambdaUpdate()
.set(Users::getConcernType,2));
或者
Users users = new Users();
users.setId(userId);
users.setConcernType(1);
baseMapper.updateById(users);
这样可以拿到表相关信息,会执行我们的 MetaObjectHandler 实现接口
补充:SpringBoot+MyBatisPlus 公共字段自动填充 MybatisPlusConfig配置不生效解决
SpringBoot+MyBatisPlus MybatisPlusConfig配置不生效问题
先说下工程目录
典型的Maven工程,在common中配置MyBatisPlus配置信息,在Base中进行CRUD操作。
遇到的问题:
在MyBatisPlus中配置了公共字段(create_time,upate_time),想在插入数据时,自动插入这两条字段。
配置如下:
AbstractEntity 代码:
/**
* 实体父类
*/
@Data
public abstract class AbstractEntity extends Model implements Serializable {
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId
private String id;
/**
* 创建时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "create_time", fill = FieldFill.INSERT)
public Date createTime;
/**
* 修改时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "update_time", fill = FieldFill.UPDATE)
public Date updateTime;
}
MetaHandler代码:
@Slf4j
@Component
public class MetaHandler implements MetaObjectHandler {
/**
* 新增数据执行
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
/**
* 更新数据执行
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
MybatisPlusConfig 代码:
@Configuration
@MapperScan("com.lyf.account.**.mapper")
public class MybatisPlusConfig {
/*
* 分页插件,自动识别数据库类型
* 多租户,请参考官网【插件扩展】
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
@Bean
public GlobalConfig globalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setMetaObjectHandler(new MetaHandler());
return globalConfig;
}
}
配置后,启动BaseApplication,使用Postman 进行测试,发现数据成功插入,但是创建时间并没有插入
在MybatisPlusConfig 的 globalConfig.setMetaObjectHandler(new MetaHandler());处打断点进行调试,发现代码并没有执行到这个类 (╯▔皿▔)╯ 检查 BaseApplication 才发现,没有在启动类中扫描该配置文件@。@
以下是修改过的BaseApplication类:
@SpringBootApplication
@ComponentScan({"com.lyf.account.mybatis.config","com.lyf.account.base"})
public class BaseApplication {
public static void main(String[] args) {
SpringApplication.run(BaseApplication.class, args);
}
@Bean
public IdWorker idWorker (){
return new IdWorker(1,1);
}
}
加入扫描装配后,再次进行测试,插入数据完美将创建时间加入O(∩_∩)O
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
以上是 MyBatis-Plus自动填充功能失效导致的原因及解决 的全部内容, 来源链接: utcz.com/z/350559.html