Jelajahi Sumber

优化JSON敏感数据处理逻辑

woody 1 tahun lalu
induk
melakukan
790ed8c658
68 mengubah file dengan 878 tambahan dan 914 penghapusan
  1. 61 0
      framework-common/src/main/java/com/chelvc/framework/common/util/JacksonUtils.java
  2. 73 29
      framework-database/src/main/java/com/chelvc/framework/database/config/TypeHandlerConfigurer.java
  3. 153 55
      framework-database/src/main/java/com/chelvc/framework/database/context/DatabaseContextHolder.java
  4. 10 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/BooleanArrayTypeHandler.java
  5. 12 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/BooleanSetTypeHandler.java
  6. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/BooleansTypeHandler.java
  7. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/DeletedTypeHandler.java
  8. 10 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/DoubleArrayTypeHandler.java
  9. 12 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/DoubleSetTypeHandler.java
  10. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/DoublesTypeHandler.java
  11. 13 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/FileArrayTypeHandler.java
  12. 2 2
      framework-database/src/main/java/com/chelvc/framework/database/handler/FileSetTypeHandler.java
  13. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/FileTypeHandler.java
  14. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/FilesTypeHandler.java
  15. 10 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/FloatArrayTypeHandler.java
  16. 12 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/FloatSetTypeHandler.java
  17. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/FloatsTypeHandler.java
  18. 10 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/IntegerArrayTypeHandler.java
  19. 12 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/IntegerSetTypeHandler.java
  20. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/IntegersTypeHandler.java
  21. 213 5
      framework-database/src/main/java/com/chelvc/framework/database/handler/JsonTypeHandler.java
  22. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/ListTypeHandler.java
  23. 2 2
      framework-database/src/main/java/com/chelvc/framework/database/handler/ListsTypeHandler.java
  24. 10 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/LongArrayTypeHandler.java
  25. 12 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/LongSetTypeHandler.java
  26. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/LongsTypeHandler.java
  27. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/MapTypeHandler.java
  28. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/MapsTypeHandler.java
  29. 12 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/ModificationArrayTypeHandler.java
  30. 2 2
      framework-database/src/main/java/com/chelvc/framework/database/handler/ModificationSetTypeHandler.java
  31. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/ModificationTypeHandler.java
  32. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/ModificationsTypeHandler.java
  33. 12 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/PeriodArrayTypeHandler.java
  34. 2 2
      framework-database/src/main/java/com/chelvc/framework/database/handler/PeriodSetTypeHandler.java
  35. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/PeriodTypeHandler.java
  36. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/PeriodsTypeHandler.java
  37. 12 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/RegionArrayTypeHandler.java
  38. 2 2
      framework-database/src/main/java/com/chelvc/framework/database/handler/RegionSetTypeHandler.java
  39. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/RegionTypeHandler.java
  40. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/RegionsTypeHandler.java
  41. 45 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/SensitiveStringArrayTypeHandler.java
  42. 46 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/SensitiveStringSetTypeHandler.java
  43. 46 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/SensitiveStringsTypeHandler.java
  44. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/SetTypeHandler.java
  45. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/SetsTypeHandler.java
  46. 10 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/ShortArrayTypeHandler.java
  47. 12 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/ShortSetTypeHandler.java
  48. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/handler/ShortsTypeHandler.java
  49. 10 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/StringArrayTypeHandler.java
  50. 12 0
      framework-database/src/main/java/com/chelvc/framework/database/handler/StringSetTypeHandler.java
  51. 2 2
      framework-database/src/main/java/com/chelvc/framework/database/handler/StringsTypeHandler.java
  52. 0 12
      framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueBooleansTypeHandler.java
  53. 0 12
      framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueDoublesTypeHandler.java
  54. 0 12
      framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueFloatsTypeHandler.java
  55. 0 12
      framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueIntegersTypeHandler.java
  56. 0 12
      framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueLongsTypeHandler.java
  57. 0 12
      framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueShortsTypeHandler.java
  58. 0 12
      framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueStringsTypeHandler.java
  59. 6 9
      framework-database/src/main/java/com/chelvc/framework/database/interceptor/DynamicInvokeInterceptor.java
  60. 0 30
      framework-database/src/main/java/com/chelvc/framework/database/support/AbstractSelectMethod.java
  61. 0 48
      framework-database/src/main/java/com/chelvc/framework/database/support/EnhanceMapper.java
  62. 0 116
      framework-database/src/main/java/com/chelvc/framework/database/support/EnhanceService.java
  63. 0 4
      framework-database/src/main/java/com/chelvc/framework/database/support/EnhanceSqlInjector.java
  64. 0 21
      framework-database/src/main/java/com/chelvc/framework/database/support/GetMapsMethod.java
  65. 0 21
      framework-database/src/main/java/com/chelvc/framework/database/support/GetMapsPageMethod.java
  66. 0 19
      framework-database/src/main/java/com/chelvc/framework/database/support/GetObjectsMethod.java
  67. 0 19
      framework-database/src/main/java/com/chelvc/framework/database/support/GetPageMethod.java
  68. 0 422
      framework-database/src/main/java/com/chelvc/framework/database/support/Selects.java

+ 61 - 0
framework-common/src/main/java/com/chelvc/framework/common/util/JacksonUtils.java

@@ -11,10 +11,12 @@ import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.function.BiFunction;
+import java.util.stream.Collectors;
 
 import com.chelvc.framework.common.model.Paging;
 import com.chelvc.framework.common.model.Period;
@@ -1039,4 +1041,63 @@ public final class JacksonUtils {
         }
         return instance;
     }
+
+    /**
+     * 对象反序列化
+     *
+     * @param maps 对象属性/值映射表集合
+     * @param type 类型对象
+     * @param <T>  对象类型
+     * @return 对象实例
+     */
+    public static <T, M extends Map<String, ?>> List<T> deserialize(Collection<M> maps, @NonNull Class<T> type) {
+        return deserialize(maps, type, (field, value) -> value);
+    }
+
+    /**
+     * 对象反序列化
+     *
+     * @param maps     对象属性/值映射表集合
+     * @param type     类型对象
+     * @param function 字段值处理回调函数
+     * @param <T>      对象类型
+     * @return 对象实例
+     */
+    public static <T, M extends Map<String, ?>> List<T> deserialize(Collection<M> maps, @NonNull Class<T> type,
+                                                                    @NonNull BiFunction<Field, Object, Object> function) {
+        return deserialize(getDefaultSerializer(), maps, type, function);
+    }
+
+    /**
+     * 对象反序列化
+     *
+     * @param mapper 对象序列化处理器实例
+     * @param maps   对象属性/值映射表集合
+     * @param type   类型对象
+     * @param <T>    对象类型
+     * @return 对象实例
+     */
+    public static <T, M extends Map<String, ?>> List<T> deserialize(@NonNull ObjectMapper mapper, Collection<M> maps,
+                                                                    @NonNull Class<T> type) {
+        return deserialize(mapper, maps, type, (field, value) -> value);
+    }
+
+    /**
+     * 对象反序列化
+     *
+     * @param mapper   对象序列化处理器实例
+     * @param maps     对象属性/值映射表集合
+     * @param type     类型对象
+     * @param function 字段值处理回调函数
+     * @param <T>      对象类型
+     * @return 对象实例
+     */
+    public static <T, M extends Map<String, ?>> List<T> deserialize(@NonNull ObjectMapper mapper, Collection<M> maps,
+                                                                    @NonNull Class<T> type,
+                                                                    @NonNull BiFunction<Field, Object, Object> function) {
+        if (ObjectUtils.isEmpty(maps)) {
+            return Collections.emptyList();
+        }
+        return maps.stream().map(map -> deserialize(mapper, map, type, function)).collect(Collectors.toList());
+    }
 }

+ 73 - 29
framework-database/src/main/java/com/chelvc/framework/database/config/TypeHandlerConfigurer.java

@@ -42,36 +42,50 @@ import com.chelvc.framework.common.model.Region;
 import com.chelvc.framework.common.util.ObjectUtils;
 import com.chelvc.framework.common.util.StringUtils;
 import com.chelvc.framework.database.annotation.Sensitive;
+import com.chelvc.framework.database.handler.BooleanArrayTypeHandler;
+import com.chelvc.framework.database.handler.BooleanSetTypeHandler;
 import com.chelvc.framework.database.handler.BooleansTypeHandler;
+import com.chelvc.framework.database.handler.DoubleArrayTypeHandler;
+import com.chelvc.framework.database.handler.DoubleSetTypeHandler;
 import com.chelvc.framework.database.handler.DoublesTypeHandler;
+import com.chelvc.framework.database.handler.FileArrayTypeHandler;
+import com.chelvc.framework.database.handler.FileSetTypeHandler;
 import com.chelvc.framework.database.handler.FilesTypeHandler;
+import com.chelvc.framework.database.handler.FloatArrayTypeHandler;
+import com.chelvc.framework.database.handler.FloatSetTypeHandler;
 import com.chelvc.framework.database.handler.FloatsTypeHandler;
+import com.chelvc.framework.database.handler.IntegerArrayTypeHandler;
+import com.chelvc.framework.database.handler.IntegerSetTypeHandler;
 import com.chelvc.framework.database.handler.IntegersTypeHandler;
 import com.chelvc.framework.database.handler.JsonTypeHandler;
 import com.chelvc.framework.database.handler.ListTypeHandler;
 import com.chelvc.framework.database.handler.ListsTypeHandler;
+import com.chelvc.framework.database.handler.LongArrayTypeHandler;
+import com.chelvc.framework.database.handler.LongSetTypeHandler;
 import com.chelvc.framework.database.handler.LongsTypeHandler;
 import com.chelvc.framework.database.handler.MapTypeHandler;
 import com.chelvc.framework.database.handler.MapsTypeHandler;
+import com.chelvc.framework.database.handler.ModificationArrayTypeHandler;
+import com.chelvc.framework.database.handler.ModificationSetTypeHandler;
 import com.chelvc.framework.database.handler.ModificationsTypeHandler;
+import com.chelvc.framework.database.handler.PeriodArrayTypeHandler;
+import com.chelvc.framework.database.handler.PeriodSetTypeHandler;
 import com.chelvc.framework.database.handler.PeriodsTypeHandler;
