使用场景
- 公共字段
createTime
、createUser
、updateTime
、updateUser
自动填充 - 特殊需求字段保存前处理数据,比如可以通过反射处理特定注解的字段
实现
- 官方文档 MyBatis-Plus 自动填充功能
- 在需要填充的字段上注解
@TableField(fill = FieldFill.INSERT_UPDATE)
,代码如下:
/**
* 实体类
*/
@Data
@TableName("gecco_user")
@ApiModel(value = "User对象", description = "User对象")
public class Role implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 审核状态
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "审核状态")
private String checkStatus;
}
FieldFill.INSERT_UPDATE
表示新增或更新时填充,FieldFill
的其他策略如下:
/**
* 字段填充策略枚举类
*
* <p>
* 判断注入的 insert 和 update 的 sql 脚本是否在对应情况下忽略掉字段的 if 标签生成
* <if test="...">......</if>
* 判断优先级比 {@link FieldStrategy} 高
* </p>
*
* @author hubin
* @since 2017-06-27
*/
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入时填充字段
*/
INSERT,
/**
* 更新时填充字段
*/
UPDATE,
/**
* 插入和更新时填充字段
*/
INSERT_UPDATE
}
- 创建字段填充控制器,实现
MetaObjectHandler
,使用@Component
或@Bean
注入,代码如下:
import cn.hutool.core.util.ReflectUtil;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 新增时填充
*/
public void insertFill(MetaObject metaObject) {
//获取所有gat字段名
String[] getterNames = metaObject.getGetterNames();
//获取所有set字段名
String[] setterNames = metaObject.getSetterNames();
//获取指定字段的值
Object checkStatus = this.getFieldValByName("checkStatus", metaObject);
//修改指定字段赋值
this.setFieldValByName("checkStatus", "AUDIT", metaObject);
// 或者
this.strictInsertFill(metaObject, "checkStatus", String.class, "AUDIT"); // 起始版本 3.3.0(推荐使用)
// 或者
this.strictInsertFill(metaObject, "checkStatus", () -> "AUDIT", String.class); // 起始版本 3.3.3(推荐)
//获取entity实体
Object originalObject = metaObject.getOriginalObject();
//通过反射获取实体字段
Field[] fields = ReflectUtil.getFields(originalObject.getClass());
for (Field field : fields) {
//获取实体字段注解
TableField annotation = field.getAnnotation(TableField.class);
if (annotation != null) {
//通过反射设置值
ReflectUtil.setFieldValue(originalObject, field, "AUDIT");
}
}
}
/**
* 更新时填充
*/
public void updateFill(MetaObject metaObject) {
}
}