MyBatis-Plus自动填充功能失效导致的原因及解决
作者:performer丶 发布时间:2023-05-11 13:16:08
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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/publicv/article/details/108582719


猜你喜欢
- JavaFXJavaFX 是一个开源的下一代客户端应用平台,适用于基于Java构建的桌面、移动端和嵌入式系统。 它是许多个人和公司的共同努力
- 前言:在Java项目中,有两个主要的构建系统:Gradle和Maven。构建系统主要管理潜在的复杂依赖关系并正确编译项目。还可以将已编译的项
- 一、基础很多的Android入门程序猿来说对于Android自定义View,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定
- 1、结合字节码指令理解Java虚拟机栈和栈帧栈帧:每个栈帧对应一个被调用的方法,可以理解为一个方法的运行空间。每个栈帧中包括局部变量表(Lo
- 在本博客中,可以找到一篇《c#实现输出的字符靠右对齐的示例》它有教大家怎样实现字符串输出进行左齐或者是右对齐。本篇的方法,超简单,是使用st
- java 深拷贝与浅拷贝机制详解概要:在Java中,拷贝分为深拷贝和浅拷贝两种。java在公共超类Object中实现了一种叫做c
- 本文实例讲述了C#实现合并多个word文档的方法,是非常具有实用价值的技巧。分享给大家供大家参考。具体实现方法如下:using System
- 看代码吧~package com.mtpc.admin.controller.exportSql;import ch.qos.logback
- 本文章是基于鸿洋的Android 自定义View (一) 的一些扩展,以及对Android自定义View构造函数详解里面内容的一些转载。首先
- Android中的Intent是一个非常重要的类,如果对Intent不是特别了解,可以参见《详解Android中Intent的使用方法》。如
- 本文将介绍Java在ICPC快速IO实现方法,下面看看
- 1、SDK下载很慢。配置SDK代理,速度像飞一样。建议先把20-24下完,不然后面遇到很多问题。2、support-v7的问题例如res\v
- 本实例将显示类似于windows7提供的图片预览窗格效果,单击任意一张图片,可以在右侧显示该图片的预览效果。效果如图所示:具体实现方法:re
- 目录创建线程管理线程销毁线程创建线程线程是通过扩展 Thread 类创建的。扩展的 Thread 类调用 Start() 方法来开
- SpringTask是Spring自带的功能。实现起来比较简单。使用SpringTask实现定时任务有两种方式:1.注解方式基于注解@Sch
- 文章来源:aspcn 作者:孙雯服务器Sockets列表9.2是一个服务器应用程序的一部分.列表9.2 一个简单的服务器程序 /** &n
- DownloadManager三大组件介绍DownloadManager类似于下载队列,管理所有当前正在下载或者等待下载的项目;他可以维持
- C#连接本地.mdf文件:项目中右键点击,新增——数据——基于服务的数据库,项目下直接生成.mdf数据库文件,后台(数据库的写入用参数传递)
- 本文实例讲述了C#序列化与反序列化的方法。分享给大家供大家参考。具体分析如下:把“对象”转换为“字节序列”的过程称为对象的序列化。 
- 最近的项目中,想做到一种能够吸引眼球的一种角色选择浏览效果Demo源码:点击打开链接最终实现了下按如下图这么一种浏览效果:效果图一效果图二可