- 在实体类的相应字段上添加 @TableField 注解,并设置 fill 属性。
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.FieldFill;
public class User {
// ... 其他字段 ...
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
// ... 其他字段和方法 ...
}
在上面的例子中,createTime 字段在插入时会被自动填充,而 updateTime 字段在更新时会被自动填充。
- 实现 MetaObjectHandler 接口。
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import java.util.Date;
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); // 起始版本 3.3.0(推荐使用)
// 或者
this.setFieldValByName("createTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); // 起始版本 3.3.0(推荐使用)
// 或者
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
在上面的实现中,insertFill 方法用于处理插入时的自动填充,而 updateFill 方法用于处理更新时的自动填充。
- 注册 MetaObjectHandler 实现。
在 MyBatis-Plus 的配置类中,你需要注册上面实现的 MyMetaObjectHandler 类。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
@Bean
public MyMetaObjectHandler metaObjectHandler() {
return new MyMetaObjectHandler();
}
}
2. 原理
MyBatis-Plus 在执行插入或更新操作之前,会通过 MetaObjectHandler 接口的实现来自动填充字段。以下是自动填充的原理:
- 元对象处理:MyBatis-Plus 使用 MetaObject 来操作对象字段,MetaObject 是 MyBatis 提供的一个用于访问和修改对象属性的工具。
- 拦截器:MyBatis-Plus 通过拦截器(如 InsertInterceptor 和 UpdateInterceptor)在 SQL 执行前拦截操作,并调用 MetaObjectHandler 的相应方法来填充字段。
- 反射:MetaObjectHandler 实现中使用反射来设置实体类字段的值。
通过这种方式,MyBatis-Plus 能够在不需要开发者手动干预的情况下,自动为实体类的指定字段设置值,从而简化了数据库操作代码的编写。