Explorar o código

完善 MetaObjectHandler.java

miemie %!s(int64=6) %!d(string=hai) anos
pai
achega
0ff96b7fa3

+ 35 - 33
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/handlers/MetaObjectHandler.java

@@ -15,17 +15,16 @@
  */
  */
 package com.baomidou.mybatisplus.core.handlers;
 package com.baomidou.mybatisplus.core.handlers;
 
 
-import java.util.Objects;
-import java.util.Optional;
-
-import org.apache.ibatis.reflection.MetaObject;
-import org.apache.ibatis.reflection.SystemMetaObject;
-
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
 import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;
 import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;
+import org.apache.ibatis.reflection.MetaObject;
+import org.apache.ibatis.reflection.SystemMetaObject;
+
+import java.util.Objects;
+import java.util.Optional;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -58,19 +57,13 @@ public interface MetaObjectHandler {
 
 
     /**
     /**
      * <p>
      * <p>
-     * Common method to set value for java bean.
-     * </p>
-     * <p>
-     * 如果包含前缀 et 使用该方法,否则可以直接 metaObject.setValue(fieldName, fieldVal);
+     * 通用填充
      * </p>
      * </p>
      *
      *
      * @param fieldName  java bean property name
      * @param fieldName  java bean property name
      * @param fieldVal   java bean property value
      * @param fieldVal   java bean property value
      * @param metaObject meta object parameter
      * @param metaObject meta object parameter
-     * @see MetaObjectHandler#setInsertFieldValByName(String, Object, MetaObject)  替代之前版本insert填充
-     * @see MetaObjectHandler#setUpdateFieldValByName(String, Object, MetaObject)  替代之前版本update填充
      */
      */
-    @Deprecated
     default MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {
     default MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {
         if (Objects.nonNull(fieldVal)) {
         if (Objects.nonNull(fieldVal)) {
             if (metaObject.hasSetter(fieldName) && metaObject.hasGetter(fieldName)) {
             if (metaObject.hasSetter(fieldName) && metaObject.hasGetter(fieldName)) {
@@ -90,13 +83,12 @@ public interface MetaObjectHandler {
 
 
     /**
     /**
      * <p>
      * <p>
-     * 替代之前版本insert填充
+     * insert 时填充,只会填充 fill 被标识为 INSERT 与 INSERT_UPDATE 的字段
      * </p>
      * </p>
      *
      *
-     * @param fieldName
-     * @param fieldVal
-     * @param metaObject
-     * @return
+     * @param fieldName  java bean property name
+     * @param fieldVal   java bean property value
+     * @param metaObject meta object parameter
      * @since 3.0.7
      * @since 3.0.7
      */
      */
     default MetaObjectHandler setInsertFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {
     default MetaObjectHandler setInsertFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {
@@ -105,13 +97,12 @@ public interface MetaObjectHandler {
 
 
     /**
     /**
      * <p>
      * <p>
-     * 替代之前版本update填充
+     * update 时填充,只会填充 fill 被标识为 UPDATE 与 INSERT_UPDATE 的字段
      * </p>
      * </p>
      *
      *
-     * @param fieldName
-     * @param fieldVal
-     * @param metaObject
-     * @return
+     * @param fieldName  java bean property name
+     * @param fieldVal   java bean property value
+     * @param metaObject meta object parameter
      * @since 3.0.7
      * @since 3.0.7
      */
      */
     default MetaObjectHandler setUpdateFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {
     default MetaObjectHandler setUpdateFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {
@@ -134,13 +125,14 @@ public interface MetaObjectHandler {
      */
      */
     default MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject, FieldFill fieldFill) {
     default MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject, FieldFill fieldFill) {
         if (Objects.nonNull(fieldVal)) {
         if (Objects.nonNull(fieldVal)) {
-            if (metaObject.hasSetter(fieldName) && metaObject.hasGetter(fieldName) && isFill(fieldName, metaObject, fieldFill)) {
+            if (metaObject.hasSetter(fieldName) && metaObject.hasGetter(fieldName)
+                && isFill(fieldName, fieldVal, metaObject, fieldFill)) {
                 metaObject.setValue(fieldName, fieldVal);
                 metaObject.setValue(fieldName, fieldVal);
             } else if (metaObject.hasGetter(Constants.ENTITY)) {
             } else if (metaObject.hasGetter(Constants.ENTITY)) {
                 Object et = metaObject.getValue(Constants.ENTITY);
                 Object et = metaObject.getValue(Constants.ENTITY);
                 if (et != null) {
                 if (et != null) {
                     MetaObject etMeta = SystemMetaObject.forObject(et);
                     MetaObject etMeta = SystemMetaObject.forObject(et);
-                    if (etMeta.hasSetter(fieldName) && isFill(fieldName, etMeta, fieldFill)) {
+                    if (etMeta.hasSetter(fieldName) && isFill(fieldName, fieldVal, etMeta, fieldFill)) {
                         etMeta.setValue(fieldName, fieldVal);
                         etMeta.setValue(fieldName, fieldVal);
                     }
                     }
                 }
                 }
@@ -171,18 +163,28 @@ public interface MetaObjectHandler {
     }
     }
 
 
     /**
     /**
-     * 是否填充
+     * <p>
+     * 填充判断
+     * </p>
+     * <li> 如果是主键,不填充 </li>
+     * <li> 根据字段名找不到字段,不填充 </li>
+     * <li> 字段类型与填充值类型不匹配,不填充 </li>
      *
      *
-     * @param fieldName  字段名
-     * @param metaObject
-     * @param fieldFill  填充策略
-     * @return
+     * @param fieldName  java bean property name
+     * @param fieldVal   java bean property value
+     * @param metaObject meta object parameter
+     * @param fieldFill  填充策略枚举
+     * @return 是否进行填充
      * @since 3.0.7
      * @since 3.0.7
      */
      */
-    default boolean isFill(String fieldName, MetaObject metaObject, FieldFill fieldFill) {
-        TableInfo tableInfo = metaObject.hasGetter(MP_OPTLOCK_ET_ORIGINAL) ? TableInfoHelper.getTableInfo(metaObject.getValue(MP_OPTLOCK_ET_ORIGINAL).getClass()) : TableInfoHelper.getTableInfo(metaObject.getOriginalObject().getClass());
+    default boolean isFill(String fieldName, Object fieldVal, MetaObject metaObject, FieldFill fieldFill) {
+        TableInfo tableInfo = metaObject.hasGetter(MP_OPTLOCK_ET_ORIGINAL) ?
+            TableInfoHelper.getTableInfo(metaObject.getValue(MP_OPTLOCK_ET_ORIGINAL).getClass())
+            : TableInfoHelper.getTableInfo(metaObject.getOriginalObject().getClass());
         if (Objects.nonNull(tableInfo)) {
         if (Objects.nonNull(tableInfo)) {
-            Optional<TableFieldInfo> first = tableInfo.getFieldList().stream().filter(e -> e.getProperty().equals(fieldName)).findFirst();
+            Optional<TableFieldInfo> first = tableInfo.getFieldList().stream()
+                .filter(e -> e.getProperty().equals(fieldName) && e.getPropertyType().equals(fieldVal.getClass()))
+                .findFirst();
             if (first.isPresent()) {
             if (first.isPresent()) {
                 FieldFill fill = first.get().getFieldFill();
                 FieldFill fill = first.get().getFieldFill();
                 return fill.equals(fieldFill) || FieldFill.INSERT_UPDATE.equals(fill);
                 return fill.equals(fieldFill) || FieldFill.INSERT_UPDATE.equals(fill);