spring框架集成flyway項目的詳細過程
什麼是Spring
Spring是一個開源框架,它由Rod Johnson創建。它是為瞭解決企業應用開發的復雜性而創建的。
Spring使用基本的JavaBean來完成以前隻可能由EJB完成的事情。
然而,Spring的用途不僅限於服務器端的開發。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。
目的:解決企業應用開發的復雜性
功能:使用基本的JavaBean代替EJB,並提供瞭更多的企業應用功能
范圍:任何Java應用
它是一個容器框架,用來裝javabean(java對象),中間層框架(萬能膠)可以起一個連接作用,比如說把Struts和hibernate粘合在一起運用。簡單來說,Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架。
Flyway簡介
Flyway是一個數據庫版本化管理工具,通過SQL腳本實現DB Migration自動化升級,支持獨立運行,也可以和構建工具或者Spring開發環境集成。
最近給公司項目集成flyway,由於我們項目移動端使用的是spring框架,網上看瞭很多博客,感覺這方面的東西還是很少的,畢竟現在是springboot的天下,大多數都是springboot集成flyway。但是還是有不少公司遺留有spring框架的項目。這裡就自己肝一篇,希望能幫到更多想把flyway添加到spring項目中的人。
由於使用的是spring框架。因此我們選擇低版本的flyway。
flyway各個版本請到這裡去找:https://mvnrepository.com/artifact/org.flywaydb/flyway-core
我們的maven使用的是阿裡雲的倉庫,阿裡雲倉庫中沒有低版本的依賴,我們我們需要下載jar包。這裡下載的是3.0版本的jar包。
下載的包需要拷貝到項目webapp/WEB-INF/lib中(web項目都會有WEB-INF這個文件夾,隻需要找到你項目中web文件夾就行,web文件夾,就是文件夾上有個藍點的,具體看下圖的webapp文件夾)
新建資源目錄resources
在其下面建立db/migration(sql文件默認讀取此路徑下的文件夾中的.sql文件)
在pom.xml中添加,如果不添加,resources中的文件就無法打包到war包中。
<resource> <directory>src/main/resources</directory> <includes> <include>**/*</include> </includes> </resource>
添加flyway配置類,更多配置請看源代碼
package com.dt.flyway; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.flywaydb.core.Flyway; import org.flywaydb.core.api.FlywayException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; /** * @Description: flyway配置類 * @author: * @Date: 2021/7/12 15:57 * @Copyright: Xi'an Dian Tong Software Co., Ltd. All Rights Reserved. * @Version 1.0 */ public class DatabaseFlywayMigration { protected final static Logger log = LogManager.getLogger("DatabaseFlywayMigration"); public void migrate() throws NamingException { log.info("DatabaseFlywayMigration-->migrate:flyway開始執行,準備獲取數據源"); Context context = new InitialContext(); //獲取tomcat中的數據源 DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/wxi"); log.info("DatabaseFlywayMigration-->migrate:獲取數據源成功,準備執行flyway配置"); Flyway flyway = new Flyway(); // 設置sql腳本文件的編碼 flyway.setEncoding("UTF-8"); flyway.setOutOfOrder(true); flyway.setDataSource(dataSource); // 設置接受flyway進行版本管理的多個數據庫 //flyway.setSchemas("flywaydemo"); // 設置存放flyway metadata數據的表名 flyway.setTable("flyway_schema_history"); // 設置執行migrate操作之前的validation行為 //flyway.setValidationMode(ValidationMode.ALL); // 設置當validation失敗時的系統行為 //flyway.setValidationErrorMode(ValidationErrorMode.FAIL); // 設置當validation失敗時的系統行為 try { flyway.setInitOnMigrate(true); log.info("DatabaseFlywayMigration-->migrate:配置成功,即將執行sql語句"); flyway.migrate(); log.info("DatabaseFlywayMigration-->migrate:sql語句執行成功,flyway---END"); } catch (FlywayException e) { log.error("DatabaseFlywayMigration-->migrate:執行sql語句失敗,請查看日志排查錯誤"); flyway.repair(); e.printStackTrace(); } } }
在spring的xml中註入flyway配置類的bean(每個spring項目都會帶有一個xml文件,用來註冊bean,復制的時候註意項目中DatabaseFlywayMigration所在的路徑)
<!-- flayway --> <bean id="flywayMigration1" class="com.dt.flyway.DatabaseFlywayMigration" lazy-init="false" init-method="migrate"> </bean>
到這裡,移動端整合flyway就完成瞭。
以後這些sql語句,隻需要放到resources/db/migration文件夾下面即可(但是這些sql命名都是不符合flyway的,需要進行名稱的修改)
命名規則:
此處的SQL語句命名需要遵從一定的規范,否則運行的時候flyway會報錯。命名規則主要有兩種:
僅需要被執行一次的SQL命名以大寫的”V”開頭,後面跟上”0~9”數字的組合,數字之間可以用“.”或者下劃線”“分割開,然後再以兩個下劃線 _ 分割,其後跟文件名稱,最後以.sql結尾。比如,V20210707__create_user.sql、V20210707__add_user.sql。
可重復運行的SQL,則以大寫的“R”開頭,後面再以兩個下劃線分割,其後跟文件名稱,最後以.sql結尾。。比如,R__truncate_user_dml.sql。
其中,V開頭的SQL執行優先級要比R開頭的SQL優先級高。
V:固定大寫
20210707.01:20210707是日期,後面用.01代表序號
因為flyway的執行是有個順序的,比如你執行瞭V2021__create_user,有執行V2020_update_user。就會報錯,原因就是2020<2021。所以我們要保證序號是依次增大。
Flyway 是如何比較兩個 SQL 文件的先後順序呢?它采用 采用左對齊原則, 缺位用 0 代替 。舉幾個例子:
1.0.1.1 比 1.0.1 版本高。
1.0.10 比 1.0.9.4 版本高。
1.0.10 和 1.0.010 版本號一樣高, 每個版本號部分的前導 0 會被忽略。
__:這個是兩個 _
例如:
V2.0.9__upgrade.sql
V2.0.11__upgrade.sql
V2.0.13__upgrade.sql
V2.0.14__upgrade.sql
作者:天下沒有收費的bug出處:https://www.cnblogs.com/LoveBB/本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文鏈接,否則保留追究法律責任的權利。
到此這篇關於spring集成flyway的文章就介紹到這瞭,更多相關spring集成flyway內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- springboot集成flyway自動創表的詳細配置
- SpringBoot項目集成Flyway詳細過程
- SpringBoot集成Flyway進行數據庫版本遷移管理的步驟
- JNDI具體用法詳解
- SpringBoot使用flyway初始化數據庫