From d496b18ab0fbcbd92cb5d1e942c19f6f85e14ce4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E5=B8=85?= <1474983351@qq.com>
Date: Tue, 13 Jun 2023 07:25:36 +0000
Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20mybatis-?=
=?UTF-8?q?flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.ja?=
=?UTF-8?q?va?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/mybatisflex/core/table/TableInfo.java | 986 ------------------
1 file changed, 986 deletions(-)
delete mode 100644 mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java
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
deleted file mode 100644
index f2985fc4..00000000
--- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java
+++ /dev/null
@@ -1,986 +0,0 @@
-/*
- * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.mybatisflex.core.table;
-
-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;
-import com.mybatisflex.core.dialect.IDialect;
-import com.mybatisflex.core.exception.FlexExceptions;
-import com.mybatisflex.core.javassist.ModifyAttrsRecord;
-import com.mybatisflex.core.mybatis.TypeHandlerObject;
-import com.mybatisflex.core.query.*;
-import com.mybatisflex.core.row.Row;
-import com.mybatisflex.core.tenant.TenantManager;
-import com.mybatisflex.core.util.*;
-import org.apache.ibatis.mapping.ResultFlag;
-import org.apache.ibatis.mapping.ResultMap;
-import org.apache.ibatis.mapping.ResultMapping;
-import org.apache.ibatis.reflection.MetaObject;
-import org.apache.ibatis.reflection.Reflector;
-import org.apache.ibatis.reflection.ReflectorFactory;
-import org.apache.ibatis.session.Configuration;
-import org.apache.ibatis.type.TypeHandler;
-import org.apache.ibatis.util.MapUtil;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Proxy;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Collectors;
-
-public class TableInfo {
-
- private String schema; //schema
- private String tableName; //表名
- private Class> entityClass; //实体类
- private boolean camelToUnderline = true;
- private String dataSource;
-
- //逻辑删除数据库列名
- private String logicDeleteColumn;
-
- //乐观锁字段
- private String versionColumn;
-
- //租户ID 字段
- private String tenantIdColumn;
-
- //数据插入时,默认插入数据字段
- private Map onInsertColumns;
-
- //数据更新时,默认更新内容的字段
- private Map onUpdateColumns;
-
- //大字段列
- private String[] largeColumns = new String[0];
-
- // 所有的字段,但除了主键的列
- private String[] columns = new String[0];
-
- //主键字段
- private String[] primaryKeys = new String[0];
-
- // 默认查询列
- private String[] defaultColumns = new String[0];
-
- //在插入数据的时候,支持主动插入的主键字段
- //通过自定义生成器生成 或者 Sequence 在 before 生成的时候,是需要主动插入数据的
- private String[] insertPrimaryKeys;
-
- private List columnInfoList;
- private List primaryKeyList;
-
- //column 和 java 属性的称的关系映射
- private final Map columnInfoMapping = new HashMap<>();
- private final Map propertyColumnMapping = new HashMap<>();
-
- private List onInsertListeners;
- private List onUpdateListeners;
- private List onSetListeners;
-
- /**
- * @deprecated 该功能有更好的方式实现,此属性可能会被移除。
- */
- @Deprecated
- private Map> joinTypes;
-
-
- /**
- * 对应 MapperXML 配置文件中 {@code } 标签下的 {@code } 标签。
- */
- private Map> associationType;
-
- /**
- * 对应 MapperXML 配置文件中 {@code } 标签下的 {@code } 标签。
- */
- private Map> collectionType;
-
-
- private final ReflectorFactory reflectorFactory = new BaseReflectorFactory() {
- @Override
- public Reflector findForClass(Class> type) {
- return getReflector();
- }
- };
- private Reflector reflector; //反射工具
-
- public String getSchema() {
- return schema;
- }
-
- public void setSchema(String schema) {
- this.schema = schema;
- }
-
- public String getTableName() {
- return tableName;
- }
-
- public String getWrapSchemaAndTableName(IDialect dialect) {
- if (StringUtil.isNotBlank(schema)) {
- return dialect.wrap(dialect.getRealSchema(schema)) + "." + dialect.wrap(dialect.getRealTable(tableName));
- } else {
- return dialect.wrap(dialect.getRealTable(tableName));
- }
- }
-
- public void setTableName(String tableName) {
- this.tableName = tableName;
- }
-
- public Class> getEntityClass() {
- return entityClass;
- }
-
- public void setEntityClass(Class> entityClass) {
- this.entityClass = entityClass;
- }
-
- public boolean isCamelToUnderline() {
- return camelToUnderline;
- }
-
- public void setCamelToUnderline(boolean camelToUnderline) {
- this.camelToUnderline = camelToUnderline;
- }
-
- public String getDataSource() {
- return dataSource;
- }
-
- public void setDataSource(String dataSource) {
- this.dataSource = dataSource;
- }
-
- public String getLogicDeleteColumn() {
- return logicDeleteColumn;
- }
-
- public void setLogicDeleteColumn(String logicDeleteColumn) {
- this.logicDeleteColumn = logicDeleteColumn;
- }
-
- public String getVersionColumn() {
- return versionColumn;
- }
-
- public void setVersionColumn(String versionColumn) {
- this.versionColumn = versionColumn;
- }
-
- public String getTenantIdColumn() {
- return tenantIdColumn;
- }
-
- public void setTenantIdColumn(String tenantIdColumn) {
- this.tenantIdColumn = tenantIdColumn;
- }
-
- public Map getOnInsertColumns() {
- return onInsertColumns;
- }
-
- public void setOnInsertColumns(Map onInsertColumns) {
- this.onInsertColumns = onInsertColumns;
- }
-
- public Map getOnUpdateColumns() {
- return onUpdateColumns;
- }
-
- public void setOnUpdateColumns(Map onUpdateColumns) {
- this.onUpdateColumns = onUpdateColumns;
- }
-
- public String[] getLargeColumns() {
- return largeColumns;
- }
-
- public void setLargeColumns(String[] largeColumns) {
- this.largeColumns = largeColumns;
- }
-
- public String[] getDefaultColumns() {
- return defaultColumns;
- }
-
- public void setDefaultColumns(String[] defaultColumns) {
- this.defaultColumns = defaultColumns;
- }
-
- public String[] getInsertPrimaryKeys() {
- return insertPrimaryKeys;
- }
-
- public void setInsertPrimaryKeys(String[] insertPrimaryKeys) {
- this.insertPrimaryKeys = insertPrimaryKeys;
- }
-
- public Reflector getReflector() {
- return reflector;
- }
-
- public ReflectorFactory getReflectorFactory() {
- return reflectorFactory;
- }
-
- public void setReflector(Reflector reflector) {
- this.reflector = reflector;
- }
-
- public String[] getColumns() {
- return columns;
- }
-
-
- public void setColumns(String[] columns) {
- this.columns = columns;
- }
-
- public String[] getPrimaryKeys() {
- return primaryKeys;
- }
-
- public void setPrimaryKeys(String[] primaryKeys) {
- this.primaryKeys = primaryKeys;
- }
-
-
- public List getOnInsertListeners() {
- return onInsertListeners;
- }
-
- public void setOnInsertListeners(List onInsertListeners) {
- this.onInsertListeners = onInsertListeners;
- }
-
- public List getOnUpdateListeners() {
- return onUpdateListeners;
- }
-
- public void setOnUpdateListeners(List onUpdateListeners) {
- this.onUpdateListeners = onUpdateListeners;
- }
-
- public List getOnSetListeners() {
- return onSetListeners;
- }
-
- public void setOnSetListeners(List onSetListeners) {
- this.onSetListeners = onSetListeners;
- }
-
- public List getColumnInfoList() {
- return columnInfoList;
- }
-
- public String getColumnByProperty(String property) {
- return propertyColumnMapping.get(property);
- }
-
- public Map> getJoinTypes() {
- return joinTypes;
- }
-
- public void setJoinTypes(Map> joinTypes) {
- this.joinTypes = joinTypes;
- }
-
- public void addJoinType(String fieldName, Class> clazz) {
- if (joinTypes == null) {
- joinTypes = new HashMap<>();
- }
- joinTypes.put(fieldName, clazz);
- }
-
- public Map> getAssociationType() {
- return associationType;
- }
-
- public void setAssociationType(Map> associationType) {
- this.associationType = associationType;
- }
-
- public void addAssociationType(String fieldName, Class> clazz) {
- if (associationType == null) {
- associationType = new HashMap<>();
- }
- associationType.put(fieldName, clazz);
- }
-
- public Map> getCollectionType() {
- return collectionType;
- }
-
- public void setCollectionType(Map> collectionType) {
- this.collectionType = collectionType;
- }
-
- public void addCollectionType(Field field, Class> genericClass) {
- if (collectionType == null) {
- collectionType = new HashMap<>();
- }
- collectionType.put(field, genericClass);
- }
-
- void setColumnInfoList(List columnInfoList) {
- this.columnInfoList = columnInfoList;
- this.columns = new String[columnInfoList.size()];
- for (int i = 0; i < columnInfoList.size(); i++) {
- ColumnInfo columnInfo = columnInfoList.get(i);
- columns[i] = columnInfo.getColumn();
- columnInfoMapping.put(columnInfo.column, columnInfo);
- propertyColumnMapping.put(columnInfo.property, columnInfo.column);
- }
- }
-
-
- public List getPrimaryKeyList() {
- return primaryKeyList;
- }
-
- void setPrimaryKeyList(List primaryKeyList) {
- this.primaryKeyList = primaryKeyList;
- this.primaryKeys = new String[primaryKeyList.size()];
-
- List insertIdFields = new ArrayList<>();
- for (int i = 0; i < primaryKeyList.size(); i++) {
- IdInfo idInfo = primaryKeyList.get(i);
- primaryKeys[i] = idInfo.getColumn();
-
- if (idInfo.getKeyType() != KeyType.Auto && (idInfo.getBefore() != null && idInfo.getBefore())) {
- insertIdFields.add(idInfo.getColumn());
- }
-
- columnInfoMapping.put(idInfo.column, idInfo);
- propertyColumnMapping.put(idInfo.property, idInfo.column);
- }
- this.insertPrimaryKeys = insertIdFields.toArray(new String[0]);
- }
-
-
- /**
- * 插入(新增)数据时,获取所有要插入的字段
- *
- * @param entity
- * @param ignoreNulls
- * @return 字段列表
- */
- public String[] obtainInsertColumns(Object entity, boolean ignoreNulls) {
- if (!ignoreNulls) {
- return ArrayUtil.concat(insertPrimaryKeys, columns);
- } else {
- MetaObject metaObject = EntityMetaObject.forObject(entity, reflectorFactory);
- List retColumns = new ArrayList<>();
- for (String insertColumn : columns) {
- if (onInsertColumns != null && onInsertColumns.containsKey(insertColumn)) {
- retColumns.add(insertColumn);
- } else {
- Object value = buildColumnSqlArg(metaObject, insertColumn);
- if (value == null) {
- continue;
- }
- retColumns.add(insertColumn);
- }
- }
- return ArrayUtil.concat(insertPrimaryKeys, retColumns.toArray(new String[0]));
- }
- }
-
-
- /**
- * 构建 insert 的 Sql 参数
- *
- * @param entity 从 entity 中获取
- * @param ignoreNulls 是否忽略 null 值
- * @return 数组
- */
- public Object[] buildInsertSqlArgs(Object entity, boolean ignoreNulls) {
- MetaObject metaObject = EntityMetaObject.forObject(entity, reflectorFactory);
- String[] insertColumns = obtainInsertColumns(entity, ignoreNulls);
-
- List values = new ArrayList<>(insertColumns.length);
- for (String insertColumn : insertColumns) {
- if (onInsertColumns == null || !onInsertColumns.containsKey(insertColumn)) {
- Object value = buildColumnSqlArg(metaObject, insertColumn);
- if (ignoreNulls && value == null) {
- continue;
- }
- values.add(value);
- }
- }
- return values.toArray();
- }
-
-
- /**
- * 获取要修改的值
- *
- * @param entity
- * @param ignoreNulls
- */
- public Set obtainUpdateColumns(Object entity, boolean ignoreNulls, boolean includePrimary) {
- MetaObject metaObject = EntityMetaObject.forObject(entity, reflectorFactory);
- Set columns = new LinkedHashSet<>(); //需使用 LinkedHashSet 保证 columns 的顺序
- if (entity instanceof ModifyAttrsRecord) {
- Set properties = ((ModifyAttrsRecord) entity).obtainModifyAttrs();
- if (properties.isEmpty()) {
- return Collections.emptySet();
- }
- for (String property : properties) {
- String column = propertyColumnMapping.get(property);
- if (onUpdateColumns != null && onUpdateColumns.containsKey(column)) {
- continue;
- }
-
- //过滤乐观锁字段 和 租户字段
- if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) {
- continue;
- }
-
- if (!includePrimary && ArrayUtil.contains(primaryKeys, column)) {
- continue;
- }
-
- // ModifyAttrsRecord 忽略 ignoreNulls 的设置
- // Object value = getPropertyValue(metaObject, property);
- // if (ignoreNulls && value == null) {
- // continue;
- // }
- columns.add(column);
- }
- }
- //not ModifyAttrsRecord
- else {
- for (String column : this.columns) {
- if (onUpdateColumns != null && onUpdateColumns.containsKey(column)) {
- continue;
- }
-
- //过滤乐观锁字段 和 租户字段
- if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) {
- continue;
- }
-
- Object value = buildColumnSqlArg(metaObject, column);
- if (ignoreNulls && value == null) {
- continue;
- }
-
- columns.add(column);
- }
-
- // 普通 entity(非 ModifyAttrsRecord) 忽略 includePrimary 的设置
-// if (includePrimary) {
-// for (String column : this.primaryKeys) {
-// Object value = getColumnValue(metaObject, column);
-// if (ignoreNulls && value == null) {
-// continue;
-// }
-// columns.add(column);
-// }
-// }
- }
- return columns;
- }
-
- /**
- * 获取所有要修改的值,默认为全部除了主键以外的字段
- *
- * @param entity 实体对象
- * @return 数组
- */
- public Object[] buildUpdateSqlArgs(Object entity, boolean ignoreNulls, boolean includePrimary) {
- MetaObject metaObject = EntityMetaObject.forObject(entity, reflectorFactory);
- List values = new ArrayList<>();
- if (entity instanceof ModifyAttrsRecord) {
- Set properties = ((ModifyAttrsRecord) entity).obtainModifyAttrs();
- if (properties.isEmpty()) {
- return values.toArray();
- }
- for (String property : properties) {
- String column = propertyColumnMapping.get(property);
- if (onUpdateColumns != null && onUpdateColumns.containsKey(column)) {
- continue;
- }
- //过滤乐观锁字段 和 租户字段
- if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) {
- continue;
- }
-
- if (!includePrimary && ArrayUtil.contains(primaryKeys, column)) {
- continue;
- }
-
- Object value = buildColumnSqlArg(metaObject, column);
- // ModifyAttrsRecord 忽略 ignoreNulls 的设置,
- // 当使用 ModifyAttrsRecord 时,可以理解为要对字段进行 null 值进行更新,否则没必要使用 ModifyAttrsRecord
- // if (ignoreNulls && value == null) {
- // continue;
- // }
- values.add(value);
- }
- }
- // normal entity. not ModifyAttrsRecord
- else {
- for (String column : this.columns) {
- if (onUpdateColumns != null && onUpdateColumns.containsKey(column)) {
- continue;
- }
-
- //过滤乐观锁字段 和 租户字段
- if (ObjectUtil.equalsAny(column, versionColumn, tenantIdColumn)) {
- continue;
- }
-
- // 普通 entity 忽略 includePrimary 的设置,
- // 因为 for 循环中的 this.columns 本身就不包含有主键
- // if (includePrimary) {
- // }
-
- Object value = buildColumnSqlArg(metaObject, column);
- if (ignoreNulls && value == null) {
- continue;
- }
-
- values.add(value);
- }
- }
-
- return values.toArray();
- }
-
-
- /**
- * 构建主键的 sql 参数数据
- *
- * @param entity
- */
- public Object[] buildPkSqlArgs(Object entity) {
- MetaObject metaObject = EntityMetaObject.forObject(entity, reflectorFactory);
- Object[] values = new Object[primaryKeys.length];
- for (int i = 0; i < primaryKeys.length; i++) {
- values[i] = buildColumnSqlArg(metaObject, primaryKeys[i]);
- }
- return values;
- }
-
-
- public Object[] buildTenantIdArgs() {
- if (StringUtil.isBlank(tenantIdColumn)) {
- return null;
- }
-
- return TenantManager.getTenantIds();
- }
-
- private static final String APPEND_CONDITIONS_FLAG = "appendConditions";
-
- public void appendConditions(Object entity, QueryWrapper queryWrapper) {
-
- Object appendConditions = CPI.getContext(queryWrapper, APPEND_CONDITIONS_FLAG);
- if (Boolean.TRUE.equals(appendConditions)) {
- return;
- } else {
- CPI.putContext(queryWrapper, APPEND_CONDITIONS_FLAG, Boolean.TRUE);
- }
-
- //select xxx.id,(select..) from xxx
- List selectColumns = CPI.getSelectColumns(queryWrapper);
- if (selectColumns != null && !selectColumns.isEmpty()) {
- for (QueryColumn queryColumn : selectColumns) {
- if (queryColumn instanceof SelectQueryColumn) {
- QueryWrapper selectColumnQueryWrapper = CPI.getQueryWrapper((SelectQueryColumn) queryColumn);
- doAppendConditions(entity, selectColumnQueryWrapper);
- }
- }
- }
-
- //select * from (select ... from ) 中的子查询处理
- List queryTables = CPI.getQueryTables(queryWrapper);
- if (queryTables != null && !queryTables.isEmpty()) {
- for (QueryTable queryTable : queryTables) {
- if (queryTable instanceof SelectQueryTable) {
- QueryWrapper selectQueryWrapper = ((SelectQueryTable) queryTable).getQueryWrapper();
- doAppendConditions(entity, selectQueryWrapper);
- }
- }
- }
-
- //添加乐观锁条件,只有在 update 的时候进行处理
- if (StringUtil.isNotBlank(versionColumn) && entity != null) {
- Object versionValue = buildColumnSqlArg(entity, versionColumn);
- if (versionValue == null) {
- throw FlexExceptions.wrap("The version value of entity[%s] must not be null.", entity);
- }
- queryWrapper.and(QueryCondition.create(schema, tableName, versionColumn, SqlConsts.EQUALS, versionValue));
- }
-
- //逻辑删除
- if (StringUtil.isNotBlank(logicDeleteColumn)) {
- queryWrapper.and(QueryCondition.create(schema, tableName, logicDeleteColumn, SqlConsts.EQUALS
- , FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete()));
- }
-
- //多租户
- Object[] tenantIdArgs = buildTenantIdArgs();
- if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
- if (tenantIdArgs.length == 1) {
- queryWrapper.and(QueryCondition.create(schema, tableName, tenantIdColumn, SqlConsts.EQUALS, tenantIdArgs[0]));
- } else {
- queryWrapper.and(QueryCondition.create(schema, tableName, tenantIdColumn, SqlConsts.IN, tenantIdArgs));
- }
- }
-
- //子查询
- List childSelects = CPI.getChildSelect(queryWrapper);
- if (CollectionUtil.isNotEmpty(childSelects)) {
- for (QueryWrapper childQueryWrapper : childSelects) {
- doAppendConditions(entity, childQueryWrapper);
- }
- }
-
- //union
- List unions = CPI.getUnions(queryWrapper);
- if (CollectionUtil.isNotEmpty(unions)) {
- for (UnionWrapper union : unions) {
- QueryWrapper unionQueryWrapper = union.getQueryWrapper();
- doAppendConditions(entity, unionQueryWrapper);
- }
- }
- }
-
-
- private void doAppendConditions(Object entity, QueryWrapper queryWrapper) {
- List queryTables = CPI.getQueryTables(queryWrapper);
- if (queryTables != null && !queryTables.isEmpty()) {
- for (QueryTable queryTable : queryTables) {
- TableInfo tableInfo = TableInfoFactory.ofTableName(queryTable.getName());
- if (tableInfo != null) {
- tableInfo.appendConditions(entity, queryWrapper);
- }
- }
- }
- }
-
-
- public String getKeyProperties() {
- StringJoiner joiner = new StringJoiner(",");
- for (IdInfo value : primaryKeyList) {
- joiner.add(FlexConsts.ENTITY + "." + value.getProperty());
- }
- return joiner.toString();
- }
-
-
- public String getKeyColumns() {
- StringJoiner joiner = new StringJoiner(",");
- for (IdInfo value : primaryKeyList) {
- joiner.add(value.getColumn());
- }
- return joiner.toString();
- }
-
- public List getDefaultQueryColumn() {
- return Arrays.stream(defaultColumns)
- .map(name -> new QueryColumn(schema, getTableName(), name))
- .collect(Collectors.toList());
- }
-
-
- public ResultMap buildResultMap(Configuration configuration) {
- String resultMapId = entityClass.getName();
- if (configuration.hasResultMap(resultMapId)) {
- return configuration.getResultMap(resultMapId);
- }
- List resultMappings = new ArrayList<>();
-
- // 标签下的 标签映射
- for (ColumnInfo columnInfo : columnInfoList) {
- ResultMapping mapping = new ResultMapping.Builder(configuration, columnInfo.property,
- columnInfo.column, columnInfo.propertyType)
- .jdbcType(columnInfo.getJdbcType())
- .typeHandler(columnInfo.buildTypeHandler())
- .build();
- resultMappings.add(mapping);
-
- //add property mapper for sql: select xxx as property ...
- if (!Objects.equals(columnInfo.getColumn(), columnInfo.getProperty())) {
- ResultMapping propertyMapping = new ResultMapping.Builder(configuration, columnInfo.property,
- columnInfo.property, columnInfo.propertyType)
- .jdbcType(columnInfo.getJdbcType())
- .typeHandler(columnInfo.buildTypeHandler())
- .build();
- resultMappings.add(propertyMapping);
- }
- }
-
- // 标签下的 标签映射
- for (IdInfo idInfo : primaryKeyList) {
- ResultMapping mapping = new ResultMapping.Builder(configuration, idInfo.property,
- idInfo.column, idInfo.propertyType)
- .flags(CollectionUtil.newArrayList(ResultFlag.ID))
- .jdbcType(idInfo.getJdbcType())
- .typeHandler(idInfo.buildTypeHandler())
- .build();
- resultMappings.add(mapping);
- }
-
- // 标签下的 标签映射
- if (associationType != null) {
- associationType.forEach((fieldName, fieldType) -> {
- // 获取嵌套类型的信息,也就是 javaType 属性
- TableInfo tableInfo = TableInfoFactory.ofEntityClass(fieldType);
- // 构建嵌套类型的 ResultMap 对象,也就是 标签下的内容
- ResultMap nestedResultMap = tableInfo.buildResultMap(configuration);
- resultMappings.add(new ResultMapping.Builder(configuration, fieldName)
- .javaType(fieldType)
- .nestedResultMapId(nestedResultMap.getId())
- .build());
- });
- }
-
- // 标签下的 标签映射
- if (collectionType != null) {
- collectionType.forEach((field, genericClass) -> {
- // 获取集合泛型类型的信息,也就是 ofType 属性
- TableInfo tableInfo = TableInfoFactory.ofEntityClass(genericClass);
- // 构建嵌套类型的 ResultMap 对象,也就是 标签下的内容
- ResultMap nestedResultMap = tableInfo.buildResultMap(configuration);
- resultMappings.add(new ResultMapping.Builder(configuration, field.getName())
- .javaType(field.getType())
- .nestedResultMapId(nestedResultMap.getId())
- .build());
- });
- }
-
- ResultMap resultMap = new ResultMap.Builder(configuration, resultMapId, entityClass, resultMappings).build();
- configuration.addResultMap(resultMap);
- return resultMap;
- }
-
-
- private Object buildColumnSqlArg(MetaObject metaObject, String column) {
- ColumnInfo columnInfo = columnInfoMapping.get(column);
- Object value = getPropertyValue(metaObject, columnInfo.property);
-
- if (value != null) {
- TypeHandler typeHandler = columnInfo.buildTypeHandler();
- if (typeHandler != null) {
- return new TypeHandlerObject(typeHandler, value, columnInfo.getJdbcType());
- }
- }
-
- return value;
- }
-
-
- public Object buildColumnSqlArg(Object entityObject, String column) {
- MetaObject metaObject = EntityMetaObject.forObject(entityObject, reflectorFactory);
- return buildColumnSqlArg(metaObject, column);
- }
-
-
- private Object getPropertyValue(MetaObject metaObject, String property) {
- if (property != null && metaObject.hasGetter(property)) {
- return metaObject.getValue(property);
- }
- return null;
- }
-
-
- /**
- * 通过 row 实例类转换为一个 entity
- *
- * @return entity
- */
- public T newInstanceByRow(Row row, int index) {
- Object instance = ClassUtil.newInstance(entityClass);
- MetaObject metaObject = EntityMetaObject.forObject(instance, reflectorFactory);
- Set rowKeys = row.keySet();
- columnInfoMapping.forEach((column, columnInfo) -> {
- if (index <= 0) {
- for (String rowKey : rowKeys) {
- if (column.equalsIgnoreCase(rowKey)) {
- setInstancePropertyValue(row, instance, metaObject, columnInfo, rowKey);
- }
- }
- } else {
- for (int i = index; i >= 0; i--) {
- String newColumn = i <= 0 ? column : column + "$" + i;
- boolean fillValue = false;
- for (String rowKey : rowKeys) {
- if (newColumn.equalsIgnoreCase(rowKey)) {
- setInstancePropertyValue(row, instance, metaObject, columnInfo, rowKey);
- fillValue = true;
- break;
- }
- }
- if (fillValue) {
- break;
- }
- }
- }
- });
- return (T) instance;
- }
-
-
- private void setInstancePropertyValue(Row row, Object instance, MetaObject metaObject, ColumnInfo columnInfo, String rowKey) {
- Object rowValue = row.get(rowKey);
- TypeHandler> typeHandler = columnInfo.buildTypeHandler();
- if (typeHandler != null) {
- try {
- //通过 typeHandler 转换数据
- rowValue = typeHandler.getResult(getResultSet(rowValue), 0);
- } catch (SQLException e) {
- //ignore
- }
- }
- if (rowValue != null && !metaObject.getSetterType(columnInfo.property).isAssignableFrom(rowValue.getClass())) {
- rowValue = ConvertUtil.convert(rowValue, metaObject.getSetterType(columnInfo.property), true);
- }
- rowValue = invokeOnSetListener(instance, columnInfo.getProperty(), rowValue);
- metaObject.setValue(columnInfo.property, rowValue);
- }
-
-
- private ResultSet getResultSet(Object value) {
- return (ResultSet) Proxy.newProxyInstance(TableInfo.class.getClassLoader(),
- new Class[]{ResultSet.class}, (proxy, method, args) -> value);
- }
-
-
- /**
- * 初始化乐观锁版本号
- *
- * @param entityObject
- */
- public void initVersionValueIfNecessary(Object entityObject) {
- if (StringUtil.isBlank(versionColumn)) {
- return;
- }
-
- MetaObject metaObject = EntityMetaObject.forObject(entityObject, reflectorFactory);
- Object columnValue = getPropertyValue(metaObject, columnInfoMapping.get(versionColumn).property);
- if (columnValue == null) {
- String name = columnInfoMapping.get(versionColumn).property;
- Class> clazz = metaObject.getSetterType(name);
- metaObject.setValue(name, ConvertUtil.convert(0L, clazz));
- }
- }
-
- /**
- * 设置租户id
- *
- * @param entityObject
- */
- public void initTenantIdIfNecessary(Object entityObject) {
- if (StringUtil.isBlank(tenantIdColumn)) {
- return;
- }
-
- MetaObject metaObject = EntityMetaObject.forObject(entityObject, reflectorFactory);
- Object[] tenantIds = TenantManager.getTenantIds();
- if (tenantIds == null || tenantIds.length == 0) {
- return;
- }
-
- //默认使用第一个作为插入的租户ID
- Object tenantId = tenantIds[0];
- if (tenantId != null) {
- String property = columnInfoMapping.get(tenantIdColumn).property;
- Class> setterType = metaObject.getSetterType(property);
- metaObject.setValue(property, ConvertUtil.convert(tenantId, setterType));
- }
- }
-
- /**
- * 初始化逻辑删除的默认值
- *
- * @param entityObject
- */
- public void initLogicDeleteValueIfNecessary(Object entityObject) {
- if (StringUtil.isBlank(logicDeleteColumn)) {
- return;
- }
-
- MetaObject metaObject = EntityMetaObject.forObject(entityObject, reflectorFactory);
- Object columnValue = getPropertyValue(metaObject, columnInfoMapping.get(logicDeleteColumn).property);
- if (columnValue == null) {
- String property = columnInfoMapping.get(logicDeleteColumn).property;
- Class> setterType = metaObject.getSetterType(property);
- Object normalValueOfLogicDelete = FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete();
- metaObject.setValue(property, ConvertUtil.convert(normalValueOfLogicDelete, setterType));
- }
- }
-
-
- private static final Map, List> insertListenerCache = new ConcurrentHashMap<>();
-
- public void invokeOnInsertListener(Object entity) {
- List listeners = MapUtil.computeIfAbsent(insertListenerCache, entityClass, aClass -> {
- List globalListeners = FlexGlobalConfig.getDefaultConfig()
- .getSupportedInsertListener(entityClass, CollectionUtil.isNotEmpty(onInsertListeners));
- List allListeners = CollectionUtil.merge(onInsertListeners, globalListeners);
- Collections.sort(allListeners);
- return allListeners;
- });
- listeners.forEach(insertListener -> insertListener.onInsert(entity));
- }
-
-
- private static final Map, List> updateListenerCache = new ConcurrentHashMap<>();
-
- public void invokeOnUpdateListener(Object entity) {
- List listeners = MapUtil.computeIfAbsent(updateListenerCache, entityClass, aClass -> {
- List globalListeners = FlexGlobalConfig.getDefaultConfig()
- .getSupportedUpdateListener(entityClass, CollectionUtil.isNotEmpty(onUpdateListeners));
- List allListeners = CollectionUtil.merge(onUpdateListeners, globalListeners);
- Collections.sort(allListeners);
- return allListeners;
- });
- listeners.forEach(insertListener -> insertListener.onUpdate(entity));
- }
-
-
- private static final Map, List> setListenerCache = new ConcurrentHashMap<>();
-
- public Object invokeOnSetListener(Object entity, String property, Object value) {
- List listeners = MapUtil.computeIfAbsent(setListenerCache, entityClass, aClass -> {
- List globalListeners = FlexGlobalConfig.getDefaultConfig()
- .getSupportedSetListener(entityClass, CollectionUtil.isNotEmpty(onSetListeners));
- List allListeners = CollectionUtil.merge(onSetListeners, globalListeners);
- Collections.sort(allListeners);
- return allListeners;
- });
- for (SetListener setListener : listeners) {
- value = setListener.onSet(entity, property, value);
- }
- return value;
- }
-
- public QueryColumn getQueryColumnByProperty(String property) {
- return new QueryColumn(schema, tableName, propertyColumnMapping.get(property));
- }
-}