feat: 重构 DynamicSchemaProcessor,添加 table 参数

This commit is contained in:
开源海哥 2023-10-17 16:34:28 +08:00
parent 338e17f30e
commit f5b9f37dbf
8 changed files with 35 additions and 24 deletions

View File

@ -35,8 +35,8 @@ public interface IDialect {
return TableManager.getRealTable(table); return TableManager.getRealTable(table);
} }
default String getRealSchema(String schema) { default String getRealSchema(String schema, String table) {
return TableManager.getRealSchema(schema); return TableManager.getRealSchema(schema, table);
} }
String forHint(String hintString); String forHint(String hintString);

View File

@ -96,12 +96,13 @@ public class CommonsDialectImpl implements IDialect {
index++; index++;
} }
String table = getRealTable(tableName);
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
sql.append(INSERT_INTO); sql.append(INSERT_INTO);
if (StringUtil.isNotBlank(schema)) { if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema))).append(REFERENCE); sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE);
} }
sql.append(wrap(getRealTable(tableName))); sql.append(wrap(table));
sql.append(BRACKET_LEFT).append(fields).append(BRACKET_RIGHT); sql.append(BRACKET_LEFT).append(fields).append(BRACKET_RIGHT);
sql.append(VALUES).append(BRACKET_LEFT).append(paramsOrPlaceholder).append(BRACKET_RIGHT); sql.append(VALUES).append(BRACKET_LEFT).append(paramsOrPlaceholder).append(BRACKET_RIGHT);
return sql.toString(); return sql.toString();
@ -131,13 +132,13 @@ public class CommonsDialectImpl implements IDialect {
} }
} }
String table = getRealTable(tableName);
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
sql.append(INSERT_INTO); sql.append(INSERT_INTO);
if (StringUtil.isNotBlank(schema)) { if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema))).append(REFERENCE); sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE);
} }
sql.append(wrap(getRealTable(tableName))); sql.append(wrap(table));
sql.append(BLANK).append(BRACKET_LEFT) sql.append(BLANK).append(BRACKET_LEFT)
.append(fields) .append(fields)
.append(BRACKET_RIGHT).append(BLANK); .append(BRACKET_RIGHT).append(BLANK);
@ -148,12 +149,13 @@ public class CommonsDialectImpl implements IDialect {
@Override @Override
public String forDeleteById(String schema, String tableName, String[] primaryKeys) { public String forDeleteById(String schema, String tableName, String[] primaryKeys) {
String table = getRealTable(tableName);
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
sql.append(DELETE_FROM); sql.append(DELETE_FROM);
if (StringUtil.isNotBlank(schema)) { if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema))).append(REFERENCE); sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE);
} }
sql.append(wrap(getRealTable(tableName))); sql.append(wrap(table));
sql.append(WHERE); sql.append(WHERE);
for (int i = 0; i < primaryKeys.length; i++) { for (int i = 0; i < primaryKeys.length; i++) {
if (i > 0) { if (i > 0) {
@ -167,12 +169,14 @@ public class CommonsDialectImpl implements IDialect {
@Override @Override
public String forDeleteBatchByIds(String schema, String tableName, String[] primaryKeys, Object[] ids) { public String forDeleteBatchByIds(String schema, String tableName, String[] primaryKeys, Object[] ids) {
String table = getRealTable(tableName);
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
sql.append(DELETE_FROM); sql.append(DELETE_FROM);
if (StringUtil.isNotBlank(schema)) { if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema))).append(REFERENCE); sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE);
} }
sql.append(wrap(getRealTable(tableName)));
sql.append(wrap(table));
sql.append(WHERE); sql.append(WHERE);
//多主键的场景 //多主键的场景
@ -210,17 +214,18 @@ public class CommonsDialectImpl implements IDialect {
@Override @Override
public String forUpdateById(String schema, String tableName, Row row) { public String forUpdateById(String schema, String tableName, Row row) {
String table = getRealTable(tableName);
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
Set<String> modifyAttrs = RowCPI.getModifyAttrs(row); Set<String> modifyAttrs = RowCPI.getModifyAttrs(row);
Map<String, RawValue> rawValueMap = RowCPI.getRawValueMap(row); Map<String, RawValue> rawValueMap = RowCPI.getRawValueMap(row);
String[] primaryKeys = RowCPI.obtainsPrimaryKeyStrings(row); String[] primaryKeys = RowCPI.obtainsPrimaryKeyStrings(row);
sql.append(UPDATE); sql.append(UPDATE);
if (StringUtil.isNotBlank(schema)) { if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema))).append(REFERENCE); sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE);
} }
sql.append(wrap(getRealTable(tableName))).append(SET);
sql.append(wrap(table)).append(SET);
int index = 0; int index = 0;
for (Map.Entry<String, Object> e : row.entrySet()) { for (Map.Entry<String, Object> e : row.entrySet()) {
String colName = e.getKey(); String colName = e.getKey();
@ -314,11 +319,12 @@ public class CommonsDialectImpl implements IDialect {
@Override @Override
public String forSelectOneById(String schema, String tableName, String[] primaryKeys, Object[] primaryValues) { public String forSelectOneById(String schema, String tableName, String[] primaryKeys, Object[] primaryValues) {
String table = getRealTable(tableName);
StringBuilder sql = new StringBuilder(SELECT_ALL_FROM); StringBuilder sql = new StringBuilder(SELECT_ALL_FROM);
if (StringUtil.isNotBlank(schema)) { if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema))).append(REFERENCE); sql.append(wrap(getRealSchema(schema, table))).append(REFERENCE);
} }
sql.append(wrap(getRealTable(tableName))).append(WHERE); sql.append(wrap(table)).append(WHERE);
for (int i = 0; i < primaryKeys.length; i++) { for (int i = 0; i < primaryKeys.length; i++) {
if (i > 0) { if (i > 0) {
sql.append(AND); sql.append(AND);

View File

@ -168,9 +168,10 @@ public class OracleDialect extends CommonsDialectImpl {
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
sql.append(INSERT_ALL); sql.append(INSERT_ALL);
String table = getRealTable(tableName);
String tableNameWrap = StringUtil.isNotBlank(schema) String tableNameWrap = StringUtil.isNotBlank(schema)
? wrap(getRealSchema(schema)) + REFERENCE + wrap(getRealTable(tableName)) ? wrap(getRealSchema(schema,table)) + REFERENCE + wrap(table)
: wrap(getRealTable(tableName)); : wrap(table);
String questionStrings = SqlUtil.buildSqlParamPlaceholder(attrs.size()); String questionStrings = SqlUtil.buildSqlParamPlaceholder(attrs.size());
for (int i = 0; i < rows.size(); i++) { for (int i = 0; i < rows.size(); i++) {

View File

@ -977,7 +977,9 @@ public class QueryColumn implements CloneSupport<QueryColumn>, Conditional<Query
if (StringUtil.isNotBlank(selectTable.alias)) { if (StringUtil.isNotBlank(selectTable.alias)) {
return dialect.wrap(selectTable.alias) + SqlConsts.REFERENCE + dialect.wrap(name); return dialect.wrap(selectTable.alias) + SqlConsts.REFERENCE + dialect.wrap(name);
} else if (StringUtil.isNotBlank(selectTable.getSchema()) && StringUtil.isNotBlank(selectTable.getName())) { } else if (StringUtil.isNotBlank(selectTable.getSchema()) && StringUtil.isNotBlank(selectTable.getName())) {
return dialect.wrap(dialect.getRealSchema(selectTable.schema)) + SqlConsts.REFERENCE + dialect.wrap(dialect.getRealTable(selectTable.getName())) + SqlConsts.REFERENCE + dialect.wrap(name); String realTable = dialect.getRealTable(selectTable.getName());
return dialect.wrap(dialect.getRealSchema(selectTable.schema, realTable)) + SqlConsts.REFERENCE + dialect.wrap(realTable)
+ SqlConsts.REFERENCE + dialect.wrap(name);
} else if (StringUtil.isNotBlank(selectTable.getName())) { } else if (StringUtil.isNotBlank(selectTable.getName())) {
return dialect.wrap(dialect.getRealTable(selectTable.getName())) + SqlConsts.REFERENCE + dialect.wrap(name); return dialect.wrap(dialect.getRealTable(selectTable.getName())) + SqlConsts.REFERENCE + dialect.wrap(name);
} else { } else {

View File

@ -114,7 +114,8 @@ public class QueryTable implements CloneSupport<QueryTable> {
public String toSql(IDialect dialect) { public String toSql(IDialect dialect) {
String sql; String sql;
if (StringUtil.isNotBlank(schema)) { if (StringUtil.isNotBlank(schema)) {
sql = dialect.wrap(dialect.getRealSchema(schema)) + "." + dialect.wrap(dialect.getRealTable(name)) + WrapperUtil.buildAlias(alias, dialect); String table = dialect.getRealTable(name);
sql = dialect.wrap(dialect.getRealSchema(schema, table)) + "." + dialect.wrap(table) + WrapperUtil.buildAlias(alias, dialect);
} else { } else {
sql = dialect.wrap(dialect.getRealTable(name)) + WrapperUtil.buildAlias(alias, dialect); sql = dialect.wrap(dialect.getRealTable(name)) + WrapperUtil.buildAlias(alias, dialect);
} }

View File

@ -17,6 +17,6 @@ package com.mybatisflex.core.table;
public interface DynamicSchemaProcessor { public interface DynamicSchemaProcessor {
String process(String schema); String process(String schema, String table);
} }

View File

@ -143,7 +143,8 @@ public class TableInfo {
public String getWrapSchemaAndTableName(IDialect dialect) { public String getWrapSchemaAndTableName(IDialect dialect) {
if (StringUtil.isNotBlank(schema)) { if (StringUtil.isNotBlank(schema)) {
return dialect.wrap(dialect.getRealSchema(schema)) + "." + dialect.wrap(dialect.getRealTable(tableName)); String table = dialect.getRealTable(tableName);
return dialect.wrap(dialect.getRealSchema(schema, table)) + "." + dialect.wrap(table);
} else { } else {
return dialect.wrap(dialect.getRealTable(tableName)); return dialect.wrap(dialect.getRealTable(tableName));
} }

View File

@ -97,7 +97,7 @@ public class TableManager {
} }
public static String getRealSchema(String schema) { public static String getRealSchema(String schema, String table) {
Map<String, String> mapping = schemaMappingTL.get(); Map<String, String> mapping = schemaMappingTL.get();
if (mapping != null) { if (mapping != null) {
String dynamicSchema = mapping.get(schema); String dynamicSchema = mapping.get(schema);
@ -110,7 +110,7 @@ public class TableManager {
return schema; return schema;
} }
String dynamicSchema = dynamicSchemaProcessor.process(schema); String dynamicSchema = dynamicSchemaProcessor.process(schema, table);
return StringUtil.isNotBlank(dynamicSchema) ? dynamicSchema : schema; return StringUtil.isNotBlank(dynamicSchema) ? dynamicSchema : schema;
} }