+import com.chelvc.framework.database.handler.RegionArrayTypeHandler;
+import com.chelvc.framework.database.handler.RegionSetTypeHandler;
 import com.chelvc.framework.database.handler.RegionsTypeHandler;
+import com.chelvc.framework.database.handler.SensitiveStringArrayTypeHandler;
+import com.chelvc.framework.database.handler.SensitiveStringSetTypeHandler;
+import com.chelvc.framework.database.handler.SensitiveStringsTypeHandler;
 import com.chelvc.framework.database.handler.SensitiveTypeHandler;
 import com.chelvc.framework.database.handler.SetTypeHandler;
 import com.chelvc.framework.database.handler.SetsTypeHandler;
+import com.chelvc.framework.database.handler.ShortArrayTypeHandler;
+import com.chelvc.framework.database.handler.ShortSetTypeHandler;
 import com.chelvc.framework.database.handler.ShortsTypeHandler;
+import com.chelvc.framework.database.handler.StringArrayTypeHandler;
+import com.chelvc.framework.database.handler.StringSetTypeHandler;
 import com.chelvc.framework.database.handler.StringsTypeHandler;
-import com.chelvc.framework.database.handler.UniqueBooleansTypeHandler;
-import com.chelvc.framework.database.handler.UniqueDoublesTypeHandler;
-import com.chelvc.framework.database.handler.UniqueFilesTypeHandler;
-import com.chelvc.framework.database.handler.UniqueFloatsTypeHandler;
-import com.chelvc.framework.database.handler.UniqueIntegersTypeHandler;
-import com.chelvc.framework.database.handler.UniqueLongsTypeHandler;
-import com.chelvc.framework.database.handler.UniqueModificationsTypeHandler;
-import com.chelvc.framework.database.handler.UniquePeriodsTypeHandler;
-import com.chelvc.framework.database.handler.UniqueRegionsTypeHandler;
-import com.chelvc.framework.database.handler.UniqueShortsTypeHandler;
-import com.chelvc.framework.database.handler.UniqueStringsTypeHandler;
 import com.chelvc.framework.database.sql.CallableStringDecrypter;
 import com.chelvc.framework.database.sql.ResultStringDecrypter;
 import com.chelvc.framework.database.sql.WriteStringEncryptor;
@@ -243,27 +257,27 @@ public class TypeHandlerConfigurer extends MybatisConfigurer {
             Type arg = ((ParameterizedType) type).getActualTypeArguments()[0];
             if (raw == Set.class) {
                 if (arg == int.class || arg == Integer.class) {
-                    return UniqueIntegersTypeHandler.class;
+                    return IntegerSetTypeHandler.class;
                 } else if (arg == short.class || arg == Short.class) {
-                    return UniqueShortsTypeHandler.class;
+                    return ShortSetTypeHandler.class;
                 } else if (arg == long.class || arg == Long.class) {
-                    return UniqueLongsTypeHandler.class;
+                    return LongSetTypeHandler.class;
                 } else if (arg == float.class || arg == Float.class) {
-                    return UniqueFloatsTypeHandler.class;
+                    return FloatSetTypeHandler.class;
                 } else if (arg == double.class || arg == Double.class) {
-                    return UniqueDoublesTypeHandler.class;
+                    return DoubleSetTypeHandler.class;
                 } else if (arg == boolean.class || arg == Boolean.class) {
-                    return UniqueBooleansTypeHandler.class;
+                    return BooleanSetTypeHandler.class;
                 } else if (arg == String.class) {
-                    return UniqueStringsTypeHandler.class;
+                    return StringSetTypeHandler.class;
                 } else if (arg == File.class) {
-                    return UniqueFilesTypeHandler.class;
+                    return FileSetTypeHandler.class;
                 } else if (arg == Period.class) {
-                    return UniquePeriodsTypeHandler.class;
+                    return PeriodSetTypeHandler.class;
                 } else if (arg == Region.class) {
-                    return UniqueRegionsTypeHandler.class;
+                    return RegionSetTypeHandler.class;
                 } else if (arg == Modification.class) {
-                    return UniqueModificationsTypeHandler.class;
+                    return ModificationSetTypeHandler.class;
                 }
             } else if (raw == List.class) {
                 if (arg == int.class || arg == Integer.class) {
@@ -296,6 +310,31 @@ public class TypeHandlerConfigurer extends MybatisConfigurer {
                     return ListsTypeHandler.class;
                 }
             }
+        } else if (type instanceof Class && ((Class<?>) type).isArray()) {
+            Class<?> component = ((Class<?>) type).getComponentType();
+            if (component == int.class || component == Integer.class) {
+                return IntegerArrayTypeHandler.class;
+            } else if (component == short.class || component == Short.class) {
+                return ShortArrayTypeHandler.class;
+            } else if (component == long.class || component == Long.class) {
+                return LongArrayTypeHandler.class;
+            } else if (component == float.class || component == Float.class) {
+                return FloatArrayTypeHandler.class;
+            } else if (component == double.class || component == Double.class) {
+                return DoubleArrayTypeHandler.class;
+            } else if (component == boolean.class || component == Boolean.class) {
+                return BooleanArrayTypeHandler.class;
+            } else if (component == String.class) {
+                return StringArrayTypeHandler.class;
+            } else if (component == File.class) {
+                return FileArrayTypeHandler.class;
+            } else if (component == Period.class) {
+                return PeriodArrayTypeHandler.class;
+            } else if (component == Region.class) {
+                return RegionArrayTypeHandler.class;
+            } else if (component == Modification.class) {
+                return ModificationArrayTypeHandler.class;
+            }
         }
         return this.handlers.computeIfAbsent(type, this::initializeJsonHandlerClass);
     }
