spring集成flyway


最近給公司項目集成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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM