WindChat/windchat-storage/src/main/java/com/windchat/im/storage/dao/mysql/manager/InitDatabaseConnection.java

115 lines
4.2 KiB
Java
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.windchat.im.storage.dao.mysql.manager;
import java.io.File;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.jdbc.datasource.init.ScriptUtils;
import com.windchat.im.storage.dao.config.JdbcConst;
import com.windchat.im.storage.util.FileUtils;
import com.windchat.im.storage.util.SqlLog;
/**
* 启动mysql的情形下需要获取一个连接建数据库建表操作只有在初始化数据库情况下才使用
*
* @author Sam{@link an.guoyue254@gmail.com}
* @since 2018-06-07 16:18:11
*/
public class InitDatabaseConnection extends AbstractPoolManager {
private static final String WINDCHAT_MYSQL_SQL = "windchat-mysql.sql";
private static Connection conn;
public static void init(Properties prop) throws Exception {
try {
initAndGetConnection(prop);
} finally {
closeInitConnection();
}
}
public static Connection initAndGetConnection(Properties prop) throws Exception {
Connection conn = initConnection(prop);
String dbName = trimToNull(prop, JdbcConst.MYSQL_DB);
createAndUseDatabase(conn, dbName);
initDatabaseTable(conn);
return conn;
}
private static Connection initConnection(Properties pro) throws Exception {
// "com.mysql.cj.jdbc.Driver"
String jdbcUrl = getJdbcUrlWithoutDBName(pro);
String userName = trimToNull(pro, JdbcConst.MYSQL_USER_NAME);
String password = trimToNull(pro, JdbcConst.MYSQL_PASSWORD);
Class.forName(MYSQL_JDBC_DRIVER);
conn = DriverManager.getConnection(jdbcUrl, userName, password);
conn.prepareStatement("SET NAMES utf8mb4;").executeUpdate();
return conn;
}
// 获取单独一个连接,迁移数据库使用
public static Connection getConnection(Properties pro) throws Exception {
// "com.mysql.cj.jdbc.Driver"
String jdbcUrl = getJdbcUrl(pro);
String userName = trimToNull(pro, JdbcConst.MYSQL_USER_NAME);
String password = trimToNull(pro, JdbcConst.MYSQL_PASSWORD);
Class.forName(MYSQL_JDBC_DRIVER);
conn = DriverManager.getConnection(jdbcUrl, userName, password);
conn.prepareStatement("SET NAMES utf8mb4;").executeUpdate();
return conn;
}
public static void closeInitConnection() {
try {
if (conn != null) {
conn.close();
}
} catch (Exception e) {
SqlLog.error("close mysql init connection error", e);
}
}
private static void createAndUseDatabase(Connection conn, String dbName) throws SQLException {
if (StringUtils.isEmpty(dbName)) {
throw new SQLException("windchat team need designated database name,but now it's " + dbName);
}
String createSql = "CREATE DATABASE IF NOT EXISTS " + dbName + " CHARACTER SET utf8mb4;";
String useSql = "use " + dbName;
conn.prepareStatement(createSql).executeUpdate();
conn.prepareStatement(useSql).executeUpdate();
}
private static void initDatabaseTable(Connection conn) throws SQLException {
try {
// 生成临时sql文件加载数据库sql执行脚本,
File sqlFile = new File(WINDCHAT_MYSQL_SQL);
if (!sqlFile.exists()) {
FileUtils.writeResourceToFile("/" + WINDCHAT_MYSQL_SQL, sqlFile);
}
// 初始化数据库表
File file = new File(WINDCHAT_MYSQL_SQL);
if (!file.exists()) {
throw new FileNotFoundException("init mysql with sql script file is not exists");
}
FileSystemResource rc = new FileSystemResource(file);
EncodedResource encodeRes = new EncodedResource(rc, "GBK");
ScriptUtils.executeSqlScript(conn, encodeRes);
SqlLog.info("windchat init mysql database with sql-script finish");
file.delete();
} catch (Exception e) {
throw new SQLException(e);
}
}
}