Browse Source

实验性功能-参与 TableInfo 的初始化

miemie 2 năm trước cách đây
mục cha
commit
ed79b51fad

+ 3 - 0
mybatis-plus-boot-starter/src/main/java/com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.java

@@ -18,6 +18,7 @@ package com.baomidou.mybatisplus.autoconfigure;
 
 import com.baomidou.mybatisplus.core.MybatisConfiguration;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
+import com.baomidou.mybatisplus.core.handlers.JoinTableInfoInitHandler;
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
 import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
@@ -207,6 +208,8 @@ public class MybatisPlusAutoConfiguration implements InitializingBean {
         GlobalConfig globalConfig = this.properties.getGlobalConfig();
         // TODO 注入填充器
         this.getBeanThen(MetaObjectHandler.class, globalConfig::setMetaObjectHandler);
+        // TODO 注入参与器
+        this.getBeanThen(JoinTableInfoInitHandler.class, globalConfig::setJoinTableInfoInitHandler);
         // TODO 注入主键生成器
         this.getBeansThen(IKeyGenerator.class, i -> globalConfig.getDbConfig().setKeyGenerators(i));
         // TODO 注入sql注入器

+ 5 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/config/GlobalConfig.java

@@ -18,6 +18,7 @@ package com.baomidou.mybatisplus.core.config;
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.core.handlers.JoinTableInfoInitHandler;
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
 import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
@@ -75,6 +76,10 @@ public class GlobalConfig implements Serializable {
      * 元对象字段填充控制器
      */
     private MetaObjectHandler metaObjectHandler;
+    /**
+     * 参与 TableInfo 的初始化
+     */
+    private JoinTableInfoInitHandler joinTableInfoInitHandler;
     /**
      * 主键生成器
      */

+ 30 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/handlers/JoinTableInfoInitHandler.java

@@ -0,0 +1,30 @@
+package com.baomidou.mybatisplus.core.handlers;
+
+import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import org.apache.ibatis.session.Configuration;
+
+/**
+ * 初始化 TableInfo 同时进行一些操作
+ *
+ * @author miemie
+ * @since 2022-09-20
+ */
+public interface JoinTableInfoInitHandler {
+
+    /**
+     * 参与 TableFieldInfo 初始化
+     *
+     * @param fieldInfo     TableFieldInfo
+     * @param configuration Configuration
+     */
+    void joinTableFieldInfo(TableFieldInfo fieldInfo, Configuration configuration);
+
+    /**
+     * 参与 TableInfo 初始化
+     *
+     * @param tableInfo     TableInfo
+     * @param configuration Configuration
+     */
+    void joinTableInfo(TableInfo tableInfo, Configuration configuration);
+}

+ 18 - 5
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableInfoHelper.java

@@ -17,6 +17,7 @@ package com.baomidou.mybatisplus.core.metadata;
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
+import com.baomidou.mybatisplus.core.handlers.JoinTableInfoInitHandler;
 import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
 import com.baomidou.mybatisplus.core.toolkit.*;
 import org.apache.ibatis.builder.MapperBuilderAssistant;
@@ -173,11 +174,14 @@ public class TableInfoHelper {
         List<String> excludePropertyList = excludeProperty != null && excludeProperty.length > 0 ? Arrays.asList(excludeProperty) : Collections.emptyList();
 
         /* 初始化字段相关 */
-        initTableFields(clazz, globalConfig, tableInfo, excludePropertyList);
+        initTableFields(configuration, clazz, globalConfig, tableInfo, excludePropertyList);
 
         /* 自动构建 resultMap */
         tableInfo.initResultMapIfNeed();
-
+        JoinTableInfoInitHandler joinTableInfoInitHandler = globalConfig.getJoinTableInfoInitHandler();
+        if (joinTableInfoInitHandler != null) {
+            joinTableInfoInitHandler.joinTableInfo(tableInfo, configuration);
+        }
         TABLE_INFO_CACHE.put(clazz, tableInfo);
         TABLE_NAME_INFO_CACHE.put(tableInfo.getTableName(), tableInfo);
 
@@ -278,9 +282,10 @@ public class TableInfoHelper {
      * @param globalConfig 全局配置
      * @param tableInfo    数据库表反射信息
      */
-    private static void initTableFields(Class<?> clazz, GlobalConfig globalConfig, TableInfo tableInfo, List<String> excludeProperty) {
+    private static void initTableFields(Configuration configuration, Class<?> clazz, GlobalConfig globalConfig, TableInfo tableInfo, List<String> excludeProperty) {
         /* 数据库全局配置 */
         GlobalConfig.DbConfig dbConfig = globalConfig.getDbConfig();
+        JoinTableInfoInitHandler initTableInfoHandler = globalConfig.getJoinTableInfoInitHandler();
         Reflector reflector = tableInfo.getReflector();
         List<Field> list = getAllFields(clazz);
         // 标记是否读取到主键
@@ -326,12 +331,20 @@ public class TableInfoHelper {
 
             /* 有 @TableField 注解的字段初始化 */
             if (tableField != null) {
-                fieldList.add(new TableFieldInfo(dbConfig, tableInfo, field, tableField, reflector, existTableLogic, isOrderBy));
+                TableFieldInfo tableFieldInfo = new TableFieldInfo(dbConfig, tableInfo, field, tableField, reflector, existTableLogic, isOrderBy);
+                if (initTableInfoHandler != null) {
+                    initTableInfoHandler.joinTableFieldInfo(tableFieldInfo, configuration);
+                }
+                fieldList.add(tableFieldInfo);
                 continue;
             }
 
             /* 无 @TableField  注解的字段初始化 */
-            fieldList.add(new TableFieldInfo(dbConfig, tableInfo, field, reflector, existTableLogic, isOrderBy));
+            TableFieldInfo tableFieldInfo = new TableFieldInfo(dbConfig, tableInfo, field, reflector, existTableLogic, isOrderBy);
+            if (initTableInfoHandler != null) {
+                initTableInfoHandler.joinTableFieldInfo(tableFieldInfo, configuration);
+            }
+            fieldList.add(tableFieldInfo);
         }
 
         /* 字段列表 */