SpringBoot使用flyway初始化数据库

概述

Flyway这款数据库版本工具就算大家没有使用过但也略有耳闻了,SpringBoot对该款工具进行集成的框架可以让我们在启动SpringBoot应用时自动去找SQL版本文件进行比对执行,但在迁移或初始化时往往还是需要先手动进行下数据库的初始化配置,否则会把Unknown database的异常。 为了减少这一步所以个人就以SpringBoot的方式编码在项目的启动时自动进行数据库的初始化,然后再执行版本文件。

自动建库实现步骤

具体思路

  1. SpringBoot的配置项都会有相应的Properties属性类,数据库的属性类为DataSourceProperties,flyway的属性类为FlywayProperties,尽可能的使用其中的配置项而不额外添加自定义的配置
  2. 建库与相关设置的语句一般不会对已存在的设置进行更改(如建库建表时都是CREATE xxx IF NOT EXISTS),所以项目初始化时每次都执行也不会影响现有的数据库配置,编码时可以不用添加执行的前置判断

代码实现

配置文件

spring:
 profiles:
 include: database

application-database.yml

spring:
 datasource:
 url: jdbc:mysql://yourIp:3306/spring_boot_series?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=GMT
 username: yourUsername
 password: yourPassword
 driver-class-name: com.mysql.cj.jdbc.Driver
 # 自动读取spring.datasource配置进行迁移操作
 flyway:
 # 版本迁移位置
 locations: classpath:db
 baseline-version: 1.0.2
 init-sqls:
 - SET @OLD_UNIQUE_CHECKS = @@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
 - SET @OLD_FOREIGN_KEY_CHECKS = @@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;
 - SET @OLD_SQL_MODE = @@SQL_MODE, SQL_MODE =
 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
 - CREATE SCHEMA IF NOT EXISTS `spring_boot_series` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

为了让项目的配置结构更清晰,所以我把数据库的相关配置都独立到application-database.yml中。
flyway的init-sqls配置是当获取到SQL statement时会执行SQL语句列表,但需要注意的是如果spring.datasource.url连接不上,该块语句是依旧无法被执行的,因为SpringBoot集成的flyway配置是通过spring.datasource的配置去连接数据库的,如果url中的数据库不存在,flyway的版本迁移就无法执行了。
前文提到尽可能的使用SpringBoot原有的配置项,所以init-sqls其实是我配给自己用的。 个人通过init-sqls配置初始化语句与其它方式配置初始化想到的好处:

  • 无需将初始化语句硬编码再让Statement执行
  • 当数据库选型进行变更时只需再配置文件中进行修改相应的初始化语句
  • SpringBoot可以直接以字符串列表进行读取,开发过程中使用起来更加灵活,而不用去解析SQL文件

数据库初始化器DatabaseInitializer

package io.wilson.flyway;

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;

/**
 * @author Wilson
 */
@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);
 // 直连数据库地址:jdbc:mysql://yourIp:port
 HikariDataSource dataSource = new HikariDataSource();
 dataSource.setJdbcUrl(addressUrl);
 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");
 }
}

简单的主程序FlywayApplication

package io.wilson.flyway;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author Wilson
 */
@SpringBootApplication
@MapperScan("io.wilson.flyway.mapper")
public class FlywayApplication {
 public static void main(String[] args) {
 SpringApplication.run(FlywayApplication.class, args);
 }
}

执行效果图

当项目启动时可以看到DatabaseInitializer会先通过init-sqls进行数据库的初始化,然后SpringBoot再初始化通用的数据源并执行SQL版本文件。图中的create_database.sql文件存放的是init-sqls配置的语句,该文件不会被执行,可以忽略。

以上就是SpringBoot使用flyway初始化数据库的详细内容,更多关于SpringBoot 初始化数据库的资料请关注我们其它相关文章!

(0)

