Настройте функцию автозаполнения 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;

Б.ява

	/**
	 * 创建时间
	 */
	@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());
				}
			}
		}
	}
}

Код еще может нуждаться в оптимизации, но он может решить ограничение заполнения значений на основе фиксированных имен полей.В примере оценивается тип времени, а также могут быть сделаны другие расширения.Если есть лучший метод, пожалуйста, дайте мне знать! ! !
Текст со сносками.

Supongo que te gusta

Origin blog.csdn.net/weixin_53458434/article/details/114497452
Recomendado
Clasificación