From bef851d01742f6347eb951214ae29a392f17d8b2 Mon Sep 17 00:00:00 2001 From: Suomm <1474983351@qq.com> Date: Sun, 21 Jan 2024 19:38:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=20ResultMap=20?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=EF=BC=8C=E5=8F=88=E5=8F=8C=E5=8F=92=E5=8F=95?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=87=8D=E5=90=8D=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mybatisflex/core/table/TableInfo.java | 110 +++++++++++++----- .../mybatisflex/test/mapper/AlisaTest.java | 18 ++- 2 files changed, 97 insertions(+), 31 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java index 8a541158..51c235c9 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java @@ -15,7 +15,11 @@ */ package com.mybatisflex.core.table; -import com.mybatisflex.annotation.*; +import com.mybatisflex.annotation.Column; +import com.mybatisflex.annotation.InsertListener; +import com.mybatisflex.annotation.KeyType; +import com.mybatisflex.annotation.SetListener; +import com.mybatisflex.annotation.UpdateListener; import com.mybatisflex.core.FlexConsts; import com.mybatisflex.core.FlexGlobalConfig; import com.mybatisflex.core.constant.SqlConsts; @@ -25,12 +29,30 @@ import com.mybatisflex.core.exception.FlexExceptions; import com.mybatisflex.core.exception.locale.LocalizedFormats; import com.mybatisflex.core.logicdelete.LogicDeleteManager; import com.mybatisflex.core.mybatis.TypeHandlerObject; -import com.mybatisflex.core.query.*; +import com.mybatisflex.core.query.CPI; +import com.mybatisflex.core.query.Join; +import com.mybatisflex.core.query.QueryColumn; +import com.mybatisflex.core.query.QueryCondition; +import com.mybatisflex.core.query.QueryMethods; +import com.mybatisflex.core.query.QueryTable; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.core.query.SelectQueryColumn; +import com.mybatisflex.core.query.SelectQueryTable; +import com.mybatisflex.core.query.SqlOperators; +import com.mybatisflex.core.query.UnionWrapper; import com.mybatisflex.core.row.Row; import com.mybatisflex.core.tenant.TenantManager; import com.mybatisflex.core.update.RawValue; import com.mybatisflex.core.update.UpdateWrapper; -import com.mybatisflex.core.util.*; +import com.mybatisflex.core.util.ArrayUtil; +import com.mybatisflex.core.util.ClassUtil; +import com.mybatisflex.core.util.CollectionUtil; +import com.mybatisflex.core.util.ConvertUtil; +import com.mybatisflex.core.util.EnumWrapper; +import com.mybatisflex.core.util.FieldWrapper; +import com.mybatisflex.core.util.ObjectUtil; +import com.mybatisflex.core.util.SqlUtil; +import com.mybatisflex.core.util.StringUtil; import org.apache.ibatis.mapping.ResultFlag; import org.apache.ibatis.mapping.ResultMap; import org.apache.ibatis.mapping.ResultMapping; @@ -45,11 +67,25 @@ import java.lang.reflect.Field; import java.lang.reflect.Proxy; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.StringJoiner; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; +import java.util.stream.Stream; -import static com.mybatisflex.core.constant.SqlConsts.*; +import static com.mybatisflex.core.constant.SqlConsts.AND; +import static com.mybatisflex.core.constant.SqlConsts.EQUALS_PLACEHOLDER; +import static com.mybatisflex.core.constant.SqlConsts.IN; public class TableInfo { @@ -989,10 +1025,20 @@ public class TableInfo { public ResultMap buildResultMap(Configuration configuration) { - return doBuildResultMap(configuration, new HashSet<>(), false, getTableNameWithSchema()); + // 所有的嵌套类对象引用 + Stream> ct = collectionType == null ? Stream.empty() : collectionType.values().stream(); + Stream> at = associationType == null ? Stream.empty() : associationType.values().stream(); + + // 预加载所有的列,重复列去重 + Set existedColumns = Stream.concat(at, ct) + .map(TableInfoFactory::ofEntityClass) + .flatMap(e -> Arrays.stream(e.allColumns)) + .collect(Collectors.toSet()); + + return doBuildResultMap(configuration, new HashSet<>(), existedColumns, false, getTableNameWithSchema()); } - private ResultMap doBuildResultMap(Configuration configuration, Set resultMapIds, boolean isNested, String nestedPrefix) { + private ResultMap doBuildResultMap(Configuration configuration, Set resultMapIds, Set existedColumns, boolean isNested, String nestedPrefix) { String resultMapId = isNested ? "nested-" + nestedPrefix + ":" + entityClass.getName() : entityClass.getName(); @@ -1012,12 +1058,12 @@ public class TableInfo { // 标签下的 标签映射 for (IdInfo idInfo : primaryKeyList) { - doBuildColumnResultMapping(configuration, resultMappings, idInfo, CollectionUtil.newArrayList(ResultFlag.ID)); + doBuildColumnResultMapping(configuration, resultMappings, existedColumns, idInfo, CollectionUtil.newArrayList(ResultFlag.ID), isNested); } // 标签下的 标签映射 for (ColumnInfo columnInfo : columnInfoList) { - doBuildColumnResultMapping(configuration, resultMappings, columnInfo, Collections.emptyList()); + doBuildColumnResultMapping(configuration, resultMappings, existedColumns, columnInfo, Collections.emptyList(), isNested); } // 标签下的 标签映射 @@ -1026,7 +1072,7 @@ public class TableInfo { // 获取嵌套类型的信息,也就是 javaType 属性 TableInfo tableInfo = TableInfoFactory.ofEntityClass(fieldType); // 构建嵌套类型的 ResultMap 对象,也就是 标签下的内容 - ResultMap nestedResultMap = tableInfo.doBuildResultMap(configuration, resultMapIds, true, nestedPrefix); + ResultMap nestedResultMap = tableInfo.doBuildResultMap(configuration, resultMapIds, existedColumns, true, nestedPrefix); if (nestedResultMap != null) { resultMappings.add(new ResultMapping.Builder(configuration, fieldName) .javaType(fieldType) @@ -1059,7 +1105,7 @@ public class TableInfo { // 获取集合泛型类型的信息,也就是 ofType 属性 TableInfo tableInfo = TableInfoFactory.ofEntityClass(genericClass); // 构建嵌套类型的 ResultMap 对象,也就是 标签下的内容 - ResultMap nestedResultMap = tableInfo.doBuildResultMap(configuration, resultMapIds, true, nestedPrefix); + ResultMap nestedResultMap = tableInfo.doBuildResultMap(configuration, resultMapIds, existedColumns, true, nestedPrefix); if (nestedResultMap != null) { resultMappings.add(new ResultMapping.Builder(configuration, field.getName()) .javaType(field.getType()) @@ -1077,27 +1123,31 @@ public class TableInfo { } private void doBuildColumnResultMapping(Configuration configuration, List resultMappings - , ColumnInfo columnInfo, List flags) { + , Set existedColumns, ColumnInfo columnInfo, List flags, boolean isNested) { - // userName -> user_name - resultMappings.add(new ResultMapping.Builder(configuration - , columnInfo.property - , columnInfo.column - , columnInfo.propertyType) - .jdbcType(columnInfo.getJdbcType()) - .flags(flags) - .typeHandler(columnInfo.buildTypeHandler(configuration)) - .build()); + if (!isNested) { + // userName -> user_name + resultMappings.add(new ResultMapping.Builder(configuration + , columnInfo.property + , columnInfo.column + , columnInfo.propertyType) + .jdbcType(columnInfo.getJdbcType()) + .flags(flags) + .typeHandler(columnInfo.buildTypeHandler(configuration)) + .build()); + } - // userName -> tb_user$user_name - resultMappings.add(new ResultMapping.Builder(configuration - , columnInfo.property - , tableName + "$" + columnInfo.column - , columnInfo.propertyType) - .jdbcType(columnInfo.getJdbcType()) - .flags(flags) - .typeHandler(columnInfo.buildTypeHandler(configuration)) - .build()); + if (existedColumns.contains(columnInfo.column)) { + // userName -> tb_user$user_name + resultMappings.add(new ResultMapping.Builder(configuration + , columnInfo.property + , tableName + "$" + columnInfo.column + , columnInfo.propertyType) + .jdbcType(columnInfo.getJdbcType()) + .flags(flags) + .typeHandler(columnInfo.buildTypeHandler(configuration)) + .build()); + } if (!Objects.equals(columnInfo.column, columnInfo.property)) { // userName -> userName diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/AlisaTest.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/AlisaTest.java index 9481c23a..085cfe0a 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/AlisaTest.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/mapper/AlisaTest.java @@ -17,13 +17,16 @@ package com.mybatisflex.test.mapper; import com.fasterxml.jackson.databind.ObjectMapper; +import com.mybatisflex.core.FlexGlobalConfig; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.test.alisa.SysUser; +import org.apache.ibatis.mapping.ResultMap; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import java.util.Arrays; import java.util.List; import static com.mybatisflex.core.query.QueryMethods.column; @@ -120,12 +123,25 @@ class AlisaTest { void test06() { QueryWrapper queryWrapper = QueryWrapper.create() // SELECT 里没有重名列 例如:id - // 不指定别名会映射到嵌套对象里面去 .select(SYS_USER.ID, SYS_USER.USER_NAME, SYS_USER.AGE, SYS_USER.BIRTHDAY) .select(SYS_ROLE.CREATE_BY.as("sys_role$create_by")) .from(SYS_USER.as("u")) .leftJoin(SYS_ROLE).as("r").on(SYS_USER.ID.eq(SYS_ROLE.ID)); + Object[] objects = FlexGlobalConfig.getDefaultConfig() + .getConfiguration() + .getResultMaps() + .toArray(); + + Object[] resultMaps = Arrays.stream(objects) + .filter(e -> e instanceof ResultMap) + .map(e -> (ResultMap) e) + .filter(e -> e.getId().contains("Sys")) + .filter(e -> !e.getId().contains("select")) + .toArray(); + + System.out.println(resultMaps.length); + printList(queryWrapper); }