软件编程
位置:首页>> 软件编程>> java编程>> MyBatis-Plus自动填充功能失效导致的原因及解决

MyBatis-Plus自动填充功能失效导致的原因及解决

作者:performer丶  发布时间:2023-05-11 13:16:08 

标签: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);

MyBatis-Plus自动填充功能失效导致的原因及解决

这样可以拿到表相关信息,会执行我们的 MetaObjectHandler 实现接口

补充:SpringBoot+MyBatisPlus 公共字段自动填充 MybatisPlusConfig配置不生效解决

SpringBoot+MyBatisPlus MybatisPlusConfig配置不生效问题

先说下工程目录

MyBatis-Plus自动填充功能失效导致的原因及解决

典型的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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

来源:https://blog.csdn.net/publicv/article/details/108582719

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com