Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: 优化数据库方言拓展性 #264

Merged
merged 1 commit into from
Dec 19, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.hswebframework.web.crud.configuration;

import org.hswebframework.ezorm.rdb.metadata.RDBSchemaMetadata;
import org.hswebframework.ezorm.rdb.metadata.dialect.Dialect;

public interface DialectProvider {

String name();

Dialect getDialect();

String getBindSymbol();

RDBSchemaMetadata createSchema(String name);

default String getValidationSql(){
return "select 1";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.hswebframework.web.crud.configuration;

import lombok.SneakyThrows;

import java.util.HashMap;
import java.util.Map;
import java.util.ServiceLoader;

public class DialectProviders {
private static final Map<String, DialectProvider> allSupportedDialect = new HashMap<>();

static {
for (EasyormProperties.DialectEnum value : EasyormProperties.DialectEnum.values()) {
allSupportedDialect.put(value.name(), value);
}

for (DialectProvider dialectProvider : ServiceLoader.load(DialectProvider.class)) {
allSupportedDialect.put(dialectProvider.name(), dialectProvider);
}
}

@SneakyThrows
public static DialectProvider lookup(String dialect) {
DialectProvider provider = allSupportedDialect.get(dialect);
if (provider == null) {
if (dialect.contains(".")) {
provider = (DialectProvider) Class.forName(dialect).newInstance();
allSupportedDialect.put(dialect, provider);
} else {
throw new UnsupportedOperationException("unsupported dialect : " + dialect);
}
}
return provider;
}
}
Original file line number Diff line number Diff line change
@@ -59,9 +59,6 @@
@EnableEasyormRepository("org.hswebframework.web.**.entity")
public class EasyormConfiguration {

@Autowired
private EasyormProperties properties;

static {

}
@@ -80,7 +77,8 @@ public EntityFactory entityFactory(ObjectProvider<EntityMappingCustomizer> custo
@ConditionalOnMissingBean
@SuppressWarnings("all")
public RDBDatabaseMetadata databaseMetadata(Optional<SyncSqlExecutor> syncSqlExecutor,
Optional<ReactiveSqlExecutor> reactiveSqlExecutor) {
Optional<ReactiveSqlExecutor> reactiveSqlExecutor,
EasyormProperties properties) {
RDBDatabaseMetadata metadata = properties.createDatabaseMetadata();
syncSqlExecutor.ifPresent(metadata::addFeature);
reactiveSqlExecutor.ifPresent(metadata::addFeature);
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package org.hswebframework.web.crud.configuration;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.SneakyThrows;
import lombok.*;
import org.hswebframework.ezorm.rdb.metadata.RDBDatabaseMetadata;
import org.hswebframework.ezorm.rdb.metadata.RDBSchemaMetadata;
import org.hswebframework.ezorm.rdb.metadata.dialect.Dialect;
@@ -14,15 +11,13 @@
import org.hswebframework.ezorm.rdb.supports.postgres.PostgresqlSchemaMetadata;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.*;

@ConfigurationProperties(prefix = "easyorm")
@Data
public class EasyormProperties {

private String defaultSchema="PUBLIC";
private String defaultSchema = "PUBLIC";

private String[] schemas = {};

@@ -32,12 +27,22 @@ public class EasyormProperties {

private boolean allowTypeAlter = true;

private DialectEnum dialect = DialectEnum.h2;
/**
* @see DialectProvider
*/
private DialectProvider dialect = DialectEnum.h2;

@Deprecated
private Class<? extends Dialect> dialectType;

@Deprecated
private Class<? extends RDBSchemaMetadata> schemaType;

@SneakyThrows
public void setDialect(String dialect) {
this.dialect = DialectProviders.lookup(dialect);
}

public RDBDatabaseMetadata createDatabaseMetadata() {
RDBDatabaseMetadata metadata = new RDBDatabaseMetadata(createDialect());

@@ -46,8 +51,8 @@ public RDBDatabaseMetadata createDatabaseMetadata() {
schemaSet.add(defaultSchema);
}
schemaSet.stream()
.map(this::createSchema)
.forEach(metadata::addSchema);
.map(this::createSchema)
.forEach(metadata::addSchema);

metadata.getSchema(defaultSchema)
.ifPresent(metadata::setCurrentSchema);
@@ -57,24 +62,17 @@ public RDBDatabaseMetadata createDatabaseMetadata() {

@SneakyThrows
public RDBSchemaMetadata createSchema(String name) {
if (schemaType == null) {
return dialect.createSchema(name);
}
return schemaType.getConstructor(String.class).newInstance(name);
return dialect.createSchema(name);
}

@SneakyThrows
public Dialect createDialect() {
if (dialectType == null) {
return dialect.getDialect();
}

return dialectType.newInstance();
return dialect.getDialect();
}

@Getter
@AllArgsConstructor
public enum DialectEnum {
public enum DialectEnum implements DialectProvider {
mysql(Dialect.MYSQL, "?") {
@Override
public RDBSchemaMetadata createSchema(String name) {
@@ -92,6 +90,11 @@ public RDBSchemaMetadata createSchema(String name) {
public RDBSchemaMetadata createSchema(String name) {
return new OracleSchemaMetadata(name);
}

@Override
public String getValidationSql() {
return "select 1 from dual";
}
},
postgres(Dialect.POSTGRES, "$") {
@Override
@@ -107,8 +110,8 @@ public RDBSchemaMetadata createSchema(String name) {
},
;

private Dialect dialect;
private String bindSymbol;
private final Dialect dialect;
private final String bindSymbol;

public abstract RDBSchemaMetadata createSchema(String name);
}