public class JdbcUrlUtil {
/**
* 通过url获取数据库名称
* @param jdbcUrl
* @return
*/
public static String findDataBaseNameByUrl(String jdbcUrl) {
String database = null;
int pos, pos1;
String connUri;
if (StringUtils.isBlank(jdbcUrl)) {
throw new IllegalArgumentException("Invalid JDBC url.");
}
jdbcUrl = jdbcUrl.toLowerCase();
if (jdbcUrl.startsWith("jdbc:impala")) {
jdbcUrl = jdbcUrl.replace(":impala", "");
}
if (!jdbcUrl.startsWith("jdbc:")
|| (pos1 = jdbcUrl.indexOf(':', 5)) == -1) {
throw new IllegalArgumentException("Invalid JDBC url.");
}
connUri = jdbcUrl.substring(pos1 + 1);
if (connUri.startsWith("//")) {
if ((pos = connUri.indexOf('/', 2)) != -1) {
database = connUri.substring(pos + 1);
}
} else {
database = connUri;
}
if (database.contains("?")) {
database = database.substring(0, database.indexOf("?"));
}
if (database.contains(";")) {
database = database.substring(0, database.indexOf(";"));
}
if (StringUtils.isBlank(database)) {
throw new IllegalArgumentException("Invalid JDBC url.");
}
return database;
}
/**
* 获取数据源属性
* @return
*/
public static Map<String, Object> getDataSourceProps() {
DataSource shardingDataSource = SpringContextUtil.getBean("shardingDataSource", DataSource.class);
// 解析分表配置
ShardingRule shardingRule = ((ShardingDataSource) shardingDataSource).getRuntimeContext().getRule();
// 读取默认的分库名
String defaultDataSourceName = shardingRule.getShardingDataSourceNames().getDefaultDataSourceName();
Environment env = SpringContextUtil.getBean(Environment.class);
// 分表配置中读取默认的数据源配置
Map<String, Object> dataSourceProps = PropertyUtil.handle(env,
"spring.shardingsphere.datasource." + defaultDataSourceName, Map.class);
return dataSourceProps;
}
/**
* 获取数据源url
* @return
*/
public static String getUrl() {
Map<String, Object> dataSourceProps = getDataSourceProps();
// 获取数据源url
String url = dataSourceProps.get("url").toString();
return url;
}
/**
* 获取数据源用户名
* @return
*/
public static String getUsername() {
Map<String, Object> dataSourceProps = getDataSourceProps();
// 获取数据源用户名
String username = dataSourceProps.get("username").toString();
return username;
}
/**
* 获取数据源密码
* @return
*/
public static String getPassword() {
Map<String, Object> dataSourceProps = getDataSourceProps();
// 获取数据源密码
String password = dataSourceProps.get("password").toString();
return password;
}
/**
* 获取url中的jdbc:mysql://xxx:3306
* @param url
* @return
*/
public static String getSomeUrl(String url) {
return url.substring(0, url.indexOf("/", url.indexOf("/") + 2));
}
/**
* 创建租户ca,ra库
* @param tenancyId
* @return
* @throws SQLException
*/
public void createDatabase(String tenancyId) throws SQLException {
// 通过shardingjdbc获取默认数据源url
String url = JdbcUrlUtil.getUrl();
String someUrl = JdbcUrlUtil.getSomeUrl(url);
// 拼接url为jdbc:mysql://xxx:3306?user=xxx&password=xxx&serverTimezone=Asia/Shanghai&characterEncoding=UTF8
String connStr = someUrl + "?user=" + JdbcUrlUtil.getUsername()
+ "&password=" + JdbcUrlUtil.getPassword()
+ "&serverTimezone=Asia/Shanghai" + "&characterEncoding=UTF8" ;
Connection conn = null;
PreparedStatement statement = null;
try {
conn = DriverManager.getConnection(connStr);
// 读取默认数据库名称,这里拼接自己需要的数据库名称
String defaultDataBase = TenancyShardUtil.getDefaultDataBase();
String xSql = "create database " + defaultDataBase + "xx_" + tenancyId + " DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci";
String xxSql = "create database " + defaultDataBase + "xx_" + tenancyId + " DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci";
// 创建ca,ra库
statement = conn.prepareStatement(xSql);
statement.execute();
statement = conn.prepareStatement(xxSql);
statement.execute();
} catch (SQLException e) {
AdminServiceError.CREATE_DATABASE_ERROE.toException();
} finally {
statement.close();
conn.close();
}
}