Skip to content
Closed
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
Expand Up @@ -26,8 +26,11 @@

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.regex.Pattern;

/**
Expand All @@ -39,6 +42,7 @@
public class JdbcUtils {

private static final Log logger = LogFactory.getLog(JdbcUtils.class);
public static final List<Function<String, DbType>> TYPES = new ArrayList<>();
private static final Map<String, DbType> JDBC_DB_TYPE_CACHE = new ConcurrentHashMap<>();

/**
Expand All @@ -56,6 +60,59 @@ public static DbType getDbType(Executor executor) {
}
}

static {
TYPES.add(contains(DbType.MYSQL, ":mysql:", ":cobar:"));
TYPES.add(contains(DbType.MARIADB, ":mariadb:"));
TYPES.add(contains(DbType.ORACLE, ":oracle:"));
TYPES.add(contains(DbType.SQL_SERVER, ":sqlserver:", ":microsoft:"));
TYPES.add(contains(DbType.POSTGRE_SQL, ":postgresql:"));
TYPES.add(contains(DbType.HSQL, ":hsqldb:"));
TYPES.add(contains(DbType.DB2, ":db2:"));
TYPES.add(contains(DbType.SQLITE, ":sqlite:"));
TYPES.add(contains(DbType.H2, ":h2:"));
TYPES.add(contains(DbType.LEALONE, ":lealone:"));
TYPES.add(regexFind(DbType.DM, ":dm\\d*:"));
TYPES.add(contains(DbType.XU_GU, ":xugu:"));
TYPES.add(regexFind(DbType.KINGBASE_ES, ":kingbase\\d*:"));
TYPES.add(contains(DbType.PHOENIX, ":phoenix:"));
TYPES.add(contains(DbType.GAUSS, ":gaussdb:", ":zenith:"));
TYPES.add(contains(DbType.GBASE, ":gbase:"));
TYPES.add(contains(DbType.GBASE_8S, ":gbasedbt-sqli:", ":informix-sqli:"));
TYPES.add(contains(DbType.GBASE8S_PG, ":gbase8s-pg:"));
TYPES.add(contains(DbType.GBASE_8C, ":gbase8c:"));
TYPES.add(contains(DbType.CLICK_HOUSE, ":ch:", ":clickhouse:"));
TYPES.add(contains(DbType.OSCAR, ":oscar:"));
TYPES.add(contains(DbType.SYBASE, ":sybase:"));
TYPES.add(contains(DbType.OCEAN_BASE, ":oceanbase:"));
TYPES.add(contains(DbType.HIGH_GO, ":highgo:"));
TYPES.add(contains(DbType.CUBRID, ":cubrid:"));
TYPES.add(contains(DbType.SUNDB, ":sundb:"));
TYPES.add(contains(DbType.SAP_HANA, ":sap:"));
TYPES.add(contains(DbType.IMPALA, ":impala:"));
TYPES.add(contains(DbType.VERTICA, ":vertica:"));
TYPES.add(contains(DbType.XCloud, ":xcloud:"));
TYPES.add(contains(DbType.FIREBIRD, ":firebirdsql:"));
TYPES.add(contains(DbType.REDSHIFT, ":redshift:"));
TYPES.add(contains(DbType.OPENGAUSS, ":opengauss:"));
TYPES.add(contains(DbType.TDENGINE, ":taos:", ":taos-rs:", ":taos-ws:"));
TYPES.add(contains(DbType.INFORMIX, ":informix"));
TYPES.add(contains(DbType.SINODB, ":sinodb"));
TYPES.add(contains(DbType.UXDB, ":uxdb:"));
TYPES.add(contains(DbType.TRINO, ":trino:"));
TYPES.add(contains(DbType.PRESTO, ":presto:"));
TYPES.add(contains(DbType.DERBY, ":derby:"));
TYPES.add(contains(DbType.VASTBASE, ":vastbase:"));
TYPES.add(contains(DbType.GOLDENDB, ":goldendb:"));
TYPES.add(contains(DbType.DUCKDB, ":duckdb:"));
TYPES.add(contains(DbType.YASDB, ":yasdb:"));
TYPES.add(contains(DbType.HIVE2, ":hive2:", ":inceptor2:"));
TYPES.add(jdbcUrl -> {
logger.warn("The jdbcUrl is " + jdbcUrl + ", Mybatis Plus Cannot Read Database type or The Database's Not" +
" Supported!");
return DbType.OTHER;
});
}

/**
* 根据连接地址判断数据库类型
*
Expand All @@ -65,100 +122,16 @@ public static DbType getDbType(Executor executor) {
public static DbType getDbType(String jdbcUrl) {
Assert.isFalse(StringUtils.isBlank(jdbcUrl), "Error: The jdbcUrl is Null, Cannot read database type");
String url = jdbcUrl.toLowerCase();
if (url.contains(":mysql:") || url.contains(":cobar:")) {
return DbType.MYSQL;
} else if (url.contains(":mariadb:")) {
return DbType.MARIADB;
} else if (url.contains(":oracle:")) {
return DbType.ORACLE;
} else if (url.contains(":sqlserver:") || url.contains(":microsoft:")) {
return DbType.SQL_SERVER;
} else if (url.contains(":postgresql:")) {
return DbType.POSTGRE_SQL;
} else if (url.contains(":hsqldb:")) {
return DbType.HSQL;
} else if (url.contains(":db2:")) {
return DbType.DB2;
} else if (url.contains(":sqlite:")) {
return DbType.SQLITE;
} else if (url.contains(":h2:")) {
return DbType.H2;
} else if (url.contains(":lealone:")) {
return DbType.LEALONE;
} else if (regexFind(":dm\\d*:", url)) {
return DbType.DM;
} else if (url.contains(":xugu:")) {
return DbType.XU_GU;
} else if (regexFind(":kingbase\\d*:", url)) {
return DbType.KINGBASE_ES;
} else if (url.contains(":phoenix:")) {
return DbType.PHOENIX;
} else if (url.contains(":gaussdb:") || url.contains(":zenith:")) {
return DbType.GAUSS;
} else if (url.contains(":gbase:")) {
return DbType.GBASE;
} else if (url.contains(":gbasedbt-sqli:") || url.contains(":informix-sqli:")) {
return DbType.GBASE_8S;
} else if (url.contains(":gbase8s-pg:")) {
return DbType.GBASE8S_PG;
} else if (url.contains(":gbase8c:")) {
return DbType.GBASE_8C;
} else if (url.contains(":ch:") || url.contains(":clickhouse:")) {
return DbType.CLICK_HOUSE;
} else if (url.contains(":oscar:")) {
return DbType.OSCAR;
} else if (url.contains(":sybase:")) {
return DbType.SYBASE;
} else if (url.contains(":oceanbase:")) {
return DbType.OCEAN_BASE;
} else if (url.contains(":highgo:")) {
return DbType.HIGH_GO;
} else if (url.contains(":cubrid:")) {
return DbType.CUBRID;
} else if (url.contains(":sundb:")) {
return DbType.SUNDB;
} else if (url.contains(":sap:")) {
return DbType.SAP_HANA;
} else if (url.contains(":impala:")) {
return DbType.IMPALA;
} else if (url.contains(":vertica:")) {
return DbType.VERTICA;
} else if (url.contains(":xcloud:")) {
return DbType.XCloud;
} else if (url.contains(":firebirdsql:")) {
return DbType.FIREBIRD;
} else if (url.contains(":redshift:")) {
return DbType.REDSHIFT;
} else if (url.contains(":opengauss:")) {
return DbType.OPENGAUSS;
} else if (url.contains(":taos:") || url.contains(":taos-rs:") || url.contains(":taos-ws:")) {
return DbType.TDENGINE;
} else if (url.contains(":informix")) {
return DbType.INFORMIX;
} else if (url.contains(":sinodb")) {
return DbType.SINODB;
} else if (url.contains(":uxdb:")) {
return DbType.UXDB;
} else if (url.contains(":trino:")) {
return DbType.TRINO;
} else if (url.contains(":presto:")) {
return DbType.PRESTO;
} else if (url.contains(":derby:")) {
return DbType.DERBY;
} else if (url.contains(":vastbase:")) {
return DbType.VASTBASE;
} else if (url.contains(":goldendb:")) {
return DbType.GOLDENDB;
} else if (url.contains(":duckdb:")) {
return DbType.DUCKDB;
} else if (url.contains(":yasdb:")) {
return DbType.YASDB;
} else if (url.contains(":hive2:") || url.contains(":inceptor2:")) {
return DbType.HIVE2;
} else {
logger.warn("The jdbcUrl is " + jdbcUrl + ", Mybatis Plus Cannot Read Database type or The Database's Not Supported!");
return DbType.OTHER;
DbType type;
for (Function<String, DbType> func : TYPES) {
type = func.apply(url);
if (type != null) {
return type;
}
}
logger.warn("The jdbcUrl is " + jdbcUrl + ", Mybatis Plus Cannot Read Database type or The Database's Not " +
"Supported!");
return DbType.OTHER;
}

/**
Expand All @@ -174,4 +147,40 @@ public static boolean regexFind(String regex, CharSequence input) {
}
return Pattern.compile(regex).matcher(input).find();
}

/**
* 正则匹配
*
* @param regex 正则
* @param dbType 对应的dbType
*
* @return url校验器
*/
public static Function<String, DbType> regexFind(DbType dbType, String regex) {
return url -> {
if (regexFind(regex, url)) {
return dbType;
}
return null;
};
}

/**
* 字符串匹配
*
* @param strings 匹配url
* @param dbType 对应的dbType
*
* @return url校验器
*/
public static Function<String, DbType> contains(DbType dbType, String... strings) {
return (url) -> {
for (String str : strings) {
if (url.contains(str)) {
return dbType;
}
}
return null;
};
}
}