@@ -321,16 +360,21 @@ public class TypeHandlerConfigurer extends MybatisConfigurer {
         if (((handler == null && (handler = ObjectUtils.ifNull(annotation, TableField::typeHandler)) == null)
                 || handler == UnknownTypeHandler.class) && !this.isTypeHandlerRegistered(model)) {
             handler = this.lookupJsonHandlerClass(type);
+            if (field.isAnnotationPresent(Sensitive.class)) {
+                if (handler == StringsTypeHandler.class) {
+                    return SensitiveStringsTypeHandler.class;
+                } else if (handler == StringSetTypeHandler.class) {
+                    return SensitiveStringSetTypeHandler.class;
+                } else if (handler == StringArrayTypeHandler.class) {
+                    return SensitiveStringArrayTypeHandler.class;
+                }
+            }
+            return handler;
         }
 
         // 如果是敏感字段,则初始化敏感字段类型处理器
-        if (field.isAnnotationPresent(Sensitive.class)) {
-            if (handler == null && model != String.class) {
-                log.warn("Sensitive type handler does not matches: {}.{}", clazz.getName(), field.getName());
-                return null;
-            } else if (handler != null && SensitiveTypeHandler.class.isAssignableFrom(handler)) {
-                log.warn("Sensitive type handler is already exists: {}.{}", clazz.getName(), field.getName());
-            }
+        if (model == String.class && field.isAnnotationPresent(Sensitive.class)
+                && (handler == null || !SensitiveTypeHandler.class.isAssignableFrom(handler))) {
             handler = this.initializeSensitiveHandlerClass(model, handler);
         }
         return handler;

+ 153 - 55
framework-database/src/main/java/com/chelvc/framework/database/context/DatabaseContextHolder.java

@@ -10,6 +10,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -35,7 +36,6 @@ import com.chelvc.framework.common.model.Pagination;
 import com.chelvc.framework.common.model.Paging;
 import com.chelvc.framework.common.util.AESUtils;
 import com.chelvc.framework.common.util.AssertUtils;
-import com.chelvc.framework.common.util.JacksonUtils;
 import com.chelvc.framework.common.util.ObjectUtils;
 import com.chelvc.framework.database.annotation.Sensitive;
 import com.chelvc.framework.database.config.DatabaseProperties;
@@ -73,11 +73,6 @@ public final class DatabaseContextHolder {
      */
     private static final Map<Class<?>, TypeHandler<?>> TYPE_HANDLER_MAPPING = Maps.newConcurrentMap();
 
-    /**
-     * 类对象/敏感字段映射表
-     */
-    private static final Map<Class<?>, Map<String, Field>> CLASS_SENSITIVE_FIELD_MAPPING = Maps.newConcurrentMap();
-
     /**
      * 表名称/字段名称/上下文映射表
      */
@@ -292,6 +287,82 @@ public final class DatabaseContextHolder {
         return plaintext;
     }
 
+    /**
+     * 数据加密
+     *
+     * @param plaintexts 明文数组
+     * @return 密文数组
+     */
+    public static String[] encrypt(String... plaintexts) {
+        return encrypt(plaintexts, false);
+    }
+
+    /**
+     * 数据加密
+     *
+     * @param plaintexts 明文集合
+     * @return 密文集合
+     */
+    public static Set<String> encrypt(Set<String> plaintexts) {
+        return encrypt(plaintexts, false);
+    }
+
+    /**
+     * 数据加密
+     *
+     * @param plaintexts 明文列表
+     * @return 密文列表
+     */
+    public static List<String> encrypt(List<String> plaintexts) {
+        return encrypt(plaintexts, false);
+    }
+
+    /**
+     * 数据加密
+     *
+     * @param plaintexts 明文数组
+     * @param force      是否忽略异常
+     * @return 密文数组
+     */
+    public static String[] encrypt(String[] plaintexts, boolean force) {
+        if (ObjectUtils.isEmpty(plaintexts)) {
+            return plaintexts;
+        }
+        String[] ciphertexts = new String[plaintexts.length];
+        for (int i = 0; i < plaintexts.length; i++) {
+            ciphertexts[i] = encrypt(plaintexts[i], force);
+        }
+        return ciphertexts;
+    }
+
+    /**
+     * 数据加密
+     *
+     * @param plaintexts 明文集合
+     * @param force      是否忽略异常
+     * @return 密文集合
+     */
+    public static Set<String> encrypt(Set<String> plaintexts, boolean force) {
+        if (ObjectUtils.isEmpty(plaintexts)) {
+            return plaintexts;
+        }
+        return plaintexts.stream().map(plaintext -> encrypt(plaintext, force)).collect(Collectors.toSet());
+    }
+
+    /**
+     * 数据加密
+     *
+     * @param plaintexts 明文列表
+     * @param force      是否忽略异常
+     * @return 密文列表
+     */
+    public static List<String> encrypt(List<String> plaintexts, boolean force) {
+        if (ObjectUtils.isEmpty(plaintexts)) {
+            return plaintexts;
+        }
+        return plaintexts.stream().map(plaintext -> encrypt(plaintext, force)).collect(Collectors.toList());
+    }
+
     /**
      * 数据解密
      *
@@ -325,6 +396,82 @@ public final class DatabaseContextHolder {
         return ciphertext;
     }
 
+    /**
+     * 数据解密
+     *
+     * @param ciphertexts 密文数组
+     * @return 明文数组
+     */
+    public static String[] decrypt(String... ciphertexts) {
+        return decrypt(ciphertexts, false);
+    }
+
+    /**
+     * 数据解密
+     *
+     * @param ciphertexts 密文集合
+     * @return 明文列表
+     */
+    public static Set<String> decrypt(Set<String> ciphertexts) {
+        return decrypt(ciphertexts, false);
+    }
+
+    /**
+     * 数据解密
+     *
+     * @param ciphertexts 密文列表
+     * @return 明文列表
+     */
+    public static List<String> decrypt(List<String> ciphertexts) {
+        return decrypt(ciphertexts, false);
+    }
+
+    /**
+     * 数据解密
+     *
+     * @param ciphertexts 密文数组
+     * @param force       是否忽略异常
+     * @return 明文数组
+     */
+    public static String[] decrypt(String[] ciphertexts, boolean force) {
+        if (ObjectUtils.isEmpty(ciphertexts)) {
+            return ciphertexts;
+        }
+        String[] plaintexts = new String[ciphertexts.length];
+        for (int i = 0; i < ciphertexts.length; i++) {
+            plaintexts[i] = decrypt(ciphertexts[i], force);
+        }
+        return plaintexts;
+    }
+
+    /**
+     * 数据解密
+     *
+     * @param ciphertexts 密文集合
+     * @param force       是否忽略异常
+     * @return 明文集合
+     */
+    public static Set<String> decrypt(Set<String> ciphertexts, boolean force) {
+        if (ObjectUtils.isEmpty(ciphertexts)) {
+            return ciphertexts;
+        }
+        return ciphertexts.stream().map(ciphertext -> decrypt(ciphertext, force)).collect(Collectors.toSet());
+    }
+
+    /**
+     * 数据解密
+     *
+     * @param ciphertexts 密文列表
+     * @param force       是否忽略异常
+     * @return 明文列表
+     */
+    public static List<String> decrypt(List<String> ciphertexts, boolean force) {
+        if (ObjectUtils.isEmpty(ciphertexts)) {
+            return ciphertexts;
+        }
+        return ciphertexts.stream().map(ciphertext -> decrypt(ciphertext, force)).collect(Collectors.toList());
+    }
+
     /**
      * 数据更新或忽略
      *
@@ -411,31 +558,6 @@ public final class DatabaseContextHolder {
         return model == Object.class ? null : model;
     }
 
-    /**
-     * 获取对象敏感字段
-     *
-     * @param clazz 对象类型
-     * @return 敏感字段或者属性名称/字段映射表
-     */
-    public static Map<String, Field> getSensitiveFields(@NonNull Class<?> clazz) {
-        return CLASS_SENSITIVE_FIELD_MAPPING.computeIfAbsent(clazz, k -> {
-            Map<String, Field> fields = ObjectUtils.getAllFields(clazz);
-            if (ObjectUtils.isEmpty(fields)) {
-                return Collections.emptyMap();
-            }
-            Map<String, Field> sensitives = Maps.newHashMap();
-            for (Map.Entry<String, Field> entry : fields.entrySet()) {
-                if (entry.getValue().isAnnotationPresent(Sensitive.class)) {
-                    sensitives.put(entry.getKey(), entry.getValue());
-                }
-            }
-            if (sensitives.isEmpty()) {
-                return Collections.emptyMap();
-            }
-            return Collections.unmodifiableMap(Maps.newHashMap(sensitives));
-        });
-    }
-
     /**
      * 获取表字段名称/上下文映射表
      *
@@ -537,30 +659,6 @@ public final class DatabaseContextHolder {
         });
     }
 
-    /**
-     * 对象反序列化
-     *
-     * @param maps 对象属性/值映射表集合
-     * @param type 类型对象
-     * @param <T>  对象类型
-     * @param <M>  字典类型
-     * @param <C>  集合类型
-     * @return 对象实例列表
-     */
-    public static <T, M extends Map<String, ?>, C extends Collection<M>> List<T> deserialize(C maps,
-                                                                                             @NonNull Class<T> type) {
-        if (ObjectUtils.isEmpty(maps)) {
-            return Collections.emptyList();
-        }
-        Map<String, Field> sensitives = getSensitiveFields(type);
-        return maps.stream().map(map -> JacksonUtils.deserialize(map, type, (field, value) -> {
-            if (value instanceof String && sensitives.containsKey(field.getName())) {
-                return DatabaseContextHolder.decrypt((String) value, true);
-            }
-            return value;
-        })).collect(Collectors.toList());
-    }
-
     /**
      * 根据包名查找数据模型对象
      *

+ 10 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/BooleanArrayTypeHandler.java

@@ -0,0 +1,10 @@
+package com.chelvc.framework.database.handler;
+
+/**
+ * 真假值数组字段处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class BooleanArrayTypeHandler extends JsonTypeHandler.Default<Boolean[]> {
+}

+ 12 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/BooleanSetTypeHandler.java

@@ -0,0 +1,12 @@
+package com.chelvc.framework.database.handler;
+
+import java.util.Set;
+
+/**
+ * 真假值集合字段处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class BooleanSetTypeHandler extends JsonTypeHandler.Default<Set<Boolean>> {
+}

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/BooleansTypeHandler.java

@@ -6,7 +6,7 @@ import java.util.List;
  * 真假值列表字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class BooleansTypeHandler extends JsonTypeHandler.Default<List<Boolean>> {
 }

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/DeletedTypeHandler.java

@@ -14,7 +14,7 @@ import org.apache.ibatis.type.JdbcType;
  * 当删除标记为true时,将字段值设置为当前时间戳,用于与其他字段一起用作唯一索引时排除已删除的数据
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class DeletedTypeHandler extends BaseTypeHandler<Boolean> {
     @Override

+ 10 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/DoubleArrayTypeHandler.java

@@ -0,0 +1,10 @@
+package com.chelvc.framework.database.handler;
+
+/**
+ * 双精度浮点数数组字段处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class DoubleArrayTypeHandler extends JsonTypeHandler.Default<Double[]> {
+}

+ 12 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/DoubleSetTypeHandler.java

@@ -0,0 +1,12 @@
+package com.chelvc.framework.database.handler;
+
+import java.util.Set;
+
+/**
+ * 双精度浮点数集合字段处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class DoubleSetTypeHandler extends JsonTypeHandler.Default<Set<Double>> {
+}

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/DoublesTypeHandler.java

@@ -6,7 +6,7 @@ import java.util.List;
  * 双精度浮点数列表字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class DoublesTypeHandler extends JsonTypeHandler.Default<List<Double>> {
 }

+ 13 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/FileArrayTypeHandler.java

@@ -0,0 +1,13 @@
+package com.chelvc.framework.database.handler;
+
+
+import com.chelvc.framework.common.model.File;
+
+/**
+ * 文件信息数组字段类型处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class FileArrayTypeHandler extends JsonTypeHandler.Default<File[]> {
+}

+ 2 - 2
framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueFilesTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/FileSetTypeHandler.java

@@ -5,10 +5,10 @@ import java.util.Set;
 import com.chelvc.framework.common.model.File;
 
 /**
- * 唯一的文件信息列表字段类型处理实现
+ * 文件信息集合字段类型处理实现
  *
  * @author Woody
  * @date 2024/4/3
  */
-public class UniqueFilesTypeHandler extends JsonTypeHandler.Default<Set<File>> {
+public class FileSetTypeHandler extends JsonTypeHandler.Default<Set<File>> {
 }

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/FileTypeHandler.java

@@ -6,7 +6,7 @@ import com.chelvc.framework.common.model.File;
  * 文件信息字段类型处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class FileTypeHandler extends JsonTypeHandler.Default<File> {
 }

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/FilesTypeHandler.java

@@ -8,7 +8,7 @@ import com.chelvc.framework.common.model.File;
  * 文件信息列表字段类型处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class FilesTypeHandler extends JsonTypeHandler.Default<List<File>> {
 }

+ 10 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/FloatArrayTypeHandler.java

@@ -0,0 +1,10 @@
+package com.chelvc.framework.database.handler;
+
+/**
+ * 单精度浮点数数组字段处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class FloatArrayTypeHandler extends JsonTypeHandler.Default<Float[]> {
+}

+ 12 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/FloatSetTypeHandler.java

@@ -0,0 +1,12 @@
+package com.chelvc.framework.database.handler;
+
+import java.util.Set;
+
+/**
+ * 单精度浮点数集合字段处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class FloatSetTypeHandler extends JsonTypeHandler.Default<Set<Float>> {
+}

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/FloatsTypeHandler.java

@@ -6,7 +6,7 @@ import java.util.List;
  * 单精度浮点数列表字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class FloatsTypeHandler extends JsonTypeHandler.Default<List<Float>> {
 }

+ 10 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/IntegerArrayTypeHandler.java

@@ -0,0 +1,10 @@
+package com.chelvc.framework.database.handler;
+
+/**
+ * 整数数组字段处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class IntegerArrayTypeHandler extends JsonTypeHandler.Default<Integer[]> {
+}

+ 12 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/IntegerSetTypeHandler.java

@@ -0,0 +1,12 @@
+package com.chelvc.framework.database.handler;
+
+import java.util.Set;
+
+/**
+ * 整数集合字段处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class IntegerSetTypeHandler extends JsonTypeHandler.Default<Set<Integer>> {
+}

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/IntegersTypeHandler.java

@@ -6,7 +6,7 @@ import java.util.List;
  * 整数列表字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class IntegersTypeHandler extends JsonTypeHandler.Default<List<Integer>> {
 }

+ 213 - 5
framework-database/src/main/java/com/chelvc/framework/database/handler/JsonTypeHandler.java

@@ -1,14 +1,36 @@
 package com.chelvc.framework.database.handler;
 
+import java.io.IOException;
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Types;
+import java.util.List;
+import java.util.Set;
 
 import com.chelvc.framework.common.util.JacksonUtils;
 import com.chelvc.framework.common.util.ObjectUtils;
+import com.chelvc.framework.database.annotation.Sensitive;
+import com.chelvc.framework.database.context.DatabaseContextHolder;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.Version;
+import com.fasterxml.jackson.databind.AnnotationIntrospector;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.introspect.Annotated;
+import com.fasterxml.jackson.databind.type.CollectionType;
 import lombok.NonNull;
 import org.apache.ibatis.executor.result.ResultMapException;
 import org.apache.ibatis.type.JdbcType;
@@ -21,9 +43,195 @@ import org.apache.ibatis.type.TypeReference;
  *
  * @param <T> 对象类型
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public interface JsonTypeHandler<T> extends TypeHandler<T> {
+    /**
+     * 敏感字符串序列化处理器
+     */
+    class SensitiveSerializer extends JsonSerializer<String> {
+        @Override
+        public void serialize(String value, JsonGenerator generator, SerializerProvider provider) throws IOException {
+            if (DatabaseContextHolder.isSensitiveWritable()) {
+                value = DatabaseContextHolder.encrypt(value, true);
+            }
+            generator.writeString(value);
+        }
+    }
+
+    /**
+     * 敏感字符串集合序列化处理器
+     */
+    class SensitiveSetSerializer extends JsonSerializer<Set<String>> {
+        @Override
+        public void serialize(Set<String> value, JsonGenerator generator, SerializerProvider provider)
+                throws IOException {
+            if (DatabaseContextHolder.isSensitiveWritable()) {
+                value = DatabaseContextHolder.encrypt(value, true);
+            }
+            generator.writeObject(value);
+        }
+    }
+
+    /**
+     * 敏感字符串列表序列化处理器
+     */
+    class SensitiveListSerializer extends JsonSerializer<List<String>> {
+        @Override
+        public void serialize(List<String> value, JsonGenerator generator, SerializerProvider provider)
+                throws IOException {
+            if (DatabaseContextHolder.isSensitiveWritable()) {
+                value = DatabaseContextHolder.encrypt(value, true);
+            }
+            generator.writeObject(value);
+        }
+    }
+
+    /**
+     * 敏感字符串数组序列化处理器
+     */
+    class SensitiveArraySerializer extends JsonSerializer<String[]> {
+        @Override
+        public void serialize(String[] value, JsonGenerator generator, SerializerProvider provider)
+                throws IOException {
+            if (DatabaseContextHolder.isSensitiveWritable()) {
+                value = DatabaseContextHolder.encrypt(value, true);
+            }
+            generator.writeObject(value);
+        }
+    }
+
+    /**
+     * 敏感字符串反序列化处理器
+     */
+    class SensitiveDeserializer extends JsonDeserializer<String> {
+        @Override
+        public String deserialize(JsonParser parser, DeserializationContext context)
+                throws IOException, JsonProcessingException {
+            return DatabaseContextHolder.decrypt(parser.getValueAsString(), true);
+        }
+    }
+
+    /**
+     * 敏感字符串集合反序列化处理器
+     */
+    class SensitiveSetDeserializer extends JsonDeserializer<Set<String>> {
+        private static final com.fasterxml.jackson.core.type.TypeReference<Set<String>> TYPE =
+                new com.fasterxml.jackson.core.type.TypeReference<Set<String>>() {
+                };
+
+        @Override
+        public Set<String> deserialize(JsonParser parser, DeserializationContext context)
+                throws IOException, JsonProcessingException {
+            Set<String> values = parser.readValueAs(TYPE);
+            return DatabaseContextHolder.decrypt(values, true);
+        }
+    }
+
+    /**
+     * 敏感字符串列表反序列化处理器
+     */
+    class SensitiveListDeserializer extends JsonDeserializer<List<String>> {
+        private static final com.fasterxml.jackson.core.type.TypeReference<List<String>> TYPE =
+                new com.fasterxml.jackson.core.type.TypeReference<List<String>>() {
+                };
+
+        @Override
+        public List<String> deserialize(JsonParser parser, DeserializationContext context)
+                throws IOException, JsonProcessingException {
+            List<String> values = parser.readValueAs(TYPE);
+            return DatabaseContextHolder.decrypt(values, true);
+        }
+    }
+
+    /**
+     * 敏感字符串数组反序列化处理器
+     */
+    class SensitiveArrayDeserializer extends JsonDeserializer<String[]> {
+        private static final com.fasterxml.jackson.core.type.TypeReference<String[]> TYPE =
+                new com.fasterxml.jackson.core.type.TypeReference<String[]>() {
+                };
+
+        @Override
+        public String[] deserialize(JsonParser parser, DeserializationContext context)
+                throws IOException, JsonProcessingException {
+            String[] values = parser.readValueAs(TYPE);
+            return DatabaseContextHolder.decrypt(values, true);
+        }
+    }
+
+    /**
+     * 对象JSON序列化/反序列化处理器实例
+     */
+    ObjectMapper mapper = JacksonUtils.initializeSerializer().setAnnotationIntrospector(new AnnotationIntrospector() {
+        @Override
+        public Version version() {
+            return Version.unknownVersion();
+        }
+
+        @Override
+        public Object findSerializer(Annotated am) {
+            if (!am.hasAnnotation(Sensitive.class)) {
+                return null;
+            }
+            JavaType type = am.getType();
+            Class<?> raw = am.getRawType();
+            if (raw == String.class) {
+                return SensitiveSerializer.class;
+            } else if (raw.isArray() && raw.getComponentType() == String.class) {
+                return SensitiveArraySerializer.class;
+            } else if (type instanceof CollectionType && type.getContentType().getRawClass() == String.class) {
+                if (Set.class.isAssignableFrom(type.getRawClass())) {
+                    return SensitiveSetSerializer.class;
+                }
+                return SensitiveListSerializer.class;
+            }
+            return null;
+        }
+
+        @Override
+        public Object findDeserializer(Annotated am) {
+            if (!am.hasAnnotation(Sensitive.class)) {
+                return null;
+            }
+            AnnotatedElement element = am.getAnnotated();
+            if (element instanceof Method) {
+                Parameter[] parameters = ((Method) element).getParameters();
+                if (ObjectUtils.notEmpty(parameters) && parameters.length > 0) {
+                    Type type = parameters[0].getParameterizedType();
+                    if (type == String.class) {
+                        return SensitiveDeserializer.class;
+                    } else if (type instanceof ParameterizedType) {
+                        Type raw = ((ParameterizedType) type).getRawType();
+                        Type arg = ((ParameterizedType) type).getActualTypeArguments()[0];
+                        if (raw == Set.class && arg == String.class) {
+                            return SensitiveSetDeserializer.class;
+                        } else if (raw == List.class && arg == String.class) {
+                            return SensitiveListDeserializer.class;
+                        }
+                    } else if (type instanceof Class<?> && ((Class<?>) type).isArray()
+                            && ((Class<?>) type).getComponentType() == String.class) {
+                        return SensitiveArrayDeserializer.class;
+                    }
+                }
+            } else {
+                JavaType type = am.getType();
+                Class<?> raw = am.getRawType();
+                if (raw == String.class) {
+                    return SensitiveDeserializer.class;
+                } else if (raw.isArray() && raw.getComponentType() == String.class) {
+                    return SensitiveArrayDeserializer.class;
+                } else if (type instanceof CollectionType && type.getContentType().getRawClass() == String.class) {
+                    if (Set.class.isAssignableFrom(type.getRawClass())) {
+                        return SensitiveSetDeserializer.class;
+                    }
+                    return SensitiveListDeserializer.class;
+                }
+            }
+            return null;
+        }
+    });
+
     /**
      * 获取对象类型
      *
@@ -99,7 +307,7 @@ public interface JsonTypeHandler<T> extends TypeHandler<T> {
         if (ObjectUtils.isBlank(parameter)) {
             ps.setNull(i, Types.VARCHAR);
         } else {
-            ps.setString(i, JacksonUtils.serialize(parameter));
+            ps.setString(i, JacksonUtils.serialize(mapper, parameter));
         }
     }
 
@@ -113,7 +321,7 @@ public interface JsonTypeHandler<T> extends TypeHandler<T> {
      */
     @SuppressWarnings("unchecked")
     default T getNullableResult(ResultSet rs, String columnName) throws SQLException {
-        return (T) JacksonUtils.deserialize(rs.getString(columnName), this.getRawType());
+        return (T) JacksonUtils.deserialize(mapper, rs.getString(columnName), this.getRawType());
     }
 
     /**
@@ -126,7 +334,7 @@ public interface JsonTypeHandler<T> extends TypeHandler<T> {
      */
     @SuppressWarnings("unchecked")
     default T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
-        return (T) JacksonUtils.deserialize(rs.getString(columnIndex), this.getRawType());
+        return (T) JacksonUtils.deserialize(mapper, rs.getString(columnIndex), this.getRawType());
     }
 
     /**
@@ -139,7 +347,7 @@ public interface JsonTypeHandler<T> extends TypeHandler<T> {
      */
     @SuppressWarnings("unchecked")
     default T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
-        return (T) JacksonUtils.deserialize(cs.getString(columnIndex), this.getRawType());
+        return (T) JacksonUtils.deserialize(mapper, cs.getString(columnIndex), this.getRawType());
     }
 
     /**

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/ListTypeHandler.java

@@ -6,7 +6,7 @@ import java.util.List;
  * 列表字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class ListTypeHandler extends JsonTypeHandler.Default<List<?>> {
 }

+ 2 - 2
framework-database/src/main/java/com/chelvc/framework/database/handler/ListsTypeHandler.java

@@ -3,10 +3,10 @@ package com.chelvc.framework.database.handler;
 import java.util.List;
 
 /**
- * 列表字段处理实现
+ * 二维列表字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class ListsTypeHandler extends JsonTypeHandler.Default<List<List<?>>> {
 }

+ 10 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/LongArrayTypeHandler.java

@@ -0,0 +1,10 @@
+package com.chelvc.framework.database.handler;
+
+/**
+ * 长整数数组字段处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class LongArrayTypeHandler extends JsonTypeHandler.Default<Long[]> {
+}

+ 12 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/LongSetTypeHandler.java

@@ -0,0 +1,12 @@
+package com.chelvc.framework.database.handler;
+
+import java.util.Set;
+
+/**
+ * 长整数集合字段处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class LongSetTypeHandler extends JsonTypeHandler.Default<Set<Long>> {
+}

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/LongsTypeHandler.java

@@ -6,7 +6,7 @@ import java.util.List;
  * 长整数列表字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class LongsTypeHandler extends JsonTypeHandler.Default<List<Long>> {
 }

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/MapTypeHandler.java

@@ -6,7 +6,7 @@ import java.util.Map;
  * 字典字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class MapTypeHandler extends JsonTypeHandler.Default<Map<?, ?>> {
 }

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/MapsTypeHandler.java

@@ -7,7 +7,7 @@ import java.util.Map;
  * 字典列表字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class MapsTypeHandler extends JsonTypeHandler.Default<List<Map<?, ?>>> {
 }

+ 12 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/ModificationArrayTypeHandler.java

@@ -0,0 +1,12 @@
+package com.chelvc.framework.database.handler;
+
+import com.chelvc.framework.common.model.Modification;
+
+/**
+ * 对象更新信息数组字段类型处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class ModificationArrayTypeHandler extends JsonTypeHandler.Default<Modification[]> {
+}

+ 2 - 2
framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueModificationsTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/ModificationSetTypeHandler.java

@@ -5,10 +5,10 @@ import java.util.Set;
 import com.chelvc.framework.common.model.Modification;
 
 /**
- * 唯一的对象更新信息列表字段类型处理实现
+ * 对象更新信息集合字段类型处理实现
  *
  * @author Woody
  * @date 2024/4/3
  */
-public class UniqueModificationsTypeHandler extends JsonTypeHandler.Default<Set<Modification>> {
+public class ModificationSetTypeHandler extends JsonTypeHandler.Default<Set<Modification>> {
 }

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/ModificationTypeHandler.java

@@ -6,7 +6,7 @@ import com.chelvc.framework.common.model.Modification;
  * 对象更新信息字段类型处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class ModificationTypeHandler extends JsonTypeHandler.Default<Modification> {
 }

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/ModificationsTypeHandler.java

@@ -8,7 +8,7 @@ import com.chelvc.framework.common.model.Modification;
  * 对象更新信息列表字段类型处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class ModificationsTypeHandler extends JsonTypeHandler.Default<List<Modification>> {
 }

+ 12 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/PeriodArrayTypeHandler.java

@@ -0,0 +1,12 @@
+package com.chelvc.framework.database.handler;
+
+import com.chelvc.framework.common.model.Period;
+
+/**
+ * 时间周期数组字段处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class PeriodArrayTypeHandler extends JsonTypeHandler.Default<Period[]> {
+}

+ 2 - 2
framework-database/src/main/java/com/chelvc/framework/database/handler/UniquePeriodsTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/PeriodSetTypeHandler.java

@@ -5,10 +5,10 @@ import java.util.Set;
 import com.chelvc.framework.common.model.Period;
 
 /**
- * 唯一的时间周期列表字段处理实现
+ * 时间周期集合字段处理实现
  *
  * @author Woody
  * @date 2024/4/3
  */
-public class UniquePeriodsTypeHandler extends JsonTypeHandler.Default<Set<Period>> {
+public class PeriodSetTypeHandler extends JsonTypeHandler.Default<Set<Period>> {
 }

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/PeriodTypeHandler.java

@@ -13,7 +13,7 @@ import org.apache.ibatis.type.JdbcType;
  * 时间周期字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class PeriodTypeHandler extends BaseTypeHandler<Period> {
     @Override

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/PeriodsTypeHandler.java

@@ -8,7 +8,7 @@ import com.chelvc.framework.common.model.Period;
  * 时间周期列表字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class PeriodsTypeHandler extends JsonTypeHandler.Default<List<Period>> {
 }

+ 12 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/RegionArrayTypeHandler.java

@@ -0,0 +1,12 @@
+package com.chelvc.framework.database.handler;
+
+import com.chelvc.framework.common.model.Region;
+
+/**
+ * 地区数组字段处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class RegionArrayTypeHandler extends JsonTypeHandler.Default<Region[]> {
+}

+ 2 - 2
framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueRegionsTypeHandler.java → framework-database/src/main/java/com/chelvc/framework/database/handler/RegionSetTypeHandler.java

@@ -5,10 +5,10 @@ import java.util.Set;
 import com.chelvc.framework.common.model.Region;
 
 /**
- * 唯一的地区字段处理实现
+ * 地区集合字段处理实现
  *
  * @author Woody
  * @date 2024/4/3
  */
-public class UniqueRegionsTypeHandler extends JsonTypeHandler.Default<Set<Region>> {
+public class RegionSetTypeHandler extends JsonTypeHandler.Default<Set<Region>> {
 }

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/RegionTypeHandler.java

@@ -13,7 +13,7 @@ import org.apache.ibatis.type.JdbcType;
  * 地区字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class RegionTypeHandler extends BaseTypeHandler<Region> {
     @Override

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/RegionsTypeHandler.java

@@ -8,7 +8,7 @@ import com.chelvc.framework.common.model.Region;
  * 地区字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class RegionsTypeHandler extends JsonTypeHandler.Default<List<Region>> {
 }

+ 45 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/SensitiveStringArrayTypeHandler.java

@@ -0,0 +1,45 @@
+package com.chelvc.framework.database.handler;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import com.chelvc.framework.common.util.ObjectUtils;
+import com.chelvc.framework.database.context.DatabaseContextHolder;
+import org.apache.ibatis.type.JdbcType;
+
+/**
+ * 敏感字符串数组字段处理实现
+ *
+ * @author Woody
+ * @date 2024/6/18
+ */
+public class SensitiveStringArrayTypeHandler extends StringArrayTypeHandler {
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType)
+            throws SQLException {
+        if (ObjectUtils.notEmpty(parameter) && DatabaseContextHolder.isSensitiveWritable()) {
+            parameter = DatabaseContextHolder.encrypt(parameter, true);
+        }
+        super.setNonNullParameter(ps, i, parameter, jdbcType);
+    }
+
+    @Override
+    public String[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        String[] values = super.getNullableResult(rs, columnName);
+        return ObjectUtils.isEmpty(values) ? values : DatabaseContextHolder.decrypt(values, true);
+    }
+
+    @Override
+    public String[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        String[] values = super.getNullableResult(rs, columnIndex);
+        return ObjectUtils.isEmpty(values) ? values : DatabaseContextHolder.decrypt(values, true);
+    }
+
+    @Override
+    public String[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        String[] values = super.getNullableResult(cs, columnIndex);
+        return ObjectUtils.isEmpty(values) ? values : DatabaseContextHolder.decrypt(values, true);
+    }
+}

+ 46 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/SensitiveStringSetTypeHandler.java

@@ -0,0 +1,46 @@
+package com.chelvc.framework.database.handler;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Set;
+
+import com.chelvc.framework.common.util.ObjectUtils;
+import com.chelvc.framework.database.context.DatabaseContextHolder;
+import org.apache.ibatis.type.JdbcType;
+
+/**
+ * 敏感字符串集合字段处理实现
+ *
+ * @author Woody
+ * @date 2024/6/18
+ */
+public class SensitiveStringSetTypeHandler extends StringSetTypeHandler {
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, Set<String> parameter, JdbcType jdbcType)
+            throws SQLException {
+        if (ObjectUtils.notEmpty(parameter) && DatabaseContextHolder.isSensitiveWritable()) {
+            parameter = DatabaseContextHolder.encrypt(parameter, true);
+        }
+        super.setNonNullParameter(ps, i, parameter, jdbcType);
+    }
+
+    @Override
+    public Set<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        Set<String> values = super.getNullableResult(rs, columnName);
+        return ObjectUtils.isEmpty(values) ? values : DatabaseContextHolder.decrypt(values, true);
+    }
+
+    @Override
+    public Set<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        Set<String> values = super.getNullableResult(rs, columnIndex);
+        return ObjectUtils.isEmpty(values) ? values : DatabaseContextHolder.decrypt(values, true);
+    }
+
+    @Override
+    public Set<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        Set<String> values = super.getNullableResult(cs, columnIndex);
+        return ObjectUtils.isEmpty(values) ? values : DatabaseContextHolder.decrypt(values, true);
+    }
+}

+ 46 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/SensitiveStringsTypeHandler.java

@@ -0,0 +1,46 @@
+package com.chelvc.framework.database.handler;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+
+import com.chelvc.framework.common.util.ObjectUtils;
+import com.chelvc.framework.database.context.DatabaseContextHolder;
+import org.apache.ibatis.type.JdbcType;
+
+/**
+ * 敏感字符串列表字段处理实现
+ *
+ * @author Woody
+ * @date 2024/6/17
+ */
+public class SensitiveStringsTypeHandler extends StringsTypeHandler {
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType)
+            throws SQLException {
+        if (ObjectUtils.notEmpty(parameter) && DatabaseContextHolder.isSensitiveWritable()) {
+            parameter = DatabaseContextHolder.encrypt(parameter, true);
+        }
+        super.setNonNullParameter(ps, i, parameter, jdbcType);
+    }
+
+    @Override
+    public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        List<String> values = super.getNullableResult(rs, columnName);
+        return ObjectUtils.isEmpty(values) ? values : DatabaseContextHolder.decrypt(values, true);
+    }
+
+    @Override
+    public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        List<String> values = super.getNullableResult(rs, columnIndex);
+        return ObjectUtils.isEmpty(values) ? values : DatabaseContextHolder.decrypt(values, true);
+    }
+
+    @Override
+    public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        List<String> values = super.getNullableResult(cs, columnIndex);
+        return ObjectUtils.isEmpty(values) ? values : DatabaseContextHolder.decrypt(values, true);
+    }
+}

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/SetTypeHandler.java

