如何实现MybatisPlus的自动填充?
时间: 2024-01-11 07:00:52 浏览: 88
MybatisPlus的自动填充可以通过实现MetaObjectHandler类并重写insertFill和updateFill方法来实现。在这些方法中,可以对需要填充的字段进行赋值操作,例如设置创建时间和更新时间等公用字段。然后在需要使用自动填充的实体类上添加注解@TableField(fill = FieldFill.INSERT_UPDATE)。这样,在执行插入和更新操作时,就会自动调用对应的填充方法来填充这些字段的值。
相关问题
mybatisplus自动填充实现
MybatisPlus自动填充可以通过实现MetaObjectHandler接口来实现。具体步骤如下:
1. 创建一个类实现MetaObjectHandler接口,并重写其中的方法,例如:
```
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
```
2. 在实体类中使用@TableField注解标注需要自动填充的字段,例如:
```
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
// 省略getter和setter方法
}
```
3. 在MybatisPlus配置文件中配置自动填充处理器,例如:
```
@Configuration
public class MybatisPlusConfig {
@Autowired
private MyMetaObjectHandler myMetaObjectHandler;
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
return interceptor;
}
@Bean
public GlobalConfig globalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setMetaObjectHandler(myMetaObjectHandler);
return globalConfig;
}
}
```
mybatisplus自动填充失效
### MyBatisPlus 自动填充失效的原因分析
当遇到MyBatisPlus自动填充功能失效的情况时,可能由多种因素引起。具体来说:
- 如果实体类中的字段被标记了`@TableField(fill = FieldFill.INSERT)`但仍返回`null`,这可能是由于未正确注册元对象处理器所致[^2]。
- 对于多数据源环境下的应用,每个数据源应拥有独立的`SqlSessionFactory`和`SqlSessionTemplate`实例;如果这些组件未能适当地关联到各自的自动填充处理器,则可能导致该特性无法正常工作[^3]。
### 解决方案概述
为了修复上述提到的问题并使自动填充机制恢复正常运作,可以采取如下措施之一或组合使用:
#### 方法一:确认已实现MetaObjectHandler接口
确保项目中有实现了`com.baomidou.mybatisplus.core.handlers.MetaObjectHandler`接口的服务,并重写了其中的方法来定义具体的填充逻辑。例如,在此类中指定如何处理插入操作(`insertFill`)以及更新操作(`updateFill`)期间的数据赋值行为[^4]。
```java
@Component
public class CustomMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "createBy", String.class, "system");
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "modifyTime", LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, "modifyBy", String.class, "system");
}
}
```
#### 方法二:自定义全局配置文件
通过调整Spring Boot应用程序内的`application.yml`或其他形式的应用程序属性设置,确保所有必要的参数都得到了恰当设定。特别是对于那些涉及多个数据库连接池的情形下,需特别注意针对每一个单独的数据源都要有相应的配置项用于激活其对应的自动填充支持。
```yaml
spring:
datasource:
master:
url: jdbc:mysql://localhost:3306/master_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
slave:
url: jdbc:mysql://localhost:3307/slave_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
global-config:
db-config:
id-type: auto
field-strategy: not_empty
mapper-locations: classpath*:mapper/*.xml
# 配置多数据源情况下各数据源特有的自动填充处理器
multi-datasource:
primary: master
slaves:
- name: slave
handler-package: com.example.demo.handler.slave
```
#### 方法三:检查依赖版本兼容性
有时不同库之间的版本差异也可能引发意想不到的行为变化。因此建议核查当前使用的MyBatis Plus及其相关扩展包的具体版本号,必要时升级至最新稳定版以获得更好的性能表现及错误修正[^1]。
阅读全文