背景:
Mybatis Plus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以
统一对这些字段进行处理,避免了重复代码。
实现步骤:
一、在实体类的公共字段属性上加入@TableField注解,指定自动填充的策略
@TableField(fill = FieldFill.INSERT)//插入时填充
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)//插入和更新时填充
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)//插入时填充
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)//插入和更新时填充
private Long updateUser;
二、按照框架要求编写元数据对象处理器(创建一个类),在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口
-
创建一个类实现MetaObjectHandler
-
添加@Component将这个类交给IOC管理
-
实现MetaObjectHandler类中的insertFill()方法和updateFill()方法
-
给实体类中要自动填充的属性赋值
package com.yzy.common;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Slf4j
@Component
public class MyMetaObjectThandler implements MetaObjectHandler {
/***
* 插入时自动填充
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
log.info("公共字段自动填充[insert]");
log.info(metaObject.toString());
metaObject.setValue("createTime",LocalDateTime.now());
metaObject.setValue("updateTime",LocalDateTime.now());
metaObject.setValue("createUser",1);
}
/***
* 修改时自动填充
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
log.info("公共字段自动填充[update]");
log.info(metaObject.toString());
metaObject.setValue("updateTime",LocalDateTime.now());
metaObject.setValue("updateUser",1);
}
}
三、实验中出现的问题:
启动项目测试后,MyBatis-Plus 的公共字段自动填充器不起作用
四、解决办法:
可能的原因有:
1. **元数据处理器未配置**:需要在实体类中使用 `@TableField` 注解的 `fill` 属性来指定字段在什么情况下自动填充,并且需要实现 `MetaObjectHandler` 接口来定义填充规则。
2. **自动填充规则未正确实现**:在 `MetaObjectHandler` 实现类中,需要正确实现 `insertFill` 和 `updateFill` 方法来指定字段的填充值。
3. **实体类字段访问权限**:确保自动填充的字段在实体类中具有正确的访问权限(通常是 public 或通过 getter/setter 访问)。
4. **Spring Bean 未正确注册**:如果使用 Spring Boot,确保 `MetaObjectHandler` 实现类被注册为 Spring Bean。
5. **版本兼容性问题**:确保使用的 MyBatis-Plus 版本与 MyBatis、Spring Boot 等其他依赖库兼容。
6. **配置文件问题**:检查 MyBatis-Plus 的配置文件,确保没有错误的配置影响了自动填充的功能。
7. **缓存问题**:有时候,可能是由于缓存导致自动填充没有按预期工作。尝试清除缓存或重启应用程序。
8. **调试和日志**:开启调试日志,检查 MyBatis-Plus 的执行日志,看是否有关自动填充的相关信息。
解决方法:
- **检查实体类注解**:确保实体类中的字段使用了 `@TableField` 注解,并且 `fill` 属性设置正确。
9."版本问题":确保MP依赖的版本适配。
我的就是更换了最新版本
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.7</version>
</dependency>
项目充走了自动装配器