mybatis-plus提供了在插入和更新时,通过配置注解的方式,将某些公共字段的值自动注入的功能。例如createDate,updateDate,creator,updater等字段属性的值,在更新和插入时都是一致的重复代码。
核心代码是实现MetaObjectHandler接口,重写insertFill()和updateFill()方法。
后续使用只需要在实体类的属性上,添加对应的注解即可。注解的值有三种:@TableField(fill = FieldFill.INSERT_UPDATE)、@TableField(fill = FieldFill.INSERT)、@TableField(fill = FieldFill.INSERT_UPDATE),分别对应着插入和更新时自动填充,插入时自动填充,更新时自动填充。
下面是FieldMetaObjectHandler核心配置代码:
package io.installer.common.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import io.installer.modules.security.user.SecurityUser;
import io.installer.modules.security.user.UserDetail;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 公共字段,自动填充值
*
*/
@Component
public class FieldMetaObjectHandler implements MetaObjectHandler {
private final static String CREATE_DATE = "createDate";
private final static String CREATOR = "creator";
private final static String UPDATE_DATE = "updateDate";
private final static String UPDATER = "updater";
private final static String DEPT_ID = "deptId";
@Override
public void insertFill(MetaObject metaObject) {
UserDetail user = SecurityUser.getUser();
Date date = new Date();
//创建者
strictInsertFill(metaObject, CREATOR, Long.class, user.getId());
//创建时间
strictInsertFill(metaObject, CREATE_DATE, Date.class, date);
//更新者
strictInsertFill(metaObject, UPDATER, Long.class, user.getId());
//更新时间
strictInsertFill(metaObject, UPDATE_DATE, Date.class, date);
}
@Override
public void updateFill(MetaObject metaObject) {
//更新者
strictUpdateFill(metaObject, UPDATER, Long.class, SecurityUser.getUserId());
//更新时间
strictUpdateFill(metaObject, UPDATE_DATE, Date.class, new Date());
}
}
使用时只需要在与数据库交互的实体类上,添加对应注解即可,如下:
@Data
@TableName("sys_user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String username;
private String password;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
// 其他自动填充字段...
}