相关推荐

  • SpringBoot集成Flyway进行数据库版本迁移管理的步骤

    Flyway简介 Flyway中的迁移(migrations)模式 Flyway对数据库的所有更改都称为 migrations(迁移) . migrations(迁移) 分为版本控制(Versioned)迁移与可重复(Repeatable)的迁移两种, 而版本控制又分为regular(常规)和undo(撤销)两种形式. 版本控制迁移:具有版本号.描述和校验和,且版本是唯一的.描述用于简单记录迁移的内容,校验和用于检测意外更改. 版本控制迁移通常用于以下用途: 创建|更新|删除:表.索引.外键.枚

  • SpringBoot项目集成Flyway进行数据库版本控制的详细教程

    Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式. 第一步:pom.xml添加maven依赖 <!-- https://mvnrepository.com/artifact/org.flywaydb/flyway-core --> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <versi

  • 浅谈SpringBoot之开启数据库迁移的FlyWay使用

    本文介绍了SpringBoot开启数据库迁移的FlyWay使用,分享给大家,具体如下: 一,首先我先了解下FlyWay是如何运转的. 最简单的方案是将Flyway指向一个空数据库. 它将尝试找到其元数据表.当数据库为空时,Flyway将不会找到它, 而是创建它.您现在拥有一个名为SCHEMA_VERSION的单个空表的数据库 : 该表将用于跟踪数据库的状态.之后,Flyway将开始扫描应用程序的文件系统或类路径进行迁移.它们可以用Sql或Java编写. 然后根据其版本号对迁移进行排序,并按顺序应

  • SpringBoot整合Flyway的方法(数据库版本迁移工具)

    Flyway是什么 Flyway是一款开源的数据库版本管理工具,Flyway可以独立于应用实现管理并跟踪数据库的变更,Flyway根据自己的约定,不需要复杂的配置就可以实现数据的Migrate.Migrations可以写成SQL脚本,也可以写在Java代码中,Flyway还支持Spring Boot. 简介 在团队开发当中,有可能每个人都是使用自己本地的数据库.当数据库的表或者字段更新时,往往需要告知团队的其他同事进行更新. Flyway数据库版本迁移工具,目的就是解决该问题而诞生的(我自己想的

  • SpringBoot使用flyway初始化数据库

    概述 Flyway这款数据库版本工具就算大家没有使用过但也略有耳闻了,SpringBoot对该款工具进行集成的框架可以让我们在启动SpringBoot应用时自动去找SQL版本文件进行比对执行,但在迁移或初始化时往往还是需要先手动进行下数据库的初始化配置,否则会把Unknown database的异常. 为了减少这一步所以个人就以SpringBoot的方式编码在项目的启动时自动进行数据库的初始化,然后再执行版本文件. 自动建库实现步骤 具体思路 SpringBoot的配置项都会有相应的Proper

  • springboot 启动时初始化数据库的步骤

    问题描述 在spring-boot启动时,希望能执行相应的sql文件来初始化数据库. 使用配置文件初始化数据库 可以在spring-boot的配置文件application.yml中设置要初始化的sql文件.这是最简单的方法,只需要添加属性就可以实现. 首先设置spring.datasource.initialization-mode=always表示任何类型数据库都进行数据库初始化,默认情况下,spring-boot会自动加载data.sql或data-${platform}.sql文件来初始

  • Flyway详解及Springboot集成Flyway的详细教程

    Flayway是一款数据库版本控制管理工具,,支持数据库版本自动升级,Migrations可以写成sql脚本,也可以写在java代码里:不仅支持Command Line和java api ,也支持Build构建工具和Spring boot,也可以在分布式环境下能够安全可靠安全地升级数据库,同时也支持失败恢复. Flyway最核心的就是用于记录所有版本演化和状态的MetaData表,Flyway首次启动会创建默认名为SCHEMA_VERSION的元素局表. 表中保存了版本,描述,要执行的sql脚本

  • springboot集成flyway自动创表的详细配置

    Flayway是一款数据库版本控制管理工具,,支持数据库版本自动升级,Migrations可以写成sql脚本,也可以写在java代码里:不仅支持Command Line和java api ,也支持Build构建工具和Spring boot,也可以在分布式环境下能够安全可靠安全地升级数据库,同时也支持失败恢复. Flyway最核心的就是用于记录所有版本演化和状态的MetaData表,Flyway首次启动会创建默认名为SCHEMA_VERSION的元素局表. 表中保存了版本,描述,要执行的sql脚本

  • SpringBoot使用Flyway进行数据库管理的操作方法

    目录 一.Flyway简介 二.SpringBoot集成使用 1.pom.xml引入依赖 2.application.properties 3.resources创建db数据库脚本文件夹 4.启动DemoApplication主启动类 三.项目整体结构 一.Flyway简介 Flyway是一款数据库迁移(migration)工具.简单点说,就是在你部署应用的时候,帮你执行数据库脚本的工具.Flyway支持SQL和Java两种类型的脚本,你可以将脚本打包到应用程序中,在应用程序启动时,由Flywa

  • 使用springboot整合mybatis-plus实现数据库的增删查改示例

    1.准备数据库中的表及表中的数据 /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.6.11 : Database - mp ********************************************************************* */ /*!40101 SET NAMES utf8 */; /*!40101 SET SQL_MODE=''*/; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQ

  • SpringBoot整合flyway实现自动创建表的方法

    spring boot - v: 2.1.3.RELEASE MySQL - v:5.7 JDK -v : 11 项目结构: pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instan

随机推荐