From ff0a3f1e8092da9937dcde5292f364d03be81be3 Mon Sep 17 00:00:00 2001 From: BelovedYaoo Date: Wed, 13 Nov 2024 20:16:14 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84(mybatis-flex-ext-base):=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=AE=9E=E4=BD=93=E6=93=8D=E4=BD=9C=E7=9B=91?= =?UTF-8?q?=E5=90=AC=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重构 EntityWriteListener 类,改为 EntityOperate 基类 - 新增 EntityInsertListener 和 EntityUpdateListener 类,分别处理插入和更新操作 - 改进属性填充方法,支持非标准bean的getter和setter - 更新相关注解,使用泛型提高类型安全性 --- .../mybatisflex/annotation/FillData.java | 2 +- .../annotation/InsertFillData.java | 2 +- .../annotation/InsertUpdateFillData.java | 2 +- .../annotation/UpdateFillData.java | 2 +- .../mybatisflex/MybatisFlexAutoConfig.java | 7 +- ...teListener.java => BaseEntityOperate.java} | 269 ++++++++++-------- .../core/EntityInsertListener.java | 28 ++ .../core/EntityUpdateListener.java | 27 ++ 8 files changed, 211 insertions(+), 128 deletions(-) rename mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/core/{EntityWriteListener.java => BaseEntityOperate.java} (55%) create mode 100644 mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/core/EntityInsertListener.java create mode 100644 mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/core/EntityUpdateListener.java diff --git a/mybatis-flex-ext-base/mybatis-flex-ext-annotation/src/main/java/com/tangzc/mybatisflex/annotation/FillData.java b/mybatis-flex-ext-base/mybatis-flex-ext-annotation/src/main/java/com/tangzc/mybatisflex/annotation/FillData.java index 763f8e7..4bac49c 100644 --- a/mybatis-flex-ext-base/mybatis-flex-ext-annotation/src/main/java/com/tangzc/mybatisflex/annotation/FillData.java +++ b/mybatis-flex-ext-base/mybatis-flex-ext-annotation/src/main/java/com/tangzc/mybatisflex/annotation/FillData.java @@ -21,7 +21,7 @@ public @interface FillData { /** * 可以自定义用户信息生成方式 */ - Class value(); + Class> value(); /** * 若对象上存在值,是否覆盖 diff --git a/mybatis-flex-ext-base/mybatis-flex-ext-annotation/src/main/java/com/tangzc/mybatisflex/annotation/InsertFillData.java b/mybatis-flex-ext-base/mybatis-flex-ext-annotation/src/main/java/com/tangzc/mybatisflex/annotation/InsertFillData.java index 93575a6..683c126 100644 --- a/mybatis-flex-ext-base/mybatis-flex-ext-annotation/src/main/java/com/tangzc/mybatisflex/annotation/InsertFillData.java +++ b/mybatis-flex-ext-base/mybatis-flex-ext-annotation/src/main/java/com/tangzc/mybatisflex/annotation/InsertFillData.java @@ -24,7 +24,7 @@ public @interface InsertFillData { * 可以自定义用户信息生成方式 */ @AliasFor(annotation = FillData.class, attribute = "value") - Class value(); + Class> value(); /** * 若对象上存在值,是否覆盖 diff --git a/mybatis-flex-ext-base/mybatis-flex-ext-annotation/src/main/java/com/tangzc/mybatisflex/annotation/InsertUpdateFillData.java b/mybatis-flex-ext-base/mybatis-flex-ext-annotation/src/main/java/com/tangzc/mybatisflex/annotation/InsertUpdateFillData.java index 39488a6..e4f5ad5 100644 --- a/mybatis-flex-ext-base/mybatis-flex-ext-annotation/src/main/java/com/tangzc/mybatisflex/annotation/InsertUpdateFillData.java +++ b/mybatis-flex-ext-base/mybatis-flex-ext-annotation/src/main/java/com/tangzc/mybatisflex/annotation/InsertUpdateFillData.java @@ -23,7 +23,7 @@ public @interface InsertUpdateFillData { * 可以自定义用户信息生成方式 */ @AliasFor(annotation = FillData.class, attribute = "value") - Class value(); + Class> value(); /** * 若对象上存在值,是否覆盖 diff --git a/mybatis-flex-ext-base/mybatis-flex-ext-annotation/src/main/java/com/tangzc/mybatisflex/annotation/UpdateFillData.java b/mybatis-flex-ext-base/mybatis-flex-ext-annotation/src/main/java/com/tangzc/mybatisflex/annotation/UpdateFillData.java index e9bd627..fc386f1 100644 --- a/mybatis-flex-ext-base/mybatis-flex-ext-annotation/src/main/java/com/tangzc/mybatisflex/annotation/UpdateFillData.java +++ b/mybatis-flex-ext-base/mybatis-flex-ext-annotation/src/main/java/com/tangzc/mybatisflex/annotation/UpdateFillData.java @@ -24,7 +24,7 @@ public @interface UpdateFillData { * 可以自定义用户信息生成方式 */ @AliasFor(annotation = FillData.class, attribute = "value") - Class value(); + Class> value(); /** * 若对象上存在值,是否覆盖 diff --git a/mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/MybatisFlexAutoConfig.java b/mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/MybatisFlexAutoConfig.java index ce63d21..2afc1ed 100644 --- a/mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/MybatisFlexAutoConfig.java +++ b/mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/MybatisFlexAutoConfig.java @@ -1,7 +1,8 @@ package com.tangzc.mybatisflex; import com.mybatisflex.core.FlexGlobalConfig; -import com.tangzc.mybatisflex.core.EntityWriteListener; +import com.tangzc.mybatisflex.core.EntityInsertListener; +import com.tangzc.mybatisflex.core.EntityUpdateListener; import com.tangzc.mybatisflex.core.MybatisFlexGlobalConfig; import com.tangzc.mybatisflex.util.SpringContextUtil; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -18,8 +19,8 @@ public class MybatisFlexAutoConfig { public MybatisFlexAutoConfig(MybatisFlexGlobalConfig globalConfig) { if (globalConfig.getEnableAutoFill()) { FlexGlobalConfig defaultConfig = FlexGlobalConfig.getDefaultConfig(); - defaultConfig.registerInsertListener(new EntityWriteListener(), Object.class); - defaultConfig.registerUpdateListener(new EntityWriteListener(), Object.class); + defaultConfig.registerInsertListener(new EntityInsertListener(), Object.class); + defaultConfig.registerUpdateListener(new EntityUpdateListener(), Object.class); FlexGlobalConfig.setDefaultConfig(defaultConfig); } } diff --git a/mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/core/EntityWriteListener.java b/mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/core/BaseEntityOperate.java similarity index 55% rename from mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/core/EntityWriteListener.java rename to mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/core/BaseEntityOperate.java index 12600e6..3a631b0 100644 --- a/mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/core/EntityWriteListener.java +++ b/mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/core/BaseEntityOperate.java @@ -1,7 +1,5 @@ package com.tangzc.mybatisflex.core; -import com.mybatisflex.annotation.InsertListener; -import com.mybatisflex.annotation.UpdateListener; import com.tangzc.mybatisflex.annotation.DefaultValue; import com.tangzc.mybatisflex.annotation.FieldFill; import com.tangzc.mybatisflex.annotation.FillData; @@ -9,14 +7,19 @@ import com.tangzc.mybatisflex.annotation.FillTime; import com.tangzc.mybatisflex.annotation.handler.AutoFillHandler; import com.tangzc.mybatisflex.util.SpringContextUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanWrapper; -import org.springframework.beans.BeanWrapperImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.NoUniqueBeanDefinitionException; +import org.springframework.cglib.core.ReflectUtils; import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.util.ReflectionUtils; +import java.beans.IntrospectionException; +import java.beans.PropertyDescriptor; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -32,12 +35,30 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.stream.Collectors; +/** + * 实体操作基类 + * + * @author BelovedYaoo + * @version 1.0 + */ @Slf4j -public class EntityWriteListener implements InsertListener, UpdateListener { +public abstract class BaseEntityOperate { + + /** + * get、set方法前缀 + */ + static final String GET_PREFIX = "get"; + static final String SET_PREFIX = "set"; + + public static final Logger LOGGER = LoggerFactory.getLogger(BaseEntityOperate.class); + + /** + * 需要处理的字段的缓存列表 + */ + private static final Map, List> FIELD_LIST_CATCH_MAP = new HashMap<>(); /** * 基本类型与包装类型对应关系 @@ -56,116 +77,149 @@ public class EntityWriteListener implements InsertListener, UpdateListener { } /** - * 需要处理的字段的缓存列表 + * 获取给定类实例中的字段列表 + * + * @param clazz 类实例 + * + * @return 字段列表 */ - private static final Map, List> FIELD_LIST_CATCH_MAP = new ConcurrentHashMap<>(); + public static List getFieldList(Class clazz) { + return FIELD_LIST_CATCH_MAP.computeIfAbsent(clazz, ct -> { + Field[] declaredFields = clazz.getDeclaredFields(); + List fields = new ArrayList<>(Arrays.asList(declaredFields)); + for (Class superClass = clazz.getSuperclass(); superClass != null; superClass = superClass.getSuperclass()) { + declaredFields = superClass.getDeclaredFields(); + fields.addAll(Arrays.asList(declaredFields)); + } + return fields.stream() + .filter(field -> AnnotatedElementUtils.hasMetaAnnotationTypes(field, FillTime.class) || + AnnotatedElementUtils.hasMetaAnnotationTypes(field, FillData.class) || + AnnotatedElementUtils.hasMetaAnnotationTypes(field, DefaultValue.class)) + .collect(Collectors.toList()); + }); + } - @Override - public void onInsert(Object entity) { + /** + * 通过类和字段获取属性描述符 + * + * @param clazz 类实例 + * @param field 字段实例 + * + * @return 属性描述符 + */ + public static PropertyDescriptor getPropertyDescriptor(Class clazz, Field field) { - Class clazz = entity.getClass(); - List fieldList = getFieldList(clazz); + List beanPropertiesList = Arrays.stream(ReflectUtils.getBeanProperties(clazz)) + .filter(bp -> bp.getName().equals(field.getName())) + .collect(Collectors.toList()); - if (!fieldList.isEmpty()) { - fill(FieldFill.INSERT, entity, clazz, fieldList); + if (!beanPropertiesList.isEmpty()) { + return beanPropertiesList.stream() + .findFirst() + .orElseThrow(() -> new RuntimeException(clazz.getName() + "下没有找到字段" + field.getName() + "的getter、setter")); } - } - @Override - public void onUpdate(Object entity) { + try { + Method getter = getGetterOrSetterByField(clazz, field, true); + Method setter = getGetterOrSetterByField(clazz, field, false); + return new PropertyDescriptor(field.getName(), getter, setter); + } catch (IntrospectionException e) { + throw new RuntimeException("获取" + clazz.getName() + "的Bean属性信息异常"); + } - Class clazz = entity.getClass(); - List fieldList = getFieldList(clazz); + } - if (!fieldList.isEmpty()) { - fill(FieldFill.UPDATE, entity, clazz, fieldList); + /** + * 从给定的类实例中查找指定字段实例的getter、setter。 + * + * @param clazz 要搜索的类 + * @param field 要搜索的字段 + * @param findGetter 是否查找getter方法 + * + * @return 返回找到的方法对象,如果没有找到则返回null + */ + public static Method getGetterOrSetterByField(Class clazz, Field field, boolean findGetter) { + try { + // 此处必须显式声明方法的参数类型,若直接缺省可能会导致getter为空 + Class[] parameterTypes = findGetter ? new Class[0] : new Class[]{field.getType()}; + return clazz.getMethod(field.getName(), parameterTypes); + } catch (NoSuchMethodException e) { + for (Method method : clazz.getDeclaredMethods()) { + if (method.getName().equals((findGetter ? GET_PREFIX : SET_PREFIX) + field.getName())) { + return method; + } + } } + return null; } public void fill(FieldFill fill, Object object, Class clazz, List fieldList) { - Now now = new Now(); - fieldList.forEach(field -> { - // 默认值 setDefaultVale(fill, object, clazz, field); - // 操作时间 - setOptionDate(fill, object, clazz, field, now); - - // 操作人 - setOptionUser(fill, object, clazz, field); + setOptionDate(object, clazz, field, now); + // 操作数据 + setOptionData(object, clazz, field); }); } private void setDefaultVale(FieldFill fill, Object object, Class clazz, Field field) { - DefaultValue defaultValue = AnnotatedElementUtils.getMergedAnnotation(field, DefaultValue.class); - if (defaultValue == null || (defaultValue.fill() != fill && defaultValue.fill() != FieldFill.INSERT_UPDATE)) { - return; - } - - BeanWrapper beanWrapper = new BeanWrapperImpl(object); - String fieldName = field.getName(); - boolean canSet = beanWrapper.getPropertyValue(fieldName) == null; - if (canSet) { - Object newVal = convert(field, defaultValue); - beanWrapper.setPropertyValue(fieldName, newVal); + if (defaultValue != null && (defaultValue.fill() == FieldFill.INSERT_UPDATE || defaultValue.fill() == fill)) { + PropertyDescriptor propertyDescriptor = getPropertyDescriptor(clazz, field); + Method readMethod = propertyDescriptor.getReadMethod(); + boolean canSet = ReflectionUtils.invokeMethod(readMethod, object) == null; + if (canSet) { + Object newVal = convert(field, defaultValue); + Method writeMethod = propertyDescriptor.getWriteMethod(); + writeMethod.setAccessible(true); + ReflectionUtils.invokeMethod(writeMethod, object, newVal); + } } } - private void setOptionUser(FieldFill fill, Object object, Class clazz, Field field) { - - FillData fillData = AnnotatedElementUtils.getMergedAnnotation(field, FillData.class); - if (fillData == null || (fillData.fill() != fill && fillData.fill() != FieldFill.INSERT_UPDATE)) { - return; - } - - BeanWrapper beanWrapper = new BeanWrapperImpl(object); - // 判断原来值为null,或者覆盖选项为true - String fieldName = field.getName(); - boolean canSet = fillData.override() || beanWrapper.getPropertyValue(fieldName) == null; - - if (canSet) { - - Object userInfo = null; - - AutoFillHandler instance = getAutoFillHandler(fillData.value()); - if (instance != null) { - userInfo = instance.getVal(object, clazz, field); - } - - // 如果当前未取到信息,不设置 - if (userInfo != null) { - // 先校验类型是否一致 - if (!this.checkTypeConsistency(userInfo.getClass(), field.getType())) { - String errorMsg = clazz.getName() + "中的字段" + fieldName + "的类型(" + field.getType() + ")与" + instance.getClass() + "返回值的类型(" + userInfo.getClass() + ")不一致"; - throw new RuntimeException(errorMsg); - } + private void setOptionDate(Object object, Class clazz, Field field, Now now) { + FillTime fillTime = AnnotatedElementUtils.getMergedAnnotation(field, FillTime.class); + if (fillTime != null) { + PropertyDescriptor propertyDescriptor = getPropertyDescriptor(clazz, field); + boolean canSet = fillTime.override() || ReflectionUtils.invokeMethod(propertyDescriptor.getReadMethod(), object) == null; + if (canSet) { + Class type = getDateType(clazz, field); + Object nowDate = Optional.ofNullable(now.now(type, fillTime.format())) + .orElseThrow(() -> new RuntimeException("类:" + clazz + "的字段:" + field.getName() + + "的类型不支持。仅支持String、Long、long、Date、LocalDate、LocalDateTime")); // 赋值 - beanWrapper.setPropertyValue(fieldName, userInfo); + ReflectionUtils.invokeMethod(propertyDescriptor.getWriteMethod(), object, nowDate); } } } - private static List getFieldList(Class clazz) { - - return FIELD_LIST_CATCH_MAP.computeIfAbsent(clazz, $ -> { - - Field[] declaredFields = clazz.getDeclaredFields(); - List fields = new ArrayList<>(Arrays.asList(declaredFields)); - for (Class superClass = clazz.getSuperclass(); superClass != null; superClass = superClass.getSuperclass()) { - declaredFields = superClass.getDeclaredFields(); - fields.addAll(Arrays.asList(declaredFields)); + private void setOptionData(Object object, Class clazz, Field field) { + FillData fillData = AnnotatedElementUtils.getMergedAnnotation(field, FillData.class); + if (fillData != null) { + PropertyDescriptor propertyDescriptor = getPropertyDescriptor(clazz, field); + // 判断原来值为null,或者覆盖选项为true + boolean canSet = fillData.override() || ReflectionUtils.invokeMethod(propertyDescriptor.getReadMethod(), object) == null; + if (canSet) { + Object userInfo = null; + AutoFillHandler instance = getAutoFillHandler(fillData.value()); + if (instance != null) { + userInfo = instance.getVal(object, clazz, field); + } + // 如果当前未取到信息,不设置 + if (userInfo != null) { + // 先校验类型是否一致 + if (!this.checkTypeConsistency(userInfo.getClass(), field.getType())) { + String errorMsg = clazz.getName() + "中的字段" + field.getName() + "的类型(" + field.getType() + ")与" + instance.getClass() + "返回值的类型(" + userInfo.getClass() + ")不一致"; + throw new RuntimeException(errorMsg); + } + // 赋值 + ReflectionUtils.invokeMethod(propertyDescriptor.getWriteMethod(), object, userInfo); + } } - - return fields.stream() - .filter(field -> AnnotatedElementUtils.hasMetaAnnotationTypes(field, FillTime.class) || - AnnotatedElementUtils.hasMetaAnnotationTypes(field, FillData.class) || - AnnotatedElementUtils.hasMetaAnnotationTypes(field, DefaultValue.class)) - .collect(Collectors.toList()); - }); + } } /** @@ -180,50 +234,25 @@ public class EntityWriteListener implements InsertListener, UpdateListener { /** * 缓存AutoFillHandler,同时寻找 */ - private AutoFillHandler getAutoFillHandler(Class autoFillHandler) { - + private AutoFillHandler getAutoFillHandler(Class> autoFillHandler) { try { return SpringContextUtil.getBeanOfType(autoFillHandler); } catch (NoUniqueBeanDefinitionException ignore) { - throw new RuntimeException("发现了多个" + autoFillHandler.getName() + "的实现,请保持spring中只有一个实例。"); + throw new RuntimeException("发现了多个" + autoFillHandler.getName() + "的实现,请保持Spring中只有一个实例。"); } catch (NoSuchBeanDefinitionException ignore) { if (autoFillHandler.isInterface()) { - log.warn("没有找到{}的实现,操作人信息无法自动填充。", autoFillHandler.getName()); + LOGGER.warn("没有找到{}的实现,操作数据无法自动填充。", autoFillHandler.getName()); } else { - log.warn("{}需要注册到spring,不然操作人信息无法自动填充。", autoFillHandler.getName()); + LOGGER.warn("{}需要注册到spring,否则操作数据无法自动填充。", autoFillHandler.getName()); } } return null; } - private void setOptionDate(FieldFill fill, Object object, Class clazz, Field field, Now now) { - - FillTime fillTime = AnnotatedElementUtils.getMergedAnnotation(field, FillTime.class); - if (fillTime == null || (fillTime.fill() != fill && fillTime.fill() != FieldFill.INSERT_UPDATE)) { - return; - } - - BeanWrapper beanWrapper = new BeanWrapperImpl(object); - String fieldName = field.getName(); - boolean canSet = fillTime.override() || beanWrapper.getPropertyValue(fieldName) == null; - - if (canSet) { - Class type = getDateType(clazz, field); - - Object nowDate = Optional.ofNullable(now.now(type, fillTime.format())) - .orElseThrow(() -> new RuntimeException("类:" + clazz.toString() + "的字段:" + fieldName - + "的类型不支持。仅支持String、Long、long、Date、LocalDate、LocalDateTime")); - - // 赋值 - beanWrapper.setPropertyValue(fieldName, nowDate); - } - } - /** * 获取日期类字段的类型 */ private Class getDateType(Class clazz, Field field) { - Class type = field.getType(); try { FieldTypeHandler fieldTypeHandler = SpringContextUtil.getBeanOfType(FieldTypeHandler.class); @@ -239,10 +268,10 @@ public class EntityWriteListener implements InsertListener, UpdateListener { * * @param field 默认值字段 * @param defaultValue 默认值注解 + * * @return 默认值 */ private Object convert(Field field, DefaultValue defaultValue) { - String value = defaultValue.value(); String format = defaultValue.format(); Class type = field.getType(); @@ -281,15 +310,12 @@ public class EntityWriteListener implements InsertListener, UpdateListener { } }); }}; - Function convertFunc = convertFuncMap.getOrDefault(type, val -> { if (type.isEnum()) { Object[] enumConstants = type.getEnumConstants(); - if (enumConstants.length > 0) { - for (Object enumConstant : enumConstants) { - if (Objects.equals(val, enumConstant.toString())) { - return enumConstant; - } + for (Object enumConstant : enumConstants) { + if (Objects.equals(val, enumConstant.toString())) { + return enumConstant; } } throw new RuntimeException("默认值" + val + "与枚举" + type.getName() + "不匹配!"); @@ -334,6 +360,7 @@ public class EntityWriteListener implements InsertListener, UpdateListener { return null; } + } } diff --git a/mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/core/EntityInsertListener.java b/mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/core/EntityInsertListener.java new file mode 100644 index 0000000..e32ddcd --- /dev/null +++ b/mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/core/EntityInsertListener.java @@ -0,0 +1,28 @@ +package com.tangzc.mybatisflex.core; + +import com.mybatisflex.annotation.InsertListener; +import com.tangzc.mybatisflex.annotation.FieldFill; + +import java.lang.reflect.Field; +import java.util.List; + +/** + * 实体插入监听器 + * + * @author BelovedYaoo + * @version 1.0 + */ +public class EntityInsertListener extends BaseEntityOperate implements InsertListener { + + @Override + public void onInsert(Object obj) { + Class clazz = obj.getClass(); + List fieldList = getFieldList(clazz); + + if (!fieldList.isEmpty()) { + fill(FieldFill.INSERT, obj, clazz, fieldList); + } + } + + +} diff --git a/mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/core/EntityUpdateListener.java b/mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/core/EntityUpdateListener.java new file mode 100644 index 0000000..98beef3 --- /dev/null +++ b/mybatis-flex-ext-base/mybatis-flex-ext-core/src/main/java/com/tangzc/mybatisflex/core/EntityUpdateListener.java @@ -0,0 +1,27 @@ +package com.tangzc.mybatisflex.core; + +import com.mybatisflex.annotation.UpdateListener; +import com.tangzc.mybatisflex.annotation.FieldFill; + +import java.lang.reflect.Field; +import java.util.List; + +/** + * 实体更新监听器 + * + * @author BelovedYaoo + * @version 1.0 + */ +public class EntityUpdateListener extends BaseEntityOperate implements UpdateListener { + + @Override + public void onUpdate(Object obj) { + Class clazz = obj.getClass(); + List fieldList = getFieldList(clazz); + + if (!fieldList.isEmpty()) { + fill(FieldFill.UPDATE, obj, clazz, fieldList); + } + } + +} -- Gitee