本文主要是介绍在Flyway执行数据库脚本之前创建数据库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Flyway让我们不用手动执行sql脚本,但是众所周知,前提是要先创建项目的数据库。为了能够让运维的同事再偷一次懒,通过代码来自动完成数据库的创建,于是有了这篇文章的分享~
要实现这个效果,只需要两步:
第一步:排除Flyway的自动配置类
在springboot启动类上的注解上添加属性exclude = {FlywayAutoConfiguration.class}
@SpringBootApplication(exclude = {FlywayAutoConfiguration.class})
例如:
package cn.edu.sgu.www.mhxysy;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
import org.springframework.cloud.openfeign.EnableFeignClients;/*** @author heyunlin* @version 1.0*/
@EnableFeignClients(basePackages = "cn.edu.sgu.www.mhxysy.feign")
@SpringBootApplication(exclude = {FlywayAutoConfiguration.class})
public class MhxysyManagement {static Logger logger = LoggerFactory.getLogger(MhxysyManagement.class);public static void main(String[] args) {if (logger.isDebugEnabled()) {logger.debug("启动梦幻西游手游管理系统...");}SpringApplication.run(MhxysyManagement.class, args);}}
第二步:手动执行Flyway的初始化方法
在调用Flyway的load()方法之前执行创建数据库的SQL语句
package cn.edu.sgu.www.mhxysy.config;import lombok.extern.slf4j.Slf4j;
import org.flywaydb.core.Flyway;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.flyway.FlywayProperties;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;/*** flyway配置类* @author heyunlin* @version 1.0*/
@Slf4j
@Configuration
public class FlywayConfig {private final DataSource dataSource;private final DataSourceProperties dataSourceProperties;@Autowiredpublic FlywayConfig(DataSource dataSource, DataSourceProperties dataSourceProperties) {this.dataSource = dataSource;this.dataSourceProperties = dataSourceProperties;}@Beanpublic FlywayProperties flywayProperties() {return new FlywayProperties();}@PostConstructpublic void migrate() throws SQLException {String username = dataSourceProperties.getUsername();String password = dataSourceProperties.getPassword();String url = dataSourceProperties.getUrl();// MySQL数据库连接的urlString connectUrl = url.substring(0, url.lastIndexOf("/"));// 数据库名String database = url.substring(url.lastIndexOf("/") + 1);// 创建数据库的SQLString sql = "create database if not exists " + database + " DEFAULT CHARSET utf8mb4";// 创建数据库连接Connection connection = DriverManager.getConnection(connectUrl, username, password);PreparedStatement statement = connection.prepareStatement(sql);int update = statement.executeUpdate();if (update > 0) {log.debug("数据库{}不存在,已经完成创建...", database);}FlywayProperties flywayProperties = flywayProperties();if (flywayProperties.isEnabled()) {log.debug("FlywayConfig.migrate()方法执行...");Flyway flyway = Flyway.configure().dataSource(dataSource).locations(flywayProperties.getLocations().toArray(new String[]{})).baselineOnMigrate(flywayProperties.isBaselineOnMigrate()).load();flyway.migrate();}}}
第一次启动项目时效果(数据库还没有创建)
第二次启动的效果
这篇关于在Flyway执行数据库脚本之前创建数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!