最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot使用flyway初始化數(shù)據(jù)庫(kù)

 更新時(shí)間:2021年03月04日 09:18:29   作者:WilsonHe  
這篇文章主要介紹了SpringBoot如何使用flyway初始化數(shù)據(jù)庫(kù),幫助大家更好的理解和學(xué)習(xí)使用SpringBoot框架,感興趣的朋友可以了解下

概述

Flyway這款數(shù)據(jù)庫(kù)版本工具就算大家沒(méi)有使用過(guò)但也略有耳聞了,SpringBoot對(duì)該款工具進(jìn)行集成的框架可以讓我們?cè)趩?dòng)SpringBoot應(yīng)用時(shí)自動(dòng)去找SQL版本文件進(jìn)行比對(duì)執(zhí)行,但在遷移或初始化時(shí)往往還是需要先手動(dòng)進(jìn)行下數(shù)據(jù)庫(kù)的初始化配置,否則會(huì)把Unknown database的異常。 為了減少這一步所以個(gè)人就以SpringBoot的方式編碼在項(xiàng)目的啟動(dòng)時(shí)自動(dòng)進(jìn)行數(shù)據(jù)庫(kù)的初始化,然后再執(zhí)行版本文件。

自動(dòng)建庫(kù)實(shí)現(xiàn)步驟

具體思路

  1. SpringBoot的配置項(xiàng)都會(huì)有相應(yīng)的Properties屬性類(lèi),數(shù)據(jù)庫(kù)的屬性類(lèi)為DataSourceProperties,flyway的屬性類(lèi)為FlywayProperties,盡可能的使用其中的配置項(xiàng)而不額外添加自定義的配置
  2. 建庫(kù)與相關(guān)設(shè)置的語(yǔ)句一般不會(huì)對(duì)已存在的設(shè)置進(jìn)行更改(如建庫(kù)建表時(shí)都是CREATE xxx IF NOT EXISTS),所以項(xiàng)目初始化時(shí)每次都執(zhí)行也不會(huì)影響現(xiàn)有的數(shù)據(jù)庫(kù)配置,編碼時(shí)可以不用添加執(zhí)行的前置判斷

代碼實(shí)現(xiàn)

配置文件

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
 # 自動(dòng)讀取spring.datasource配置進(jìn)行遷移操作
 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;

為了讓項(xiàng)目的配置結(jié)構(gòu)更清晰,所以我把數(shù)據(jù)庫(kù)的相關(guān)配置都獨(dú)立到application-database.yml中。
flyway的init-sqls配置是當(dāng)獲取到SQL statement時(shí)會(huì)執(zhí)行SQL語(yǔ)句列表,但需要注意的是如果spring.datasource.url連接不上,該塊語(yǔ)句是依舊無(wú)法被執(zhí)行的,因?yàn)镾pringBoot集成的flyway配置是通過(guò)spring.datasource的配置去連接數(shù)據(jù)庫(kù)的,如果url中的數(shù)據(jù)庫(kù)不存在,flyway的版本遷移就無(wú)法執(zhí)行了。
前文提到盡可能的使用SpringBoot原有的配置項(xiàng),所以init-sqls其實(shí)是我配給自己用的。 個(gè)人通過(guò)init-sqls配置初始化語(yǔ)句與其它方式配置初始化想到的好處:

  • 無(wú)需將初始化語(yǔ)句硬編碼再讓Statement執(zhí)行
  • 當(dāng)數(shù)據(jù)庫(kù)選型進(jìn)行變更時(shí)只需再配置文件中進(jìn)行修改相應(yīng)的初始化語(yǔ)句
  • SpringBoot可以直接以字符串列表進(jìn)行讀取,開(kāi)發(fā)過(guò)程中使用起來(lái)更加靈活,而不用去解析SQL文件

數(shù)據(jù)庫(kù)初始化器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最后一個(gè) '/' 用于分割具體 schema?參數(shù)
 int lastSplitIndex = url.lastIndexOf('/');
 // 獲取spring.datasource.url具體數(shù)據(jù)庫(kù)schema前的jdbc url
 String addressUrl = url.substring(0, lastSplitIndex);
 // 直連數(shù)據(jù)庫(kù)地址: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()) {
 // 通過(guò)flyway的init-sqls配置進(jìn)行建庫(kù)與數(shù)據(jù)庫(kù)配置
 // executeUpdate:執(zhí)行給定的SQL語(yǔ)句,該語(yǔ)句可以是INSERT,UPDATE或DELETE語(yǔ)句或不返回任何內(nèi)容的SQL語(yǔ)句,例如SQL DDL語(yǔ)句。
 statement.executeUpdate(sql);
 }
 statement.close();
 connection.close();
 dataSource.close();
 log.info("DatabaseInitializer initialize completed");
 }
}

簡(jiǎn)單的主程序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);
 }
}

執(zhí)行效果圖

當(dāng)項(xiàng)目啟動(dòng)時(shí)可以看到DatabaseInitializer會(huì)先通過(guò)init-sqls進(jìn)行數(shù)據(jù)庫(kù)的初始化,然后SpringBoot再初始化通用的數(shù)據(jù)源并執(zhí)行SQL版本文件。圖中的create_database.sql文件存放的是init-sqls配置的語(yǔ)句,該文件不會(huì)被執(zhí)行,可以忽略。


以上就是SpringBoot使用flyway初始化數(shù)據(jù)庫(kù)的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot 初始化數(shù)據(jù)庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java解壓zip文件的關(guān)鍵代碼

    Java解壓zip文件的關(guān)鍵代碼

    本文給大家分享一段java解壓zip文件的關(guān)鍵代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-09-09
  • java 可重啟線程及線程池類(lèi)的設(shè)計(jì)(詳解)

    java 可重啟線程及線程池類(lèi)的設(shè)計(jì)(詳解)

    下面小編就為大家?guī)?lái)一篇java 可重啟線程及線程池類(lèi)的設(shè)計(jì)(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • Java分批將List數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)的解決過(guò)程

    Java分批將List數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)的解決過(guò)程

    這篇文章主要給大家介紹了關(guān)于Java分批將List數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)的解決過(guò)程,文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-08-08
  • idea 無(wú)法debug調(diào)試的解決方案

    idea 無(wú)法debug調(diào)試的解決方案

    這篇文章主要介紹了idea 無(wú)法debug調(diào)試的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 一文帶你搞懂Java中方法重寫(xiě)與方法重載的區(qū)別

    一文帶你搞懂Java中方法重寫(xiě)與方法重載的區(qū)別

    這篇文章主要介紹了Java中方法重寫(xiě)與方法重載有哪些區(qū)別,文中有詳細(xì)的代碼示例,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-05-05
  • Java特性隊(duì)列和棧的堵塞原理解析

    Java特性隊(duì)列和棧的堵塞原理解析

    這篇文章主要介紹了Java特性隊(duì)列和棧的堵塞原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 最新評(píng)論

    赤峰市| 云龙县| 曲沃县| 塔河县| 朝阳市| 盈江县| 柳林县| 寿阳县| 德化县| 叙永县| 南雄市| 西峡县| 文成县| 平阳县| 连城县| 临漳县| 玛曲县| 汉源县| 荥经县| 明溪县| 安义县| 乌拉特后旗| 望城县| 安吉县| 西和县| 济南市| 涿鹿县| 石首市| 台南县| 渝中区| 交口县| 鹤壁市| 鲁甸县| 南城县| 鄂伦春自治旗| 遵义市| 普兰店市| 嘉黎县| 镇坪县| 清水河县| 鹿邑县|