@@ -6,7 +6,7 @@ import java.util.Set;
  * 集合字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class SetTypeHandler extends JsonTypeHandler.Default<Set<?>> {
 }

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/SetsTypeHandler.java

@@ -7,7 +7,7 @@ import java.util.Set;
  * 集合列表字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class SetsTypeHandler extends JsonTypeHandler.Default<List<Set<?>>> {
 }

+ 10 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/ShortArrayTypeHandler.java

@@ -0,0 +1,10 @@
+package com.chelvc.framework.database.handler;
+
+/**
+ * 短整数数组字段处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class ShortArrayTypeHandler extends JsonTypeHandler.Default<Short[]> {
+}

+ 12 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/ShortSetTypeHandler.java

@@ -0,0 +1,12 @@
+package com.chelvc.framework.database.handler;
+
+import java.util.Set;
+
+/**
+ * 短整数集合字段处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class ShortSetTypeHandler extends JsonTypeHandler.Default<Set<Short>> {
+}

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/handler/ShortsTypeHandler.java

@@ -6,7 +6,7 @@ import java.util.List;
  * 短整数列表字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class ShortsTypeHandler extends JsonTypeHandler.Default<List<Short>> {
 }

+ 10 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/StringArrayTypeHandler.java

@@ -0,0 +1,10 @@
+package com.chelvc.framework.database.handler;
+
+/**
+ * 字符串数组字段处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class StringArrayTypeHandler extends JsonTypeHandler.Default<String[]> {
+}

+ 12 - 0
framework-database/src/main/java/com/chelvc/framework/database/handler/StringSetTypeHandler.java

@@ -0,0 +1,12 @@
+package com.chelvc.framework.database.handler;
+
+import java.util.Set;
+
+/**
+ * 字符串集合字段处理实现
+ *
+ * @author Woody
+ * @date 2024/4/3
+ */
+public class StringSetTypeHandler extends JsonTypeHandler.Default<Set<String>> {
+}

