Browse Source

DatabaseInitializer

木子李·De 4 years ago
parent
commit
b7da3af750

+ 54 - 0
report-core/src/main/java/com/anjiplus/template/gaea/business/config/DatabaseInitializer.java

@@ -0,0 +1,54 @@
+package com.anjiplus.template.gaea.business.config;
+
+import com.zaxxer.hikari.HikariDataSource;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.autoconfigure.flyway.FlywayProperties;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+/**
+ * Created by raodeming on 2021/7/5.
+ */
+@Slf4j
+@Component
+@AllArgsConstructor
+public class DatabaseInitializer {
+
+    private final FlywayProperties flywayProperties;
+    private final DataSourceProperties dataSourceProperties;
+
+    @PostConstruct
+    public void init() throws SQLException {
+        log.info("DatabaseInitializer uses flyway init-sqls to initiate database");
+        String url = dataSourceProperties.getUrl();
+        // jdbc url最后一个 '/' 用于分割具体 schema?参数
+        int lastSplitIndex = url.lastIndexOf('?');
+        // 获取spring.datasource.url具体数据库schema前的jdbc url
+        String addressUrl = url.substring(0, lastSplitIndex);
+        String addresslast = url.substring(lastSplitIndex);
+        addressUrl = addressUrl.substring(0, addressUrl.lastIndexOf("/"));
+        // 直连数据库地址:jdbc:mysql://yourIp:port
+        HikariDataSource dataSource = new HikariDataSource();
+        dataSource.setJdbcUrl(addressUrl.concat(addresslast));
+        dataSource.setUsername(dataSourceProperties.getUsername());
+        dataSource.setPassword(dataSourceProperties.getPassword());
+        Connection connection = dataSource.getConnection();
+        Statement statement = connection.createStatement();
+        for (String sql : flywayProperties.getInitSqls()) {
+            // 通过flyway的init-sqls配置进行建库与数据库配置
+            // executeUpdate:执行给定的SQL语句,该语句可以是INSERT,UPDATE或DELETE语句或不返回任何内容的SQL语句,例如SQL DDL语句。
+            statement.executeUpdate(sql);
+        }
+        statement.close();
+        connection.close();
+        dataSource.close();
+        log.info("DatabaseInitializer initialize completed");
+    }
+
+}