getTableInfos() {
+ return Collections.unmodifiableList(new ArrayList<>(TABLE_INFO_CACHE.values()));
+ }
+
/**
*
* 实体类反射获取表信息【初始化】
@@ -69,13 +105,26 @@ public class MPJTableInfoHelper {
* @param clazz 反射实体类
* @return 数据库表反射信息
*/
- public synchronized static TableInfo initTableInfo(Configuration configuration, String currentNamespace, Class> clazz) {
- TableInfo info = TABLE_INFO_CACHE.get(clazz);
+ public synchronized static MPJTableInfo initTableInfo(Configuration configuration, String currentNamespace, Class> clazz, Class> mapperClass) {
+ MPJTableInfo info = TABLE_INFO_CACHE.get(clazz);
if (info != null) {
return info;
}
/* 没有获取到缓存信息,则初始化 */
- TableInfo tableInfo = new TableInfo(clazz);
+ MPJTableInfo mpjTableInfo = new MPJTableInfo();
+ mpjTableInfo.setMapperClass(mapperClass);
+ TableInfo tableInfo = TableInfoHelper.getTableInfo(clazz);
+ if (tableInfo != null) {
+ mpjTableInfo.setTableInfo(tableInfo);
+ initMapping(mpjTableInfo);
+ /* 添加缓存 */
+ TABLE_INFO_CACHE.put(clazz, mpjTableInfo);
+ return mpjTableInfo;
+ }
+
+
+ tableInfo = new TableInfo(clazz);
+ mpjTableInfo.setTableInfo(tableInfo);
tableInfo.setCurrentNamespace(currentNamespace);
tableInfo.setConfiguration(configuration);
GlobalConfig globalConfig = GlobalConfigUtils.getGlobalConfig(configuration);
@@ -86,17 +135,20 @@ public class MPJTableInfoHelper {
List excludePropertyList = excludeProperty != null && excludeProperty.length > 0 ? Arrays.asList(excludeProperty) : Collections.emptyList();
/* 初始化字段相关 */
- initTableFields(clazz, globalConfig, tableInfo, excludePropertyList);
+ initTableFields(clazz, globalConfig, mpjTableInfo, excludePropertyList);
/* 自动构建 resultMap */
initResultMapIfNeed(tableInfo);
/* 添加缓存 */
- TABLE_INFO_CACHE.put(clazz, tableInfo);
+ TABLE_INFO_CACHE.put(clazz, mpjTableInfo);
/* 缓存 lambda */
LambdaUtils.installCache(tableInfo);
- return tableInfo;
+
+ /* 初始化映射关系 */
+ initMapping(mpjTableInfo);
+ return mpjTableInfo;
}
@@ -179,10 +231,6 @@ public class MPJTableInfoHelper {
tableInfo.setTableName(targetTableName);
- /* 开启了自定义 KEY 生成器 */
-// if (CollectionUtils.isNotEmpty(dbConfig.getKeyGenerators())) {
-// tableInfo.setKeySequence(clazz.getAnnotation(KeySequence.class));
-// }
return excludeProperty;
}
@@ -216,12 +264,12 @@ public class MPJTableInfoHelper {
*
* @param clazz 实体类
* @param globalConfig 全局配置
- * @param tableInfo 数据库表反射信息
+ * @param mpjTableInfo 数据库表反射信息
*/
- private static void initTableFields(Class> clazz, GlobalConfig globalConfig, TableInfo tableInfo, List excludeProperty) {
+ private static void initTableFields(Class> clazz, GlobalConfig globalConfig, MPJTableInfo mpjTableInfo, List excludeProperty) {
/* 数据库全局配置 */
GlobalConfig.DbConfig dbConfig = globalConfig.getDbConfig();
- ReflectorFactory reflectorFactory = tableInfo.getConfiguration().getReflectorFactory();
+ ReflectorFactory reflectorFactory = mpjTableInfo.getTableInfo().getConfiguration().getReflectorFactory();
Reflector reflector = reflectorFactory.findForClass(clazz);
List list = getAllFields(clazz);
// 标记是否读取到主键
@@ -244,31 +292,33 @@ public class MPJTableInfoHelper {
if (isReadPK) {
throw ExceptionUtils.mpe("@TableId can't more than one in Class: \"%s\".", clazz.getName());
} else {
- initTableIdWithAnnotation(dbConfig, tableInfo, field, tableId, reflector);
+ initTableIdWithAnnotation(dbConfig, mpjTableInfo.getTableInfo(), field, tableId, reflector);
isReadPK = true;
continue;
}
}
} else if (!isReadPK) {
- isReadPK = initTableIdWithoutAnnotation(dbConfig, tableInfo, field, reflector);
+ isReadPK = initTableIdWithoutAnnotation(dbConfig, mpjTableInfo.getTableInfo(), field, reflector);
if (isReadPK) {
continue;
}
}
+
final TableField tableField = field.getAnnotation(TableField.class);
/* 有 @TableField 注解的字段初始化 */
if (tableField != null) {
- fieldList.add(new TableFieldInfo(dbConfig, tableInfo, field, tableField, reflector, existTableLogic));
+ fieldList.add(new TableFieldInfo(dbConfig, mpjTableInfo.getTableInfo(), field, tableField, reflector, existTableLogic));
continue;
}
/* 无 @TableField 注解的字段初始化 */
- fieldList.add(new TableFieldInfo(dbConfig, tableInfo, field, reflector, existTableLogic));
+ fieldList.add(new TableFieldInfo(dbConfig, mpjTableInfo.getTableInfo(), field, reflector, existTableLogic));
}
/* 字段列表 */
- tableInfo.setFieldList(fieldList);
+ mpjTableInfo.getTableInfo().setFieldList(fieldList);
+
/* 未发现主键注解,提示警告信息 */
if (!isReadPK) {
@@ -300,6 +350,10 @@ public class MPJTableInfoHelper {
return list.stream().anyMatch(field -> field.isAnnotationPresent(TableLogic.class));
}
+ private static boolean isExistMapping(Class> clazz) {
+ return ReflectionKit.getFieldList(ClassUtils.getUserClass(clazz)).stream().anyMatch(field -> field.isAnnotationPresent(MPJMapping.class));
+ }
+
/**
*
* 主键属性初始化
@@ -430,4 +484,27 @@ public class MPJTableInfoHelper {
return (tableField == null || tableField.exist());
}).collect(toList());
}
+
+ /**
+ * 初始化映射相关
+ */
+ public static void initMapping(MPJTableInfo mpjTableInfo) {
+ // 是否存在 @MPJMapping 注解
+ boolean existMapping = isExistMapping(mpjTableInfo.getTableInfo().getEntityType());
+ mpjTableInfo.setHasMapping(existMapping);
+ /* 关系映射初始化 */
+ List mpjFieldList = new ArrayList<>();
+ List fields = ReflectionKit.getFieldList(ClassUtils.getUserClass(mpjTableInfo.getTableInfo().getEntityType()));
+ for (Field field : fields) {
+ if (existMapping) {
+ MPJMapping mapping = field.getAnnotation(MPJMapping.class);
+ if (mapping != null) {
+ mpjFieldList.add(new MPJTableFieldInfo(mpjTableInfo.getTableInfo().getEntityType(), mapping, field));
+ }
+ }
+ }
+ /* 映射字段列表 */
+ mpjTableInfo.setFieldList(mpjFieldList);
+ }
+
}
diff --git a/src/main/java/com/github/yulichang/annotation/MPJMapping.java b/src/main/java/com/github/yulichang/annotation/MPJMapping.java
new file mode 100644
index 0000000..f1f60fd
--- /dev/null
+++ b/src/main/java/com/github/yulichang/annotation/MPJMapping.java
@@ -0,0 +1,88 @@
+package com.github.yulichang.annotation;
+
+
+import java.lang.annotation.*;
+
+/**
+ * 关系映射注解
+ *
+ * @author yulichang
+ * @since 1.2.0
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
+public @interface MPJMapping {
+
+ /**
+ * 关联的数据库实体类
+ */
+ Class> tag();
+
+ /**
+ * 当前类的属性数据结构 是否是Map 或 List