+ 2 - 2
framework-database/src/main/java/com/chelvc/framework/database/handler/StringsTypeHandler.java

@@ -3,10 +3,10 @@ package com.chelvc.framework.database.handler;
 import java.util.List;
 
 /**
- * 长整数列表字段处理实现
+ * 字符串列表字段处理实现
  *
  * @author Woody
- * @date 2024/1/30
+ * @date 2024/4/3
  */
 public class StringsTypeHandler extends JsonTypeHandler.Default<List<String>> {
 }

+ 0 - 12
framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueBooleansTypeHandler.java

@@ -1,12 +0,0 @@
-package com.chelvc.framework.database.handler;
-
-import java.util.Set;
-
-/**
- * 唯一的真假值列表字段处理实现
- *
- * @author Woody
- * @date 2024/4/3
- */
-public class UniqueBooleansTypeHandler extends JsonTypeHandler.Default<Set<Boolean>> {
-}

+ 0 - 12
framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueDoublesTypeHandler.java

@@ -1,12 +0,0 @@
-package com.chelvc.framework.database.handler;
-
-import java.util.Set;
-
-/**
- * 唯一的双精度浮点数列表字段处理实现
- *
- * @author Woody
- * @date 2024/4/3
- */
-public class UniqueDoublesTypeHandler extends JsonTypeHandler.Default<Set<Double>> {
-}

