mirror of
https://github.com/qaiu/netdisk-fast-download.git
synced 2025-12-16 12:23:03 +00:00
MySQL支持, 其他优化
This commit is contained in:
@@ -59,6 +59,12 @@
|
||||
<artifactId>vertx-jdbc-client</artifactId>
|
||||
<version>${vertx.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.mysql</groupId>
|
||||
<artifactId>mysql-connector-j</artifactId>
|
||||
<version>9.2.0</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
|
||||
@@ -32,7 +32,7 @@ public @interface Constraint {
|
||||
*/
|
||||
String defaultValue() default "";
|
||||
/**
|
||||
* 默认值是否是函数
|
||||
* 默认值是否是函数 like value=NOW()
|
||||
* @return false 不是函数
|
||||
*/
|
||||
boolean defaultValueIsFunction() default false;
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
package cn.qaiu.db.ddl;
|
||||
|
||||
import cn.qaiu.db.pool.JDBCPoolInit;
|
||||
import io.vertx.core.json.JsonObject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class CreateDatabase {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(JDBCPoolInit.class);
|
||||
|
||||
/**
|
||||
* 解析数据库URL,获取数据库名
|
||||
* @param url 数据库URL
|
||||
* @return 数据库名
|
||||
*/
|
||||
public static String getDatabaseName(String url) {
|
||||
// 正则表达式匹配数据库名
|
||||
String regex = "jdbc:mysql://[^/]+/(\\w+)(\\?.*)?";
|
||||
Pattern pattern = Pattern.compile(regex);
|
||||
Matcher matcher = pattern.matcher(url);
|
||||
|
||||
if (matcher.find()) {
|
||||
return matcher.group(1);
|
||||
} else {
|
||||
throw new IllegalArgumentException("Invalid database URL: " + url);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用JDBC原生方法创建数据库
|
||||
* @param url 数据库连接URL
|
||||
* @param user 数据库用户名
|
||||
* @param password 数据库密码
|
||||
*/
|
||||
public static void createDatabase(String url, String user, String password) {
|
||||
String dbName = getDatabaseName(url);
|
||||
LOGGER.info(">>>>>>>>>>> 创建数据库:'{}' <<<<<<<<<<<< ", dbName);
|
||||
|
||||
// 去掉数据库名,构建不带数据库名的URL
|
||||
String baseUrl = url.substring(0, url.lastIndexOf("/") + 1) + "?characterEncoding=UTF-8&useUnicode=true";
|
||||
|
||||
try (Connection conn = DriverManager.getConnection(baseUrl, user, password);
|
||||
Statement stmt = conn.createStatement()) {
|
||||
// 创建数据库
|
||||
stmt.executeUpdate("CREATE DATABASE IF NOT EXISTS " + dbName + " CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
|
||||
LOGGER.info(">>>>>>>>>>> 数据库'{}'创建成功 <<<<<<<<<<<<", dbName);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void createDatabase(JsonObject dbConfig) {
|
||||
createDatabase(
|
||||
dbConfig.getString("jdbcUrl"),
|
||||
dbConfig.getString("username"),
|
||||
dbConfig.getString("password")
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,18 @@
|
||||
package cn.qaiu.db.pool;
|
||||
|
||||
import cn.qaiu.db.ddl.CreateTable;
|
||||
import cn.qaiu.db.ddl.CreateDatabase;
|
||||
import cn.qaiu.vx.core.util.VertxHolder;
|
||||
import io.vertx.core.Vertx;
|
||||
import io.vertx.core.json.JsonObject;
|
||||
import io.vertx.jdbcclient.JDBCPool;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* 初始化JDBC
|
||||
* <br>Create date 2021/8/10 12:04
|
||||
@@ -17,18 +22,32 @@ import org.slf4j.LoggerFactory;
|
||||
public class JDBCPoolInit {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(JDBCPoolInit.class);
|
||||
|
||||
private static final String providerClass = io.vertx.ext.jdbc.spi.impl.HikariCPDataSourceProvider.class.getName();
|
||||
|
||||
private JDBCPool pool = null;
|
||||
JsonObject dbConfig;
|
||||
Vertx vertx = VertxHolder.getVertxInstance();
|
||||
String url;
|
||||
|
||||
private final JDBCType type;
|
||||
|
||||
private static JDBCPoolInit instance;
|
||||
|
||||
public JDBCType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public JDBCPoolInit(Builder builder) {
|
||||
this.dbConfig = builder.dbConfig;
|
||||
this.url = builder.url;
|
||||
this.type = builder.type;
|
||||
this.type = JDBCType.getJDBCTypeByURL(builder.url);
|
||||
if (StringUtils.isBlank(builder.dbConfig.getString("provider_class"))) {
|
||||
builder.dbConfig.put("provider_class", providerClass);
|
||||
}
|
||||
if (StringUtils.isBlank(builder.dbConfig.getString("driverClassName"))) {
|
||||
builder.dbConfig.put("driverClassName", this.type.getDriverClassName());
|
||||
}
|
||||
}
|
||||
|
||||
public static Builder builder() {
|
||||
@@ -42,12 +61,10 @@ public class JDBCPoolInit {
|
||||
public static class Builder {
|
||||
private JsonObject dbConfig;
|
||||
private String url;
|
||||
private JDBCType type;
|
||||
|
||||
public Builder config(JsonObject dbConfig) {
|
||||
this.dbConfig = dbConfig;
|
||||
this.url = dbConfig.getString("jdbcUrl");
|
||||
this.type = JDBCUtil.getJDBCType(dbConfig.getString("driverClassName"));
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -59,7 +76,6 @@ public class JDBCPoolInit {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* init h2db<br>
|
||||
* 这个方法只允许调用一次
|
||||
@@ -72,6 +88,9 @@ public class JDBCPoolInit {
|
||||
|
||||
// 初始化数据库连接
|
||||
// 初始化连接池
|
||||
if (type == JDBCType.MySQL) {
|
||||
CreateDatabase.createDatabase(dbConfig);
|
||||
}
|
||||
pool = JDBCPool.pool(vertx, dbConfig);
|
||||
CreateTable.createTable(pool, type);
|
||||
LOGGER.info("数据库连接初始化: URL=" + url);
|
||||
|
||||
@@ -1,9 +1,52 @@
|
||||
package cn.qaiu.db.pool;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
/**
|
||||
* @author <a href="https://qaiu.top">QAIU</a>
|
||||
* @date 2023/10/10 14:06
|
||||
* @since 2023/10/10 14:06
|
||||
*/
|
||||
public enum JDBCType {
|
||||
MySQL, H2DB
|
||||
// 添加驱动类型字段
|
||||
MySQL("com.mysql.cj.jdbc.Driver", "jdbc:mysql:"),
|
||||
H2DB("org.h2.Driver", "jdbc:h2:");
|
||||
|
||||
private final String driverClassName; // 驱动类名
|
||||
private final String urlPrefix; // JDBC URL 前缀
|
||||
|
||||
// 构造函数
|
||||
JDBCType(String driverClassName, String urlPrefix) {
|
||||
this.driverClassName = driverClassName;
|
||||
this.urlPrefix = urlPrefix;
|
||||
}
|
||||
|
||||
// 获取驱动类名
|
||||
public String getDriverClassName() {
|
||||
return driverClassName;
|
||||
}
|
||||
|
||||
// 获取 JDBC URL 前缀
|
||||
public String getUrlPrefix() {
|
||||
return urlPrefix;
|
||||
}
|
||||
|
||||
// 根据驱动类名获取 JDBC 类型
|
||||
public static JDBCType getJDBCType(String driverClassName) {
|
||||
for (JDBCType jdbcType : values()) {
|
||||
if (jdbcType.getDriverClassName().equalsIgnoreCase(driverClassName)) {
|
||||
return jdbcType;
|
||||
}
|
||||
}
|
||||
throw new RuntimeException("不支持的SQL驱动类型: " + driverClassName);
|
||||
}
|
||||
|
||||
// 根据 JDBC URL 获取 JDBC 类型
|
||||
public static JDBCType getJDBCTypeByURL(String jdbcURL) {
|
||||
for (JDBCType jdbcType : values()) {
|
||||
if (StringUtils.startsWithIgnoreCase(jdbcURL, jdbcType.getUrlPrefix())) {
|
||||
return jdbcType;
|
||||
}
|
||||
}
|
||||
throw new RuntimeException("不支持的SQL驱动类型: " + jdbcURL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
package cn.qaiu.db.pool;
|
||||
|
||||
/**
|
||||
* @author <a href="https://qaiu.top">QAIU</a>
|
||||
* @date 2023/10/10 14:05
|
||||
*/
|
||||
public class JDBCUtil {
|
||||
public static JDBCType getJDBCType(String deviceName) {
|
||||
switch (deviceName) {
|
||||
case "com.mysql.cj.jdbc.Driver":
|
||||
case "com.mysql.jdbc.Driver":
|
||||
return JDBCType.MySQL;
|
||||
case "org.h2.Driver":
|
||||
return JDBCType.H2DB;
|
||||
}
|
||||
throw new RuntimeException("不支持的SQL驱动类型: " + deviceName);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user