Kaynağa Gözat

Merge branch '3.0' into 3.gay

miemie 5 yıl önce
ebeveyn
işleme
27597f8238

+ 21 - 12
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/handlers/MetaObjectHandler.java

@@ -43,7 +43,7 @@ public interface MetaObjectHandler {
     default boolean openInsertFill() {
         return true;
     }
-    
+
     /**
      * 兼容填充主键判断开关
      * 如果启用开关:当主键值为空且主键生成策略为NONE或INPUT会进入新增填充
@@ -194,49 +194,55 @@ public interface MetaObjectHandler {
 
     /**
      * @param metaObject metaObject meta object parameter
+     * @return this
      * @since 3.3.0
      */
-    default <T> MetaObjectHandler strictInsertFill(MetaObject metaObject, String fieldName, Class<T> fieldType, Object fieldVal) {
+    default <T, E extends T> MetaObjectHandler strictInsertFill(MetaObject metaObject, String fieldName, Class<T> fieldType, E fieldVal) {
         return strictInsertFill(findTableInfo(metaObject), metaObject, Collections.singletonList(StrictFill.of(fieldName, fieldType, fieldVal)));
     }
 
     /**
      * @param metaObject metaObject meta object parameter
+     * @return this
      * @since 3.3.0
      */
-    default <T> MetaObjectHandler strictInsertFill(MetaObject metaObject, String fieldName, Class<T> fieldType, Supplier<T> fieldVal) {
-        return strictInsertFill(findTableInfo(metaObject), metaObject, Collections.singletonList(StrictFill.of(fieldName, fieldType, fieldVal)));
+    default <T, E extends T> MetaObjectHandler strictInsertFill(MetaObject metaObject, String fieldName, Supplier<E> fieldVal, Class<T> fieldType) {
+        return strictInsertFill(findTableInfo(metaObject), metaObject, Collections.singletonList(StrictFill.of(fieldName, fieldVal, fieldType)));
     }
 
     /**
      * @param metaObject metaObject meta object parameter
+     * @return this
      * @since 3.3.0
      */
-    default MetaObjectHandler strictInsertFill(TableInfo tableInfo, MetaObject metaObject, List<StrictFill> strictFills) {
+    default MetaObjectHandler strictInsertFill(TableInfo tableInfo, MetaObject metaObject, List<StrictFill<?, ?>> strictFills) {
         return strictFill(true, tableInfo, metaObject, strictFills);
     }
 
     /**
      * @param metaObject metaObject meta object parameter
+     * @return this
      * @since 3.3.0
      */
-    default <T> MetaObjectHandler strictUpdateFill(MetaObject metaObject, String fieldName, Class<T> fieldType, Supplier<T> fieldVal) {
-        return strictUpdateFill(findTableInfo(metaObject), metaObject, Collections.singletonList(StrictFill.of(fieldName, fieldType, fieldVal)));
+    default <T, E extends T> MetaObjectHandler strictUpdateFill(MetaObject metaObject, String fieldName, Supplier<E> fieldVal, Class<T> fieldType) {
+        return strictUpdateFill(findTableInfo(metaObject), metaObject, Collections.singletonList(StrictFill.of(fieldName, fieldVal, fieldType)));
     }
 
     /**
      * @param metaObject metaObject meta object parameter
+     * @return this
      * @since 3.3.0
      */
-    default <T> MetaObjectHandler strictUpdateFill(MetaObject metaObject, String fieldName, Class<T> fieldType, Object fieldVal) {
+    default <T, E extends T> MetaObjectHandler strictUpdateFill(MetaObject metaObject, String fieldName, Class<T> fieldType, E fieldVal) {
         return strictUpdateFill(findTableInfo(metaObject), metaObject, Collections.singletonList(StrictFill.of(fieldName, fieldType, fieldVal)));
     }
 
     /**
      * @param metaObject metaObject meta object parameter
+     * @return this
      * @since 3.3.0
      */
-    default MetaObjectHandler strictUpdateFill(TableInfo tableInfo, MetaObject metaObject, List<StrictFill> strictFills) {
+    default MetaObjectHandler strictUpdateFill(TableInfo tableInfo, MetaObject metaObject, List<StrictFill<?, ?>> strictFills) {
         return strictFill(false, tableInfo, metaObject, strictFills);
     }
 
@@ -250,12 +256,13 @@ public interface MetaObjectHandler {
      * @return this
      * @since 3.3.0
      */
-    default MetaObjectHandler strictFill(boolean insertFill, TableInfo tableInfo, MetaObject metaObject, List<StrictFill> strictFills) {
+    default MetaObjectHandler strictFill(boolean insertFill, TableInfo tableInfo, MetaObject metaObject, List<StrictFill<?, ?>> strictFills) {
         if ((insertFill && tableInfo.isWithInsertFill()) || (!insertFill && tableInfo.isWithUpdateFill())) {
             strictFills.forEach(i -> {
                 final String fieldName = i.getFieldName();
+                final Class<?> fieldType = i.getFieldType();
                 tableInfo.getFieldList().stream()
-                    .filter(j -> j.getProperty().equals(fieldName) && i.getFieldType().equals(j.getPropertyType()) &&
+                    .filter(j -> j.getProperty().equals(fieldName) && fieldType.equals(j.getPropertyType()) &&
                         ((insertFill && j.isWithInsertFill()) || (!insertFill && j.isWithUpdateFill()))).findFirst()
                     .ifPresent(j -> strictFillStrategy(metaObject, fieldName, i.getFieldVal()));
             });
@@ -269,6 +276,7 @@ public interface MetaObjectHandler {
      * @param metaObject metaObject meta object parameter
      * @param fieldName  java bean property name
      * @param fieldVal   java bean property value of Supplier
+     * @return this
      * @since 3.3.0
      */
     default MetaObjectHandler fillStrategy(MetaObject metaObject, String fieldName, Object fieldVal) {
@@ -284,9 +292,10 @@ public interface MetaObjectHandler {
      * @param metaObject metaObject meta object parameter
      * @param fieldName  java bean property name
      * @param fieldVal   java bean property value of Supplier
+     * @return this
      * @since 3.3.0
      */
-    default MetaObjectHandler strictFillStrategy(MetaObject metaObject, String fieldName, Supplier<Object> fieldVal) {
+    default MetaObjectHandler strictFillStrategy(MetaObject metaObject, String fieldName, Supplier<?> fieldVal) {
         if (metaObject.getValue(fieldName) == null) {
             Object obj = fieldVal.get();
             if (Objects.nonNull(obj)) {

+ 7 - 7
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/handlers/StrictFill.java

@@ -28,7 +28,7 @@ import java.util.function.Supplier;
  */
 @Data
 @AllArgsConstructor
-public class StrictFill {
+public class StrictFill<T, E extends T> {
     /**
      * 字段名
      */
@@ -36,17 +36,17 @@ public class StrictFill {
     /**
      * 字段类型
      */
-    private Class<?> fieldType;
+    private Class<T> fieldType;
     /**
      * 获取字段值的函数
      */
-    private Supplier<Object> fieldVal;
+    private Supplier<E> fieldVal;
 
-    public static StrictFill of(String fieldName, Class<?> fieldType, Object fieldVal) {
-        return new StrictFill(fieldName, fieldType, () -> fieldVal);
+    public static <T, E extends T> StrictFill<T, E> of(String fieldName, Class<T> fieldType, E fieldVal) {
+        return new StrictFill<>(fieldName, fieldType, () -> fieldVal);
     }
 
-    public static StrictFill of(String fieldName, Class<?> fieldType, Supplier<Object> fieldVal) {
-        return new StrictFill(fieldName, fieldType, fieldVal);
+    public static <T, E extends T> StrictFill<T, E> of(String fieldName, Supplier<E> fieldVal, Class<T> fieldType) {
+        return new StrictFill<>(fieldName, fieldType, fieldVal);
     }
 }

+ 169 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/handlers/MetaObjectHandlerTest.java

@@ -0,0 +1,169 @@
+package com.baomidou.mybatisplus.core.handlers;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.core.MybatisConfiguration;
+import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.apache.ibatis.builder.MapperBuilderAssistant;
+import org.apache.ibatis.reflection.MetaObject;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * @author miemie
+ * @since 2020-06-11
+ */
+class MetaObjectHandlerTest {
+
+    private static final MybatisConfiguration configuration = new MybatisConfiguration();
+    private static final MapperBuilderAssistant assistant = new MapperBuilderAssistant(configuration, "");
+
+    @BeforeAll
+    static void initXt() {
+        TableInfoHelper.initTableInfo(assistant, Xt.class);
+    }
+
+    @Test
+    void strictInsertFill1() {
+        final MetaObjectHandler handler = new MetaObjectHandler() {
+
+            @Override
+            public void insertFill(MetaObject metaObject) {
+                strictInsertFill(metaObject, "name", String.class, "2222");
+                strictInsertFill(metaObject, "age", Integer.class, 222);
+                strictInsertFill(metaObject, "birthday", LocalDate.class, LocalDate.now());
+                strictInsertFill(metaObject, "dateTime", LocalDateTime.class, LocalDateTime.now());
+                // set 子类
+                strictInsertFill(metaObject, "ojbk", Ojbk.class, new OjbkXx());
+            }
+
+            @Override
+            public void updateFill(MetaObject metaObject) {
+            }
+        };
+
+        Xt xt = new Xt();
+        MetaObject metaObject = configuration.newMetaObject(xt);
+        handler.insertFill(metaObject);
+        check(xt);
+    }
+
+    @Test
+    void strictInsertFill2() {
+        final MetaObjectHandler handler = new MetaObjectHandler() {
+
+            @Override
+            public void insertFill(MetaObject metaObject) {
+                strictInsertFill(metaObject, "name", () -> "2222", String.class);
+                strictInsertFill(metaObject, "age", () -> 222, Integer.class);
+                strictInsertFill(metaObject, "birthday", LocalDate::now, LocalDate.class);
+                strictInsertFill(metaObject, "dateTime", LocalDateTime::now, LocalDateTime.class);
+                // set 子类
+                strictInsertFill(metaObject, "ojbk", OjbkXx::new, Ojbk.class);
+            }
+
+            @Override
+            public void updateFill(MetaObject metaObject) {
+            }
+        };
+
+        Xt xt = new Xt();
+        MetaObject metaObject = configuration.newMetaObject(xt);
+        handler.insertFill(metaObject);
+        check(xt);
+    }
+
+    @Test
+    void strictUpdateFill1() {
+        final MetaObjectHandler handler = new MetaObjectHandler() {
+
+            @Override
+            public void insertFill(MetaObject metaObject) {
+            }
+
+            @Override
+            public void updateFill(MetaObject metaObject) {
+                strictUpdateFill(metaObject, "name", String.class, "2222");
+                strictUpdateFill(metaObject, "age", Integer.class, 222);
+                strictUpdateFill(metaObject, "birthday", LocalDate.class, LocalDate.now());
+                strictUpdateFill(metaObject, "dateTime", LocalDateTime.class, LocalDateTime.now());
+                // set 子类
+                strictUpdateFill(metaObject, "ojbk", Ojbk.class, new OjbkXx());
+            }
+        };
+
+        Xt xt = new Xt();
+        MetaObject metaObject = configuration.newMetaObject(xt);
+        handler.updateFill(metaObject);
+        check(xt);
+    }
+
+    @Test
+    void strictUpdateFill2() {
+        final MetaObjectHandler handler = new MetaObjectHandler() {
+
+            @Override
+            public void insertFill(MetaObject metaObject) {
+            }
+
+            @Override
+            public void updateFill(MetaObject metaObject) {
+                strictUpdateFill(metaObject, "name", () -> "2222", String.class);
+                strictUpdateFill(metaObject, "age", () -> 222, Integer.class);
+                strictUpdateFill(metaObject, "birthday", LocalDate::now, LocalDate.class);
+                strictUpdateFill(metaObject, "dateTime", LocalDateTime::now, LocalDateTime.class);
+                // set 子类
+                strictUpdateFill(metaObject, "ojbk", OjbkXx::new, Ojbk.class);
+            }
+        };
+
+        Xt xt = new Xt();
+        MetaObject metaObject = configuration.newMetaObject(xt);
+        handler.updateFill(metaObject);
+        check(xt);
+    }
+
+    void check(Xt xt) {
+        System.out.println(xt);
+        assertThat(xt.getName()).isNotNull();
+        assertThat(xt.getAge()).isNotNull();
+        assertThat(xt.getBirthday()).isNotNull();
+        assertThat(xt.getDateTime()).isNotNull();
+        assertThat(xt.getOjbk()).isNotNull();
+    }
+
+    @Data
+    static class Xt {
+        private Long id;
+
+        @TableField(fill = FieldFill.INSERT_UPDATE)
+        private String name;
+        @TableField(fill = FieldFill.INSERT_UPDATE)
+        private Integer age;
+        @TableField(fill = FieldFill.INSERT_UPDATE)
+        private LocalDate birthday;
+        @TableField(fill = FieldFill.INSERT_UPDATE)
+        private LocalDateTime dateTime;
+        @TableField(fill = FieldFill.INSERT_UPDATE)
+        private Ojbk ojbk;
+    }
+
+    @Data
+    static class Ojbk {
+        private String xx = "木大木大木大木大,欧拉欧拉欧拉欧拉";
+    }
+
+    @Data
+    @ToString(callSuper = true)
+    @EqualsAndHashCode(callSuper = true)
+    static class OjbkXx extends Ojbk {
+    }
+}