【8.3.4】【db】更新获取数据库名称的工具

master
stylefeng 2025-05-07 22:08:57 +08:00
parent 36e9c3d094
commit c11d9fe93f
1 changed files with 108 additions and 20 deletions

View File

@ -11,6 +11,7 @@ import cn.stylefeng.roses.kernel.db.api.sqladapter.database.CreateDatabaseSql;
import cn.stylefeng.roses.kernel.db.api.sqladapter.database.GetDatabasesSql; import cn.stylefeng.roses.kernel.db.api.sqladapter.database.GetDatabasesSql;
import cn.stylefeng.roses.kernel.db.api.sqladapter.table.TableFieldListSql; import cn.stylefeng.roses.kernel.db.api.sqladapter.table.TableFieldListSql;
import cn.stylefeng.roses.kernel.db.api.sqladapter.table.TableListSql; import cn.stylefeng.roses.kernel.db.api.sqladapter.table.TableListSql;
import cn.stylefeng.roses.kernel.rule.enums.DbTypeEnum;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.sql.Connection; import java.sql.Connection;
@ -19,6 +20,8 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** /**
* *
@ -182,33 +185,118 @@ public class DatabaseUtil {
} }
/** /**
* *
* <p> * <p>
* oracleusername * oracleusername
* *
* @author fengshuonan * @author fengshuonan
* @since 2021/5/19 10:39 * @since 2025/5/7 21:45
*/ */
private static String getDbName(DruidProperties druidProperties) { public static String getDbName(DruidProperties druidProperties) {
String url = druidProperties.getUrl().toLowerCase();
return getDbName(url);
}
if (druidProperties.getUrl().contains("oracle")) { /**
// 如果是oracle直接返回username * URL
return druidProperties.getUsername(); *
} else if (druidProperties.getUrl().contains("postgresql")) { * @author fengshuonan
// postgresql直接返回最后一个/后边的字符 * @since 2025/5/7 21:45
int first = druidProperties.getUrl().lastIndexOf("/") + 1; */
return druidProperties.getUrl().substring(first); public static String getDbName(String url) {
} else if (druidProperties.getUrl().contains("sqlserver")) { try {
// sqlserver直接返回最后一个=后边的字符 // 如果是oracle
int first = druidProperties.getUrl().lastIndexOf("=") + 1; if (url.contains(DbTypeEnum.ORACLE.getUrlWords())) {
return druidProperties.getUrl().substring(first); Pattern pattern = Pattern.compile(":(thin|oci|kprb):@(//)?[^:/]+(:\\d+)?[:/]([^?]+)");
} else { Matcher matcher = pattern.matcher(url);
// mysql返回/和?之间的字符 return matcher.find() ? matcher.group(4) : parseAfterLastSlash(url);
String jdbcUrl = druidProperties.getUrl(); }
int first = jdbcUrl.lastIndexOf("/") + 1;
int last = jdbcUrl.indexOf("?"); // 如果是PostgreSQL
return jdbcUrl.substring(first, last); else if (url.contains(DbTypeEnum.PG_SQL.getUrlWords())) {
return parseAfterLastSlash(url);
}
// 如果是sql server
else if (url.contains(DbTypeEnum.MS_SQL.getUrlWords())) {
// SQL Server: databaseName= 或 Initial Catalog=
return parseParameter(url, "databasename=", "initial catalog=");
}
// 如果是Mysql
else if (url.contains(DbTypeEnum.MYSQL.getUrlWords())) {
int first = url.lastIndexOf("/") + 1;
int last = url.indexOf("?");
return url.substring(first, last == -1 ? url.length() : last);
}
// 如果是达梦数据库
else if (url.contains(DbTypeEnum.DM.getUrlWords())) {
return parseParameter(url, "dbname=", "database=");
}
// 人大金仓、openGauss、瀚高数据库
else if (url.contains(DbTypeEnum.KING_BASE.getUrlWords()) || url.contains(DbTypeEnum.OPEN_GAUSS.getUrlWords()) || url.contains(DbTypeEnum.HIGH_GO.getUrlWords())) {
return parseAfterLastSlash(url);
}
} catch (Exception e) {
throw new IllegalArgumentException("Failed to parse database name from URL: " + url, e);
}
// 尝试通用解析作为最后手段
try {
return parseAfterLastSlash(url);
} catch (Exception e) {
throw new IllegalArgumentException("Unsupported or malformed database URL: " + url);
} }
} }
/**
* URL/
*
* @author fengshuonan
* @since 2025/5/7 22:04
*/
private static String parseAfterLastSlash(String url) {
int lastSlashIndex = url.lastIndexOf('/');
if (lastSlashIndex == -1) {
return url; // 如果没有 /,返回整个 URL或抛异常
}
int paramStart = url.indexOf('?', lastSlashIndex);
if (paramStart == -1) {
return url.substring(lastSlashIndex + 1);
}
return url.substring(lastSlashIndex + 1, paramStart);
}
/**
* URL
*
* @author fengshuonan
* @since 2025/5/7 22:04
*/
private static String parseParameter(String url, String... paramNames) {
for (String param : paramNames) {
// 匹配 databaseName=xxx 或 ;databaseName=xxx 或 &databaseName=xxx
Pattern pattern = Pattern.compile("(?:[;&?]|^)" + param + "([^;&?]+)");
Matcher matcher = pattern.matcher(url.toLowerCase());
if (matcher.find()) {
return matcher.group(1);
}
}
return parseAfterLastSlash(url);
}
public static void main(String[] args) {
System.out.println(getDbName("jdbc:oracle:thin:@//127.0.0.1:1521/right_oracle"));
System.out.println(getDbName("jdbc:postgresql://192.168.1.1:5432/right_pg"));
System.out.println(getDbName("jdbc:jtds:sqlserver://172.1.1.1:1433;DatabaseName=rightsqlserver"));
System.out.println(getDbName("jdbc:mysql://localhost:3306/right_mysql?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true"));
System.out.println(getDbName("jdbc:dm://172.1.1.1:5236?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=true&characterEncoding=UTF-8"));
System.out.println(getDbName("jdbc:kingbase8://192.168.1.1:5432/right_king"));
System.out.println(getDbName("jdbc:opengauss://192.168.1.1:5432/right_open_gauss"));
System.out.println(getDbName("jdbc:highgo://localhost:5866/right_highgo"));
System.out.println(getDbName("jdbc:postgresql://172.1.1.1:5432/right_hailiang"));
}
} }