+ 0 - 12
framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueFloatsTypeHandler.java

@@ -1,12 +0,0 @@
-package com.chelvc.framework.database.handler;
-
-import java.util.Set;
-
-/**
- * 唯一的单精度浮点数列表字段处理实现
- *
- * @author Woody
- * @date 2024/4/3
- */
-public class UniqueFloatsTypeHandler extends JsonTypeHandler.Default<Set<Float>> {
-}

+ 0 - 12
framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueIntegersTypeHandler.java

@@ -1,12 +0,0 @@
-package com.chelvc.framework.database.handler;
-
-import java.util.Set;
-
-/**
- * 唯一的整数列表字段处理实现
- *
- * @author Woody
- * @date 2024/4/3
- */
-public class UniqueIntegersTypeHandler extends JsonTypeHandler.Default<Set<Integer>> {
-}

+ 0 - 12
framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueLongsTypeHandler.java

@@ -1,12 +0,0 @@
-package com.chelvc.framework.database.handler;
-
-import java.util.Set;
-
-/**
- * 唯一的长整数列表字段处理实现
- *
- * @author Woody
- * @date 2024/4/3
- */
-public class UniqueLongsTypeHandler extends JsonTypeHandler.Default<Set<Long>> {
-}

+ 0 - 12
framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueShortsTypeHandler.java

@@ -1,12 +0,0 @@
-package com.chelvc.framework.database.handler;
-
-import java.util.Set;
-
-/**
- * 唯一的短整数列表字段处理实现
- *
- * @author Woody
- * @date 2024/4/3
- */
-public class UniqueShortsTypeHandler extends JsonTypeHandler.Default<Set<Short>> {
-}

+ 0 - 12
framework-database/src/main/java/com/chelvc/framework/database/handler/UniqueStringsTypeHandler.java

@@ -1,12 +0,0 @@
-package com.chelvc.framework.database.handler;
-
-import java.util.Set;
-
-/**
- * 唯一的长整数列表字段处理实现
- *
- * @author Woody
- * @date 2024/4/3
- */
-public class UniqueStringsTypeHandler extends JsonTypeHandler.Default<Set<String>> {
-}

+ 6 - 9
framework-database/src/main/java/com/chelvc/framework/database/interceptor/DynamicInvokeInterceptor.java

@@ -65,7 +65,6 @@ import org.apache.ibatis.plugin.Signature;
 import org.apache.ibatis.reflection.MetaObject;
 import org.apache.ibatis.reflection.SystemMetaObject;
 import org.apache.ibatis.type.TypeHandler;
-import org.apache.ibatis.type.UnknownTypeHandler;
 import org.springframework.stereotype.Component;
 
 /**
@@ -598,14 +597,12 @@ public class DynamicInvokeInterceptor implements Interceptor {
      * @param parameter 参数表达式
      */
     private void bindTypeHandler(BoundSql bound, Table table, Column column, JdbcParameter parameter) {
-        ParameterMapping mapping = bound.getParameterMappings().get(parameter.getIndex() - 1);
-        if (mapping.getTypeHandler() == null || mapping.getTypeHandler() instanceof UnknownTypeHandler) {
-            Map<String, TableFieldContext> contexts = DatabaseContextHolder.getTableFieldContexts(table.getName());
-            TableFieldContext context = contexts.get(column.getColumnName());
-            TypeHandler<?> handler = ObjectUtils.ifNull(context, TableFieldContext::getHandler);
-            if (handler != null) {
-                SystemMetaObject.forObject(mapping).setValue("typeHandler", handler);
-            }
+        Map<String, TableFieldContext> contexts = DatabaseContextHolder.getTableFieldContexts(table.getName());
+        TableFieldContext context = contexts.get(column.getColumnName());
+        TypeHandler<?> handler = ObjectUtils.ifNull(context, TableFieldContext::getHandler);
+        if (handler != null) {
+            ParameterMapping mapping = bound.getParameterMappings().get(parameter.getIndex() - 1);
+            SystemMetaObject.forObject(mapping).setValue("typeHandler", handler);
         }
     }
 

+ 0 - 30
framework-database/src/main/java/com/chelvc/framework/database/support/AbstractSelectMethod.java

@@ -1,30 +0,0 @@
-package com.chelvc.framework.database.support;
-
-import com.baomidou.mybatisplus.core.injector.AbstractMethod;
-import com.baomidou.mybatisplus.core.metadata.TableInfo;
-import org.apache.ibatis.mapping.SqlSource;
-
-/**
- * 数据查询方法抽象实现
- *
- * @author Woody
- * @date 2024/5/28
- */
-public abstract class AbstractSelectMethod extends AbstractMethod {
-    /**
-     * 初始化SQL数据源
-     *
-     * @param model 数据模型对象
-     * @param table 表信息
-     * @return SQL数据源对象实例
-     */
-    protected SqlSource initializeSqlSource(Class<?> model, TableInfo table) {
-        String script = String.format(
-                "<script>%s SELECT <foreach collection=\"select.expressions.entrySet()\" index=\"alias\" " +
-                        "item=\"expression\" separator=\",\">${expression} as ${alias}</foreach> " +
-                        "FROM %s %s %s\n</script>",
-                this.sqlFirst(), table.getTableName(), this.sqlWhereEntityWrapper(true, table), this.sqlComment()
-        );
-        return this.languageDriver.createSqlSource(this.configuration, script, model);
-    }
-}

+ 0 - 48
framework-database/src/main/java/com/chelvc/framework/database/support/EnhanceMapper.java

@@ -1,13 +1,8 @@
 package com.chelvc.framework.database.support;
 
 import java.util.Collection;
-import java.util.List;
-import java.util.Map;
 
-import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Constants;
 import org.apache.ibatis.annotations.Param;
 
 /**
@@ -50,47 +45,4 @@ public interface EnhanceMapper<T> extends BaseMapper<T> {
      * @return 影响行数
      */
     int batchCreateUpdate(@Param("entities") Collection<T> entities, @Param("update") Updates.Update<T> update);
-
-    /**
-     * 查询对象列表
-     *
-     * @param select  查询列
-     * @param wrapper 查询条件
-     * @return 数据对象列表
-     */
-    List<T> getObjects(@Param("select") Selects.Select<T> select, @Param(Constants.WRAPPER) Wrapper<T> wrapper);
-
-    /**
-     * 查询对象键/值映射表
-     *
-     * @param select  查询列
-     * @param wrapper 查询条件
-     * @return 键/值映射表列表
-     */
-    List<Map<String, Object>> getMaps(@Param("select") Selects.Select<T> select,
-                                      @Param(Constants.WRAPPER) Wrapper<T> wrapper);
-
-    /**
-     * 查询对象分页
-     *
-     * @param page    分页信息
-     * @param select  查询列
-     * @param wrapper 查询条件
-     * @param <E>     分页类型
-     * @return 对象分页信息
-     */
-    <E extends IPage<T>> E getPage(E page, @Param("select") Selects.Select<T> select,
-                                   @Param(Constants.WRAPPER) Wrapper<T> wrapper);
-
-    /**
-     * 查询对象键/值映射表分页
-     *
-     * @param page    分页信息
-     * @param select  查询列
-     * @param wrapper 查询条件
-     * @param <E>     分页类型
-     * @return 键/值映射表分页信息
-     */
-    <E extends IPage<Map<String, Object>>> E getMapsPage(E page, @Param("select") Selects.Select<T> select,
-                                                         @Param(Constants.WRAPPER) Wrapper<T> wrapper);
 }

