自定义mybatis-plus的自动填充功能,根据注解填值

转载标明出处~~

mybatis-plus的自动填充功能不做过多介绍(官网传送门 ==>),不过官网给出的例子是根据createTime 、updateTime 等固定字段名去判断填充的。有一定的局限性,在某些情况下,却不太适用,例如如下情况:
A.java

	/**
	 * 创建时间
	 */
	@TableField(value = "aasy04a040",fill=FieldFill.INSERT)
	@ApiModelProperty(value = "创建时间")
	private LocalDateTime acreateTime;

	/**
	 * 更新时间
	 */
	@TableField(value = "aasy04a050",fill=FieldFill.INSERT_UPDATE)
	@ApiModelProperty(value = "更新时间")
	private LocalDateTime aupdateTime;

B.java

	/**
	 * 创建时间
	 */
	@ApiModelProperty(value = "创建时间")
	@TableField(value = "bbsy08a100",fill =FieldFill.INSERT)
	private Date bcreateTime;

	/**
	 * 更新时间
	 */
	@ApiModelProperty(value = "更新时间")
	@TableField(value = "bbsy08a110",fill = FieldFill.INSERT_UPDATE)
	private Date bupdateTime;

A和B类都有创建时间和更新时间字段, 但字段名却不相同,肯定自动填充失效啊。。。。。
看了一下午代码之后(瞌睡了俩小时***),想出了如下方法,直接上代码!!!

/**
 * @Author ZhaoJianTao
 * @Description 根据注解自动填充值
 * @CreationDate 2021/3/6
 */
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

	@Override
	public void insertFill(MetaObject metaObject) {
		log.info("start insert fill ....");
		Class<?> originalClass = metaObject.getOriginalObject().getClass();
		Field[] field = originalClass.getDeclaredFields();
		for (int i = 1; i < field.length; i++) {
			String fieldName=field[i].getName();
			String type = field[i].getType().getName();
			TableField ann = field[i].getAnnotation(TableField.class);
			if(ann!=null && (FieldFill.INSERT_UPDATE.equals(ann.fill()) || FieldFill.INSERT.equals(ann.fill()))){
				if("java.util.Date".equals(type)){
					this.strictInsertFill(metaObject, fieldName, Date.class, new Date());
				}else if("java.time.LocalDateTime".equals(type)){
					this.strictInsertFill(metaObject, fieldName, LocalDateTime.class, LocalDateTime.now());
				}
			}
		}
	}

	@Override
	public void updateFill(MetaObject metaObject) {
		log.info("start update fill ....");
		Class<?> originalClass = metaObject.getOriginalObject().getClass();
		Field[] field = originalClass.getDeclaredFields();
		for (int i = 1; i < field.length; i++) {
			String fieldName=field[i].getName();
			String type = field[i].getType().getName();
			TableField ann = field[i].getAnnotation(TableField.class);
			if(ann!=null && (FieldFill.INSERT_UPDATE.equals(ann.fill()) || FieldFill.UPDATE.equals(ann.fill()))){
				if("java.util.Date".equals(type)){
					this.strictUpdateFill(metaObject, fieldName, Date.class, new Date());
				}else if("java.time.LocalDateTime".equals(type)){
					this.strictUpdateFill(metaObject, fieldName, LocalDateTime.class, LocalDateTime.now());
				}
			}
		}
	}
}

代码可能还需要优化,但能解决根据固定字段名去填值的限制性,例子中判断的是时间类型,也可以做其他扩充,如有更好的方法望不吝赐教!!!
一个具有注脚的文本。

### MyBatis-Plus 自动填充 功能详解 #### 实现自动填充的关键组件 MyBatis-Plus 提供了 `MetaObjectHandler` 接口来实现字段的自动填充功能。通过继承该接口并重写相应的方法,可以在插入或更新操作时自动生成特定字段的[^2]。 ```java import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createTime", Date::new); // 插入时填充创建时间 this.strictInsertFill(metaObject, "createBy", () -> getUserId(), Long.class); // 填充创建者ID } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateTime", Date::new); // 更新时填充修改时间 this.strictUpdateFill(metaObject, "updateBy", () -> getUserId(), Long.class); // 填充修改者ID } } ``` #### 字段配置方式 为了使某个字段能够被自动填充,在对应的实体类中需要使用 `@TableField` 注解,并指定 `fill` 属性为合适的枚举(如 `FieldStrategy.NOT_NULL` 或其他策略)。这允许框架识别哪些字段应该参与自动填充逻辑[^3]。 ```java @TableField(fill = FieldFill.INSERT) private Date createTime; // 创建时间 @TableField(fill = FieldFill.UPDATE) private Date updateTime; // 修改时间 ``` #### 启用全局处理器 最后一步是在 Spring Boot 应用程序上下文中注册上述处理程序作为 Bean 组件,从而让整个应用程序都能享受到这一特性带来的便利[^1]。 ```yaml mybatis-plus: global-config: db-config: id-type: auto configuration: handlers: - my.package.MyMetaObjectHandler ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值