电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

SpringBoot使用flyway初始化數據庫

瀏覽:29日期:2023-03-22 17:58:21
概述

Flyway這款數據庫版本工具就算大家沒有使用過但也略有耳聞了,SpringBoot對該款工具進行集成的框架可以讓我們在啟動SpringBoot應用時自動去找SQL版本文件進行比對執行,但在遷移或初始化時往往還是需要先手動進行下數據庫的初始化配置,否則會把Unknown database的異常。 為了減少這一步所以個人就以SpringBoot的方式編碼在項目的啟動時自動進行數據庫的初始化,然后再執行版本文件。

自動建庫實現步驟具體思路 SpringBoot的配置項都會有相應的Properties屬性類,數據庫的屬性類為DataSourceProperties,flyway的屬性類為FlywayProperties,盡可能的使用其中的配置項而不額外添加自定義的配置 建庫與相關設置的語句一般不會對已存在的設置進行更改(如建庫建表時都是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@AllArgsConstructorpublic 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); }}執行效果圖

SpringBoot使用flyway初始化數據庫

當項目啟動時可以看到DatabaseInitializer會先通過init-sqls進行數據庫的初始化,然后SpringBoot再初始化通用的數據源并執行SQL版本文件。圖中的create_database.sql文件存放的是init-sqls配置的語句,該文件不會被執行,可以忽略。

SpringBoot使用flyway初始化數據庫

附 如果對flyway不了解的可以看我之前的文章SpringBoot集成Flyway進行數據庫版本遷移管理 本文例子倉庫:spring-bootflyway-demo flyway官網文檔

以上就是SpringBoot使用flyway初始化數據庫的詳細內容,更多關于SpringBoot 初始化數據庫的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
主站蜘蛛池模板: 科研ELISA试剂盒,酶联免疫检测试剂盒,昆虫_植物ELISA酶免试剂盒-上海仁捷生物科技有限公司 | 生产自动包装秤_颗粒包装秤_肥料包装秤等包装机械-郑州鑫晟重工科技有限公司 | 衬塑设备,衬四氟设备,衬氟设备-淄博鲲鹏防腐设备有限公司 | PE拉伸缠绕膜,拉伸缠绕膜厂家,纳米缠绕膜-山东凯祥包装 | 礼堂椅厂家|佛山市艺典家具有限公司| 西安耀程造价培训机构_工程预算实训_广联达实作实操培训 | 质构仪_鱼糜弹性仪-上海腾拔仪器科技有限公司 | 北京包装设计_标志设计公司_包装设计公司-北京思逸品牌设计 | 嘉兴恒升声级计-湖南衡仪声级计-杭州爱华多功能声级计-上海邦沃仪器设备有限公司 | 分轨 | 上传文件,即刻分离人声和伴奏 | 猪I型/II型胶原-五克隆合剂-细胞冻存培养基-北京博蕾德科技发展有限公司 | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | b2b网站大全,b2b网站排名,找b2b网站就上地球网 | 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 上海小程序开发-小程序制作-上海小程序定制开发公司-微信商城小程序-上海咏熠 | 刹车盘机床-刹车盘生产线-龙口亨嘉智能装备 | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | _网名词典_网名大全_qq网名_情侣网名_个性网名 | 伸缩器_伸缩接头_传力接头-巩义市润达管道设备制造有限公司 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 等离子空气净化器_医用空气消毒机_空气净化消毒机_中央家用新风系统厂家_利安达官网 | 护腰带生产厂家_磁石_医用_热压护腰_登山护膝_背姿矫正带_保健护具_医疗护具-衡水港盛 | 无负压供水设备,消防稳压供水设备-淄博创辉供水设备有限公司 | 雪花制冰机(实验室雪花制冰机)百科 | 瓶盖扭矩仪(扭力值检测)-百科 | 叉车电池-叉车电瓶-叉车蓄电池-铅酸蓄电池-电动叉车蓄电池生产厂家 | 精密模具-双色注塑模具加工-深圳铭洋宇通 | 工程管道/塑料管材/pvc排水管/ppr给水管/pe双壁波纹管等品牌管材批发厂家-河南洁尔康建材 | 杭州顺源过滤机械有限公司官网-压滤机_板框压滤机_厢式隔膜压滤机厂家 | AGV无人叉车_激光叉车AGV_仓储AGV小车_AGV无人搬运车-南昌IKV机器人有限公司[官网] | PU树脂_水性聚氨酯树脂_聚氨酯固化剂_聚氨酯树脂厂家_宝景化工 | Honsberg流量计-Greisinger真空表-气压计-上海欧臻机电设备有限公司 | 茅茅虫AI论文写作助手-免费AIGC论文查重_写毕业论文降重 | 地磅-电子地磅维修-电子吊秤-汽车衡-无人值守系统-公路治超-鹰牌衡器 | 2025世界机器人大会_IC China_半导体展_集成电路博览会_智能制造展览网 | 防爆电机_防爆电机型号_河南省南洋防爆电机有限公司 | 无锡网站建设_企业网站定制-网站制作公司-阿凡达网络 | 北京康百特科技有限公司-分子蒸馏-短程分子蒸馏设备-实验室分子蒸馏设备 | 地图标注|微信高德百度地图标注|地图标记-做地图[ZuoMap.com] | 代做标书-代写标书-专业标书文件编辑-「深圳卓越创兴公司」 |