+ 0 - 116
framework-database/src/main/java/com/chelvc/framework/database/support/EnhanceService.java

@@ -2,10 +2,8 @@ package com.chelvc.framework.database.support;
 
 import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 import java.util.function.Function;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.conditions.query.ChainQuery;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.chelvc.framework.common.model.Pagination;
@@ -92,58 +90,6 @@ public interface EnhanceService<T> extends IService<T>, EventService<T> {
         return !entities.isEmpty() && this.getEnhanceMapper().batchCreateUpdate(entities, update) > 0;
     }
 
-    /**
-     * 列表查询
-     *
-     * @param select 查询列
-     * @return 对象列表
-     */
-    default List<T> select(@NonNull Selects.Select<T> select) {
-        return this.select(select, this.lambdaQuery());
-    }
-
-    /**
-     * 列表查询
-     *
-     * @param select 查询列
-     * @param type   对象类型
-     * @param <R>    数据类型
-     * @return 对象列表
-     */
-    @SuppressWarnings("rawTypes")
-    default <R> List<R> select(@NonNull Selects.Select<T> select, @NonNull Class<R> type) {
-        return this.select(select, this.lambdaQuery(), type);
-    }
-
-    /**
-     * 列表查询
-     *
-     * @param select 查询列
-     * @param query  查询对象
-     * @return 对象列表
-     */
-    default List<T> select(@NonNull Selects.Select<T> select, @NonNull ChainQuery<T> query) {
-        return this.getEnhanceMapper().getObjects(select, query.getWrapper());
-    }
-
-    /**
-     * 列表查询
-     *
-     * @param select 查询列
-     * @param query  查询对象
-     * @param type   对象类型
-     * @param <R>    数据类型
-     * @return 对象列表
-     */
-    @SuppressWarnings({"rawTypes", "unchecked"})
-    default <R> List<R> select(@NonNull Selects.Select<T> select, @NonNull ChainQuery<T> query,
-                               @NonNull Class<R> type) {
-        if (type == this.getEntityClass()) {
-            return (List<R>) this.select(select, query);
-        }
-        return DatabaseContextHolder.deserialize(this.getEnhanceMapper().getMaps(select, query.getWrapper()), type);
-    }
-
     /**
      * 分页查询
      *
@@ -190,66 +136,4 @@ public interface EnhanceService<T> extends IService<T>, EventService<T> {
                                      @NonNull Function<List<T>, List<R>> adapter) {
         return DatabaseContextHolder.paging(paging, query::page, adapter);
     }
-
-    /**
-     * 分页查询
-     *
-     * @param select 查询列
-     * @param paging 查询分页信息
-     * @return 对象分页信息
-     */
-    default Pagination<T> paging(@NonNull Selects.Select<T> select, @NonNull Paging paging) {
-        return this.paging(select, this.lambdaQuery(), paging);
-    }
-
-    /**
-     * 分页查询
-     *
-     * @param select 查询列
-     * @param query  查询对象
-     * @param paging 分页信息
-     * @return 对象分页信息
-     */
-    default Pagination<T> paging(@NonNull Selects.Select<T> select, @NonNull ChainQuery<T> query,
-                                 @NonNull Paging paging) {
-        IPage<T> page = DatabaseContextHolder.page(paging);
-        return DatabaseContextHolder.pagination(this.getEnhanceMapper().getPage(page, select, query.getWrapper()));
-    }
-
-    /**
-     * 分页查询
-     *
-     * @param select 查询列
-     * @param paging 查询分页信息
-     * @param type   对象类型
-     * @param <R>    数据类型
-     * @return 对象分页信息
-     */
-    default <R> Pagination<R> paging(@NonNull Selects.Select<T> select, @NonNull Paging paging,
-                                     @NonNull Class<R> type) {
-        return this.paging(select, this.lambdaQuery(), paging, type);
-    }
-
-    /**
-     * 分页查询
-     *
-     * @param select 查询列
-     * @param query  查询对象
-     * @param paging 分页信息
-     * @param type   对象类型
-     * @param <R>    数据类型
-     * @return 对象分页信息
-     */
-    @SuppressWarnings({"rawTypes", "unchecked"})
-    default <R> Pagination<R> paging(@NonNull Selects.Select<T> select, @NonNull ChainQuery<T> query,
-                                     @NonNull Paging paging, @NonNull Class<R> type) {
-        if (type == this.getEntityClass()) {
-            return (Pagination<R>) this.paging(select, query, paging);
-        }
-        IPage<Map<String, Object>> page = DatabaseContextHolder.page(paging);
-        return DatabaseContextHolder.pagination(
-                this.getEnhanceMapper().getMapsPage(page, select, query.getWrapper()),
-                maps -> DatabaseContextHolder.deserialize(maps, type)
-        );
-    }
 }

+ 0 - 4
framework-database/src/main/java/com/chelvc/framework/database/support/EnhanceSqlInjector.java

@@ -19,10 +19,6 @@ public class EnhanceSqlInjector extends DefaultSqlInjector {
         methods.add(new CreateUpdateMethod());
         methods.add(new BatchCreateIgnoreMethod());
         methods.add(new BatchCreateUpdateMethod());
-        methods.add(new GetObjectsMethod());
-        methods.add(new GetMapsMethod());
-        methods.add(new GetPageMethod());
-        methods.add(new GetMapsPageMethod());
         return methods;
     }
 }

+ 0 - 21
framework-database/src/main/java/com/chelvc/framework/database/support/GetMapsMethod.java

@@ -1,21 +0,0 @@
-package com.chelvc.framework.database.support;
-
-import java.util.Map;
-
-import com.baomidou.mybatisplus.core.metadata.TableInfo;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.mapping.SqlSource;
-
-/**
- * 查询键/值映射方法实现
- *
- * @author Woody
- * @date 2024/5/28
- */
-public class GetMapsMethod extends AbstractSelectMethod {
-    @Override
-    public MappedStatement injectMappedStatement(Class<?> mapper, Class<?> model, TableInfo table) {
-        SqlSource source = this.initializeSqlSource(model, table);
-        return this.addSelectMappedStatementForOther(mapper, "getMaps", source, Map.class);
-    }
-}

+ 0 - 21
framework-database/src/main/java/com/chelvc/framework/database/support/GetMapsPageMethod.java

@@ -1,21 +0,0 @@
-package com.chelvc.framework.database.support;
-
-import java.util.Map;
-
-import com.baomidou.mybatisplus.core.metadata.TableInfo;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.mapping.SqlSource;
-
-/**
- * 查询键/值映射分页方法实现
- *
- * @author Woody
- * @date 2024/5/28
- */
-public class GetMapsPageMethod extends AbstractSelectMethod {
-    @Override
-    public MappedStatement injectMappedStatement(Class<?> mapper, Class<?> model, TableInfo table) {
-        SqlSource source = this.initializeSqlSource(model, table);
-        return this.addSelectMappedStatementForOther(mapper, "getMapsPage", source, Map.class);
-    }
-}

+ 0 - 19
framework-database/src/main/java/com/chelvc/framework/database/support/GetObjectsMethod.java

@@ -1,19 +0,0 @@
-package com.chelvc.framework.database.support;
-
-import com.baomidou.mybatisplus.core.metadata.TableInfo;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.mapping.SqlSource;
-
-/**
- * 查询对象方法实现
- *
- * @author Woody
- * @date 2024/5/28
- */
-public class GetObjectsMethod extends AbstractSelectMethod {
-    @Override
-    public MappedStatement injectMappedStatement(Class<?> mapper, Class<?> model, TableInfo table) {
-        SqlSource source = this.initializeSqlSource(model, table);
-        return this.addSelectMappedStatementForTable(mapper, "getObjects", source, table);
-    }
-}

+ 0 - 19
framework-database/src/main/java/com/chelvc/framework/database/support/GetPageMethod.java

@@ -1,19 +0,0 @@
-package com.chelvc.framework.database.support;
-
-import com.baomidou.mybatisplus.core.metadata.TableInfo;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.mapping.SqlSource;
-
-/**
- * 查询对象分页方法实现
- *
- * @author Woody
- * @date 2024/5/28
- */
-public class GetPageMethod extends AbstractSelectMethod {
-    @Override
-    public MappedStatement injectMappedStatement(Class<?> mapper, Class<?> model, TableInfo table) {
-        SqlSource source = this.initializeSqlSource(model, table);
-        return this.addSelectMappedStatementForTable(mapper, "getPage", source, table);
-    }
-}

+ 0 - 422
framework-database/src/main/java/com/chelvc/framework/database/support/Selects.java

