From 19ae7ecdb650abbd2d732ff9213bcc9e3fae0c6c Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Sat, 16 Mar 2024 10:14:03 +0800 Subject: [PATCH] feat: add operateType param for DynamicSchemaProcessor --- .../mybatisflex/core/dialect/IDialect.java | 19 ++--- .../core/dialect/impl/CommonsDialectImpl.java | 70 +++++++++---------- .../core/dialect/impl/OracleDialect.java | 4 +- .../mybatisflex/core/query/QueryColumn.java | 4 +- .../mybatisflex/core/query/QueryTable.java | 6 +- .../core/table/DynamicSchemaProcessor.java | 4 +- .../com/mybatisflex/core/table/TableInfo.java | 6 +- .../mybatisflex/core/table/TableManager.java | 6 +- .../src/main/resources/application.yml | 2 +- 9 files changed, 62 insertions(+), 59 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/IDialect.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/IDialect.java index 98c9eef8..7b40e66a 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/IDialect.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/IDialect.java @@ -32,11 +32,11 @@ public interface IDialect { String wrapColumnAlias(String keyword); default String getRealTable(String table, OperateType operateType) { - return TableManager.getRealTable(table,operateType); + return TableManager.getRealTable(table, operateType); } - default String getRealSchema(String schema, String table) { - return TableManager.getRealSchema(schema, table); + default String getRealSchema(String schema, String table, OperateType operateType) { + return TableManager.getRealSchema(schema, table, operateType); } String forHint(String hintString); @@ -95,7 +95,7 @@ public interface IDialect { * 权限处理 * * @param queryWrapper queryWrapper - * @param operateType 操作类型 + * @param operateType 操作类型 */ default void prepareAuth(QueryWrapper queryWrapper, OperateType operateType) { } @@ -103,9 +103,9 @@ public interface IDialect { /** * 权限处理 * - * @param schema schema - * @param tableName 表名 - * @param sql sql + * @param schema schema + * @param tableName 表名 + * @param sql sql * @param operateType 操作类型 */ default void prepareAuth(String schema, String tableName, StringBuilder sql, OperateType operateType) { @@ -113,8 +113,9 @@ public interface IDialect { /** * 权限处理 - * @param tableInfo tableInfo - * @param sql sql + * + * @param tableInfo tableInfo + * @param sql sql * @param operateType 操作类型 */ default void prepareAuth(TableInfo tableInfo, StringBuilder sql, OperateType operateType) { diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java index 6b15da79..a34e397d 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java @@ -140,11 +140,11 @@ public class CommonsDialectImpl implements IDialect { index++; } - String table = getRealTable(tableName,OperateType.INSERT); + String table = getRealTable(tableName, OperateType.INSERT); StringBuilder sql = new StringBuilder(); sql.append(INSERT_INTO); if (StringUtil.isNotBlank(schema)) { - sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE); + sql.append(wrap(getRealSchema(schema, table, OperateType.INSERT))).append(REFERENCE); } sql.append(wrap(table)); sql.append(BRACKET_LEFT).append(fields).append(BRACKET_RIGHT); @@ -176,11 +176,11 @@ public class CommonsDialectImpl implements IDialect { } } - String table = getRealTable(tableName,OperateType.INSERT); + String table = getRealTable(tableName, OperateType.INSERT); StringBuilder sql = new StringBuilder(); sql.append(INSERT_INTO); if (StringUtil.isNotBlank(schema)) { - sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE); + sql.append(wrap(getRealSchema(schema, table, OperateType.INSERT))).append(REFERENCE); } sql.append(wrap(table)); sql.append(BLANK).append(BRACKET_LEFT) @@ -193,11 +193,11 @@ public class CommonsDialectImpl implements IDialect { @Override public String forDeleteById(String schema, String tableName, String[] primaryKeys) { - String table = getRealTable(tableName,OperateType.DELETE); + String table = getRealTable(tableName, OperateType.DELETE); StringBuilder sql = new StringBuilder(); sql.append(DELETE_FROM); if (StringUtil.isNotBlank(schema)) { - sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE); + sql.append(wrap(getRealSchema(schema, table, OperateType.DELETE))).append(REFERENCE); } sql.append(wrap(table)); sql.append(WHERE); @@ -214,11 +214,11 @@ public class CommonsDialectImpl implements IDialect { @Override public String forDeleteBatchByIds(String schema, String tableName, String[] primaryKeys, Object[] ids) { - String table = getRealTable(tableName,OperateType.DELETE); + String table = getRealTable(tableName, OperateType.DELETE); StringBuilder sql = new StringBuilder(); sql.append(DELETE_FROM); if (StringUtil.isNotBlank(schema)) { - sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE); + sql.append(wrap(getRealSchema(schema, table, OperateType.DELETE))).append(REFERENCE); } sql.append(wrap(table)); @@ -261,7 +261,7 @@ public class CommonsDialectImpl implements IDialect { @Override public String forUpdateById(String schema, String tableName, Row row) { - String table = getRealTable(tableName,OperateType.UPDATE); + String table = getRealTable(tableName, OperateType.UPDATE); StringBuilder sql = new StringBuilder(); Set modifyAttrs = RowCPI.getModifyAttrs(row); Map rawValueMap = RowCPI.getRawValueMap(row); @@ -269,7 +269,7 @@ public class CommonsDialectImpl implements IDialect { sql.append(UPDATE); if (StringUtil.isNotBlank(schema)) { - sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE); + sql.append(wrap(getRealSchema(schema, table, OperateType.UPDATE))).append(REFERENCE); } sql.append(wrap(table)).append(SET); @@ -317,7 +317,7 @@ public class CommonsDialectImpl implements IDialect { //fix: support schema QueryTable queryTable = queryTables.get(0); - sqlBuilder.append(UPDATE).append(queryTable.toSql(this,OperateType.UPDATE)).append(SET); + sqlBuilder.append(UPDATE).append(queryTable.toSql(this, OperateType.UPDATE)).append(SET); int index = 0; for (String modifyAttr : modifyAttrs) { if (index > 0) { @@ -335,7 +335,7 @@ public class CommonsDialectImpl implements IDialect { index++; } - buildJoinSql(sqlBuilder, queryWrapper, queryTables,OperateType.UPDATE); + buildJoinSql(sqlBuilder, queryWrapper, queryTables, OperateType.UPDATE); buildWhereSql(sqlBuilder, queryWrapper, queryTables, false); buildGroupBySql(sqlBuilder, queryWrapper, queryTables); buildHavingSql(sqlBuilder, queryWrapper, queryTables); @@ -367,10 +367,10 @@ public class CommonsDialectImpl implements IDialect { @Override public String forSelectOneById(String schema, String tableName, String[] primaryKeys, Object[] primaryValues) { - String table = getRealTable(tableName,OperateType.SELECT); + String table = getRealTable(tableName, OperateType.SELECT); StringBuilder sql = new StringBuilder(SELECT_ALL_FROM); if (StringUtil.isNotBlank(schema)) { - sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE); + sql.append(wrap(getRealSchema(schema, table, OperateType.SELECT))).append(REFERENCE); } sql.append(wrap(table)).append(WHERE); for (int i = 0; i < primaryKeys.length; i++) { @@ -438,9 +438,9 @@ public class CommonsDialectImpl implements IDialect { buildSelectColumnSql(sqlBuilder, allTables, selectColumns, CPI.getHint(queryWrapper)); - sqlBuilder.append(FROM).append(StringUtil.join(DELIMITER, queryTables, queryTable -> queryTable.toSql(this,OperateType.SELECT))); + sqlBuilder.append(FROM).append(StringUtil.join(DELIMITER, queryTables, queryTable -> queryTable.toSql(this, OperateType.SELECT))); - buildJoinSql(sqlBuilder, queryWrapper, allTables,OperateType.SELECT); + buildJoinSql(sqlBuilder, queryWrapper, allTables, OperateType.SELECT); buildWhereSql(sqlBuilder, queryWrapper, allTables, true); buildGroupBySql(sqlBuilder, queryWrapper, allTables); buildHavingSql(sqlBuilder, queryWrapper, allTables); @@ -474,7 +474,7 @@ public class CommonsDialectImpl implements IDialect { public String buildNoSelectSql(QueryWrapper queryWrapper) { StringBuilder sqlBuilder = new StringBuilder(); - buildJoinSql(sqlBuilder, queryWrapper, Collections.EMPTY_LIST,OperateType.SELECT); + buildJoinSql(sqlBuilder, queryWrapper, Collections.EMPTY_LIST, OperateType.SELECT); buildWhereSql(sqlBuilder, queryWrapper, Collections.EMPTY_LIST, true); buildGroupBySql(sqlBuilder, queryWrapper, Collections.EMPTY_LIST); buildHavingSql(sqlBuilder, queryWrapper, Collections.EMPTY_LIST); @@ -546,17 +546,17 @@ public class CommonsDialectImpl implements IDialect { throw new IllegalArgumentException("Delete with join sql must has 1 table only. but current has " + queryTables.size()); } QueryTable queryTable = queryTables.get(0); - String table = getRealTable(queryTable.getName(),OperateType.DELETE); + String table = getRealTable(queryTable.getName(), OperateType.DELETE); if (StringUtil.isNotBlank(queryTable.getSchema())) { - sqlBuilder.append(wrap(getRealSchema(queryTable.getSchema(), table))).append(REFERENCE); + sqlBuilder.append(wrap(getRealSchema(queryTable.getSchema(), table, OperateType.DELETE))).append(REFERENCE); } - sqlBuilder.append(BLANK).append(wrap(getRealTable(table,OperateType.DELETE))); + sqlBuilder.append(BLANK).append(wrap(getRealTable(table, OperateType.DELETE))); } - sqlBuilder.append(FROM).append(StringUtil.join(DELIMITER, queryTables, queryTable -> queryTable.toSql(this,OperateType.DELETE))); + sqlBuilder.append(FROM).append(StringUtil.join(DELIMITER, queryTables, queryTable -> queryTable.toSql(this, OperateType.DELETE))); - buildJoinSql(sqlBuilder, queryWrapper, allTables,OperateType.DELETE); + buildJoinSql(sqlBuilder, queryWrapper, allTables, OperateType.DELETE); buildWhereSql(sqlBuilder, queryWrapper, allTables, false); buildGroupBySql(sqlBuilder, queryWrapper, allTables); buildHavingSql(sqlBuilder, queryWrapper, allTables); @@ -591,7 +591,7 @@ public class CommonsDialectImpl implements IDialect { @Override public String forInsertEntity(TableInfo tableInfo, Object entity, boolean ignoreNulls) { StringBuilder sql = new StringBuilder(); - sql.append(INSERT_INTO).append(tableInfo.getWrapSchemaAndTableName(this,OperateType.INSERT)); + sql.append(INSERT_INTO).append(tableInfo.getWrapSchemaAndTableName(this, OperateType.INSERT)); String[] insertColumns = tableInfo.obtainInsertColumns(entity, ignoreNulls); Map onInsertColumns = tableInfo.getOnInsertColumns(); @@ -623,7 +623,7 @@ public class CommonsDialectImpl implements IDialect { public String forInsertEntityWithPk(TableInfo tableInfo, Object entity, boolean ignoreNulls) { StringBuilder sql = new StringBuilder(); - sql.append(INSERT_INTO).append(tableInfo.getWrapSchemaAndTableName(this,OperateType.INSERT)); + sql.append(INSERT_INTO).append(tableInfo.getWrapSchemaAndTableName(this, OperateType.INSERT)); String[] insertColumns = tableInfo.obtainInsertColumnsWithPk(entity, ignoreNulls); Map onInsertColumns = tableInfo.getOnInsertColumns(); @@ -650,7 +650,7 @@ public class CommonsDialectImpl implements IDialect { @Override public String forInsertEntityBatch(TableInfo tableInfo, List entities) { StringBuilder sql = new StringBuilder(); - sql.append(INSERT_INTO).append(tableInfo.getWrapSchemaAndTableName(this,OperateType.INSERT)); + sql.append(INSERT_INTO).append(tableInfo.getWrapSchemaAndTableName(this, OperateType.INSERT)); String[] insertColumns = tableInfo.obtainInsertColumns(null, false); String[] warpedInsertColumns = new String[insertColumns.length]; for (int i = 0; i < insertColumns.length; i++) { @@ -696,7 +696,7 @@ public class CommonsDialectImpl implements IDialect { StringBuilder sql = new StringBuilder(); String[] primaryKeys = tableInfo.getPrimaryColumns(); - sql.append(UPDATE).append(tableInfo.getWrapSchemaAndTableName(this,OperateType.UPDATE)); + sql.append(UPDATE).append(tableInfo.getWrapSchemaAndTableName(this, OperateType.UPDATE)); sql.append(SET).append(buildLogicDeletedSet(logicDeleteColumn, tableInfo)); sql.append(WHERE); for (int i = 0; i < primaryKeys.length; i++) { @@ -734,7 +734,7 @@ public class CommonsDialectImpl implements IDialect { StringBuilder sql = new StringBuilder(); sql.append(UPDATE); - sql.append(tableInfo.getWrapSchemaAndTableName(this,OperateType.UPDATE)); + sql.append(tableInfo.getWrapSchemaAndTableName(this, OperateType.UPDATE)); sql.append(SET).append(buildLogicDeletedSet(logicDeleteColumn, tableInfo)); sql.append(WHERE); sql.append(BRACKET_LEFT); @@ -793,11 +793,11 @@ public class CommonsDialectImpl implements IDialect { //ignore selectColumns StringBuilder sqlBuilder = new StringBuilder(UPDATE).append(forHint(CPI.getHint(queryWrapper))); - sqlBuilder.append(tableInfo.getWrapSchemaAndTableName(this,OperateType.DELETE)); + sqlBuilder.append(tableInfo.getWrapSchemaAndTableName(this, OperateType.DELETE)); sqlBuilder.append(SET).append(buildLogicDeletedSet(logicDeleteColumn, tableInfo)); - buildJoinSql(sqlBuilder, queryWrapper, allTables,OperateType.DELETE); + buildJoinSql(sqlBuilder, queryWrapper, allTables, OperateType.DELETE); buildWhereSql(sqlBuilder, queryWrapper, allTables, false); buildGroupBySql(sqlBuilder, queryWrapper, allTables); buildHavingSql(sqlBuilder, queryWrapper, allTables); @@ -818,7 +818,7 @@ public class CommonsDialectImpl implements IDialect { Map rawValueMap = tableInfo.obtainUpdateRawValueMap(entity); String[] primaryKeys = tableInfo.getPrimaryColumns(); - sql.append(UPDATE).append(tableInfo.getWrapSchemaAndTableName(this,OperateType.UPDATE)).append(SET); + sql.append(UPDATE).append(tableInfo.getWrapSchemaAndTableName(this, OperateType.UPDATE)).append(SET); StringJoiner stringJoiner = new StringJoiner(DELIMITER); @@ -884,10 +884,10 @@ public class CommonsDialectImpl implements IDialect { Map rawValueMap = tableInfo.obtainUpdateRawValueMap(entity); sqlBuilder.append(UPDATE).append(forHint(CPI.getHint(queryWrapper))); - sqlBuilder.append(tableInfo.getWrapSchemaAndTableName(this,OperateType.UPDATE)); + sqlBuilder.append(tableInfo.getWrapSchemaAndTableName(this, OperateType.UPDATE)); List queryTables = CPI.getQueryTables(queryWrapper); - buildJoinSql(sqlBuilder, queryWrapper, queryTables,OperateType.UPDATE); + buildJoinSql(sqlBuilder, queryWrapper, queryTables, OperateType.UPDATE); sqlBuilder.append(SET); @@ -946,7 +946,7 @@ public class CommonsDialectImpl implements IDialect { public String forSelectOneEntityById(TableInfo tableInfo) { StringBuilder sql = new StringBuilder(); buildSelectColumnSql(sql, null, null, null); - sql.append(FROM).append(tableInfo.getWrapSchemaAndTableName(this,OperateType.SELECT)); + sql.append(FROM).append(tableInfo.getWrapSchemaAndTableName(this, OperateType.SELECT)); sql.append(WHERE); String[] pKeys = tableInfo.getPrimaryColumns(); for (int i = 0; i < pKeys.length; i++) { @@ -974,7 +974,7 @@ public class CommonsDialectImpl implements IDialect { public String forSelectEntityListByIds(TableInfo tableInfo, Object[] primaryValues) { StringBuilder sql = new StringBuilder(); buildSelectColumnSql(sql, null, tableInfo.getDefaultQueryColumn(), null); - sql.append(FROM).append(tableInfo.getWrapSchemaAndTableName(this,OperateType.SELECT)); + sql.append(FROM).append(tableInfo.getWrapSchemaAndTableName(this, OperateType.SELECT)); sql.append(WHERE); String[] primaryKeys = tableInfo.getPrimaryColumns(); @@ -1034,7 +1034,7 @@ public class CommonsDialectImpl implements IDialect { if (!join.checkEffective()) { continue; } - sqlBuilder.append(join.toSql(queryTables, this,operateType)); + sqlBuilder.append(join.toSql(queryTables, this, operateType)); joinSuccess = true; } } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/OracleDialect.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/OracleDialect.java index 7f8f54c2..5c2f5266 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/OracleDialect.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/OracleDialect.java @@ -169,9 +169,9 @@ public class OracleDialect extends CommonsDialectImpl { StringBuilder sql = new StringBuilder(); sql.append(INSERT_ALL); - String table = getRealTable(tableName,OperateType.INSERT); + String table = getRealTable(tableName, OperateType.INSERT); String tableNameWrap = StringUtil.isNotBlank(schema) - ? wrap(getRealSchema(schema,table)) + REFERENCE + wrap(table) + ? wrap(getRealSchema(schema, table, OperateType.INSERT)) + REFERENCE + wrap(table) : wrap(table); String questionStrings = SqlUtil.buildSqlParamPlaceholder(attrs.size()); diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryColumn.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryColumn.java index adc3d7d4..d5d22804 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryColumn.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryColumn.java @@ -979,10 +979,10 @@ public class QueryColumn implements CloneSupport, Conditional { public String toSql(IDialect dialect, OperateType operateType) { String sql; if (StringUtil.isNotBlank(schema)) { - String table = dialect.getRealTable(name,operateType); - sql = dialect.wrap(dialect.getRealSchema(schema, table)) + "." + dialect.wrap(table) + WrapperUtil.buildAlias(alias, dialect); + String table = dialect.getRealTable(name, operateType); + sql = dialect.wrap(dialect.getRealSchema(schema, table, operateType)) + "." + dialect.wrap(table) + WrapperUtil.buildAlias(alias, dialect); } else { - sql = dialect.wrap(dialect.getRealTable(name,operateType)) + WrapperUtil.buildAlias(alias, dialect); + sql = dialect.wrap(dialect.getRealTable(name, operateType)) + WrapperUtil.buildAlias(alias, dialect); } return sql; } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/DynamicSchemaProcessor.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/DynamicSchemaProcessor.java index 157d5792..8887c62b 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/DynamicSchemaProcessor.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/DynamicSchemaProcessor.java @@ -15,8 +15,10 @@ */ package com.mybatisflex.core.table; +import com.mybatisflex.core.dialect.OperateType; + public interface DynamicSchemaProcessor { - String process(String schema, String table); + String process(String schema, String table, OperateType operateType); } 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 6dce5a7e..4979bab7 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 @@ -182,10 +182,10 @@ public class TableInfo { public String getWrapSchemaAndTableName(IDialect dialect, OperateType operateType) { if (StringUtil.isNotBlank(schema)) { - String table = dialect.getRealTable(tableName,operateType); - return dialect.wrap(dialect.getRealSchema(schema, table)) + "." + dialect.wrap(table); + String table = dialect.getRealTable(tableName, operateType); + return dialect.wrap(dialect.getRealSchema(schema, table, operateType)) + "." + dialect.wrap(table); } else { - return dialect.wrap(dialect.getRealTable(tableName,operateType)); + return dialect.wrap(dialect.getRealTable(tableName, operateType)); } } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableManager.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableManager.java index bb9808ea..6295dc0a 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableManager.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableManager.java @@ -93,12 +93,12 @@ public class TableManager { return tableName; } - String dynamicTableName = dynamicTableProcessor.process(tableName,operateType); + String dynamicTableName = dynamicTableProcessor.process(tableName, operateType); return StringUtil.isNotBlank(dynamicTableName) ? dynamicTableName : tableName; } - public static String getRealSchema(String schema, String table) { + public static String getRealSchema(String schema, String table, OperateType operateType) { Map mapping = schemaMappingTL.get(); if (mapping != null) { String dynamicSchema = mapping.get(schema); @@ -111,7 +111,7 @@ public class TableManager { return schema; } - String dynamicSchema = dynamicSchemaProcessor.process(schema, table); + String dynamicSchema = dynamicSchemaProcessor.process(schema, table, operateType); return StringUtil.isNotBlank(dynamicSchema) ? dynamicSchema : schema; } diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/resources/application.yml b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/resources/application.yml index 0ce252f9..c6ae79f0 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/resources/application.yml +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/main/resources/application.yml @@ -7,7 +7,7 @@ spring: # driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/flex_test username: root - password: 12345678 + password: 123456 # driver-class-name: # datasource: # driver-class-name: org.h2.Driver