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

回到顶部