@@ -1,422 +0,0 @@
-package com.chelvc.framework.database.support;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Objects;
-
-import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
-import com.chelvc.framework.common.util.AssertUtils;
-import com.chelvc.framework.database.context.DatabaseContextHolder;
-import com.google.common.collect.Maps;
-import lombok.NonNull;
-
-/**
- * 自定义查询字段工具类
- *
- * @author Woody
- * @date 2024/5/27
- */
-public final class Selects {
-    private Selects() {
-    }
-
-    /**
-     * 获取字段查询对象
-     *
-     * @param <T> 数据类型
-     * @return 字段查询对象实例
-     */
-    public static <T> Select<T> select() {
-        return new Select<>();
-    }
-
-    /**
-     * 普通查询
-     *
-     * @param columns 列名数组
-     * @param <T>     数据类型
-     * @return 字段查询对象实例
-     */
-    public static <T> Select<T> of(@NonNull String... columns) {
-        Select<T> select = select();
-        return select.of(columns);
-    }
-
-    /**
-     * 普通查询
-     *
-     * @param getters Getter方法数组
-     * @param <T>     数据类型
-     * @return 字段查询对象实例
-     */
-    @SafeVarargs
-    public static <T> Select<T> of(@NonNull SFunction<T, ?>... getters) {
-        Select<T> select = select();
-        return select.of(getters);
-    }
-
-    /**
-     * 普通查询
-     *
-     * @param column 列名
-     * @param alias  别名
-     * @param <T>    数据类型
-     * @return 字段查询对象实例
-     */
-    public static <T> Select<T> of(@NonNull String column, @NonNull String alias) {
-        Select<T> select = select();
-        return select.of(column, alias);
-    }
-
-    /**
-     * 普通查询
-     *
-     * @param getter Getter方法
-     * @param alias  别名
-     * @param <T>    数据类型
-     * @return 字段查询对象实例
-     */
-    public static <T> Select<T> of(@NonNull SFunction<T, ?> getter, @NonNull String alias) {
-        Select<T> select = select();
-        return select.of(getter, alias);
-    }
-
-    /**
-     * 求平均值
-     *
-     * @param column 列名
-     * @param alias  别名
-     * @param <T>    数据类型
-     * @return 字段查询对象实例
-     */
-    public static <T> Select<T> avg(@NonNull String column, @NonNull String alias) {
-        Select<T> select = select();
-        return select.avg(column, alias);
-    }
-
-    /**
-     * 求平均值
-     *
-     * @param getter Getter方法
-     * @param alias  别名
-     * @param <T>    数据类型
-     * @return 字段查询对象实例
-     */
-    public static <T> Select<T> avg(@NonNull SFunction<T, ?> getter, @NonNull String alias) {
-        Select<T> select = select();
-        return select.avg(getter, alias);
-    }
-
-    /**
-     * 求和
-     *
-     * @param column 列名
-     * @param alias  别名
-     * @param <T>    数据类型
-     * @return 字段查询对象实例
-     */
-    public static <T> Select<T> sum(@NonNull String column, @NonNull String alias) {
-        Select<T> select = select();
-        return select.sum(column, alias);
-    }
-
-    /**
-     * 求和
-     *
-     * @param getter Getter方法
-     * @param alias  别名
-     * @param <T>    数据类型
-     * @return 字段查询对象实例
-     */
-    public static <T> Select<T> sum(@NonNull SFunction<T, ?> getter, @NonNull String alias) {
-        Select<T> select = select();
-        return select.sum(getter, alias);
-    }
-
-    /**
-     * 求数量
-     *
-     * @param column 列名
-     * @param alias  别名
-     * @param <T>    数据类型
-     * @return 字段查询对象实例
-     */
-    public static <T> Select<T> count(@NonNull String column, @NonNull String alias) {
-        Select<T> select = select();
-        return select.count(column, alias);
-    }
-
-    /**
-     * 求数量
-     *
-     * @param column   列名
-     * @param alias    别名
-     * @param distinct 是否去重
-     * @param <T>      数据类型
-     * @return 字段查询对象实例
-     */
-    public static <T> Select<T> count(@NonNull String column, @NonNull String alias, boolean distinct) {
-        Select<T> select = select();
-        return select.count(column, alias, distinct);
-    }
-
-    /**
-     * 求数量
-     *
-     * @param getter Getter方法
-     * @param alias  别名
-     * @param <T>    数据类型
-     * @return 字段查询对象实例
-     */
-    public static <T> Select<T> count(@NonNull SFunction<T, ?> getter, @NonNull String alias) {
-        Select<T> select = select();
-        return select.count(getter, alias);
-    }
-
-    /**
-     * 求数量
-     *
-     * @param getter   Getter方法
-     * @param alias    别名
-     * @param distinct 是否去重
-     * @param <T>      数据类型
-     * @return 字段查询对象实例
-     */
-    public static <T> Select<T> count(@NonNull SFunction<T, ?> getter, @NonNull String alias, boolean distinct) {
-        Select<T> select = select();
-        return select.count(getter, alias, distinct);
-    }
-
-    /**
-     * 设置查询表达式
-     *
-     * @param alias      别名
-     * @param expression 值表达式
-     * @param <T>        数据类型
-     * @return 字段查询对象实例
-     */
-    public static <T> Select<T> set(@NonNull String alias, @NonNull String expression) {
-        Select<T> select = select();
-        return select.set(alias, expression);
-    }
-
-    /**
-     * 字段查询对象
-     *
-     * @param <T> 数据类型
-     */
-    public static class Select<T> implements Serializable {
-        private final Map<String, String> expressions = Maps.newLinkedHashMap();
-
-        /**
-         * 普通查询
-         *
-         * @param columns 列名数组
-         * @return 字段查询对象实例
-         */
-        public final Select<T> of(@NonNull String... columns) {
-            for (String column : columns) {
-                this.of(column, column);
-            }
-            return this;
-        }
-
-        /**
-         * 普通查询
-         *
-         * @param getters Getter方法数组
-         * @return 字段查询对象实例
-         */
-        @SafeVarargs
-        public final Select<T> of(@NonNull SFunction<T, ?>... getters) {
-            for (SFunction<T, ?> getter : getters) {
-                this.of(DatabaseContextHolder.getter2column(getter));
-            }
-            return this;
-        }
-
-        /**
-         * 普通查询
-         *
-         * @param column 列名
-         * @param alias  别名
-         * @return 字段查询对象实例
-         */
-        public final Select<T> of(@NonNull String column, @NonNull String alias) {
-            return this.set(alias, column);
-        }
-
-        /**
-         * 普通查询
-         *
-         * @param getter Getter方法
-         * @param alias  别名
-         * @return 字段查询对象实例
-         */
-        public final Select<T> of(@NonNull SFunction<T, ?> getter, @NonNull String alias) {
-            return this.of(DatabaseContextHolder.getter2column(getter), alias);
-        }
-
-        /**
-         * 求最小值
-         *
-         * @param column 列名
-         * @param alias  别名
-         * @return 字段查询对象实例
-         */
-        public final Select<T> min(@NonNull String column, @NonNull String alias) {
-            return this.set(alias, "MIN(" + column + ")");
-        }
-
-        /**
-         * 求最小值
-         *
-         * @param getter Getter方法
-         * @param alias  别名
-         * @return 字段查询对象实例
-         */
-        public final Select<T> min(@NonNull SFunction<T, ?> getter, @NonNull String alias) {
-            return this.min(DatabaseContextHolder.getter2column(getter), alias);
-        }
-
-        /**
-         * 求最大值
-         *
-         * @param column 列名
-         * @param alias  别名
-         * @return 字段查询对象实例
-         */
-        public final Select<T> max(@NonNull String column, @NonNull String alias) {
-            return this.set(alias, "MAX(" + column + ")");
-        }
-
-        /**
-         * 求最大值
-         *
-         * @param getter Getter方法
-         * @param alias  别名
-         * @return 字段查询对象实例
-         */
-        public final Select<T> max(@NonNull SFunction<T, ?> getter, @NonNull String alias) {
-            return this.max(DatabaseContextHolder.getter2column(getter), alias);
-        }
-
-        /**
-         * 求平均值
-         *
-         * @param column 列名
-         * @param alias  别名
-         * @return 字段查询对象实例
-         */
-        public final Select<T> avg(@NonNull String column, @NonNull String alias) {
-            return this.set(alias, "AVG(" + column + ")");
-        }
-
-        /**
-         * 求平均值
-         *
-         * @param getter Getter方法
-         * @param alias  别名
-         * @return 字段查询对象实例
-         */
-        public final Select<T> avg(@NonNull SFunction<T, ?> getter, @NonNull String alias) {
-            return this.avg(DatabaseContextHolder.getter2column(getter), alias);
-        }
-
-        /**
-         * 求和
-         *
-         * @param column 列名
-         * @param alias  别名
-         * @return 字段查询对象实例
-         */
-        public final Select<T> sum(@NonNull String column, @NonNull String alias) {
-            return this.set(alias, "SUM(" + column + ")");
-        }
-
-        /**
-         * 求和
-         *
-         * @param getter Getter方法
-         * @param alias  别名
-         * @return 字段查询对象实例
-         */
-        public final Select<T> sum(@NonNull SFunction<T, ?> getter, @NonNull String alias) {
-            return this.sum(DatabaseContextHolder.getter2column(getter), alias);
-        }
-
-        /**
-         * 求数量
-         *
-         * @param column 列名
-         * @param alias  别名
-         * @return 字段查询对象实例
-         */
-        public final Select<T> count(@NonNull String column, @NonNull String alias) {
-            return this.count(column, alias, false);
-        }
-
-        /**
-         * 求数量
-         *
-         * @param column   列名
-         * @param alias    别名
-         * @param distinct 是否去重
-         * @return 字段查询对象实例
-         */
-        public final Select<T> count(@NonNull String column, @NonNull String alias, boolean distinct) {
-            return this.set(alias, distinct ? "COUNT(DISTINCT " + column + ")" : "COUNT(" + column + ")");
-        }
-
-        /**
-         * 求数量
-         *
-         * @param getter Getter方法
-         * @param alias  别名
-         * @return 字段查询对象实例
-         */
-        public final Select<T> count(@NonNull SFunction<T, ?> getter, @NonNull String alias) {
-            return this.count(getter, alias, false);
-        }
-
-        /**
-         * 求数量
-         *
-         * @param getter   Getter方法
-         * @param alias    别名
-         * @param distinct 是否去重
-         * @return 字段查询对象实例
-         */
-        public final Select<T> count(@NonNull SFunction<T, ?> getter, @NonNull String alias, boolean distinct) {
-            return this.count(DatabaseContextHolder.getter2column(getter), alias, distinct);
-        }
-
-        /**
-         * 设置查询表达式
-         *
-         * @param alias      别名
-         * @param expression 值表达式
-         * @return 字段查询对象实例
-         */
-        public final Select<T> set(@NonNull String alias, @NonNull String expression) {
-            String exists = this.expressions.put(alias, expression);
-            AssertUtils.check(Objects.isNull(exists), () -> "Duplicate column alias: " + alias);
-            return this;
-        }
-
-        /**
-         * 获取查询字段别名/值表达式映射表
-         *
-         * @return 字段别名/值表达式映射表
-         */
-        public final Map<String, String> getExpressions() {
-            return Collections.unmodifiableMap(this.expressions);
-        }
-
-        @Override
-        public String toString() {
-            return this.expressions.toString();
-        }
-    }
-}