摘要:一簡介什么是是獨立于數(shù)據(jù)庫的應(yīng)用管理跟蹤數(shù)據(jù)庫變更的數(shù)據(jù)庫版本管理工具。當(dāng)升級完成時,數(shù)據(jù)庫表結(jié)構(gòu)及數(shù)據(jù)應(yīng)當(dāng)與升級后的產(chǎn)品版本保持一致。
在執(zhí)行數(shù)據(jù)庫遷移時,我們推薦使用jOOQ與Flyway - 數(shù)據(jù)庫遷移輕松。 在本章中,我們將簡單的來使用這兩個框架。
一、Flyway簡介 什么是FlywayFlyway是獨立于數(shù)據(jù)庫的應(yīng)用、管理、跟蹤數(shù)據(jù)庫變更的數(shù)據(jù)庫版本管理工具。
Flyway的項目主頁是:https://flywaydb.org/
不同的開發(fā)人員在開發(fā)產(chǎn)品特性時,都有可能更新數(shù)據(jù)庫(添加新表,新的約束等)。當(dāng)開發(fā)人員完成工作并提交代碼時,代碼會被合并到主分支并在測試服務(wù)器上執(zhí)行單元測試與集成測試。我們在哪個環(huán)節(jié)來執(zhí)行數(shù)據(jù)庫的更新操作呢?由QA 部門手工執(zhí)行sql 腳本?或者我們開發(fā)一斷程序自動執(zhí)行數(shù)據(jù)庫更新?以什么順序來執(zhí)行這些更新腳本?這些問題同樣存在于生產(chǎn)環(huán)境。
我們的產(chǎn)品部署在不同的客戶服務(wù)器上,以及很多的測試、聯(lián)調(diào)、實驗局、銷售環(huán)境上。不同的客戶和測試環(huán)境上都部署著不同版本的產(chǎn)品。當(dāng)他們需要升級他們的產(chǎn)品到新的版本時,我們不僅需要讓他們的管理員可以升級產(chǎn)品到新的版本,同時需要保留他們的已有數(shù)據(jù)。在升級產(chǎn)品的步驟中,我們清楚地知道客戶數(shù)據(jù)庫的當(dāng)前版本,以及需要在該數(shù)據(jù)庫上執(zhí)行哪些數(shù)據(jù)庫更新腳本,來更新數(shù)據(jù)庫表結(jié)構(gòu)與數(shù)據(jù)庫中已存在的數(shù)據(jù)。當(dāng)升級完成時,數(shù)據(jù)庫表結(jié)構(gòu)及數(shù)據(jù)應(yīng)當(dāng)與升級后的產(chǎn)品版本保持一致。
當(dāng)升級失敗時(比如在升級過程中出現(xiàn)網(wǎng)絡(luò)連接失?。?,我們應(yīng)當(dāng)支持對失敗進行修復(fù)。
更多Flyway文章(參考以下文檔)數(shù)據(jù)庫版本管理工具Flyway——基礎(chǔ)篇
Flyway學(xué)習(xí)筆記
官方文檔
二、Maven配置Flyway和jOOQ插件 propertiespluginsjdbc:mysql://127.0.0.1:33006/flyway_test?useUnicode=true&characterEncoding=UTF-8 root 123456
三、數(shù)據(jù)庫增量腳本org.flywaydb flyway-maven-plugin 3.0 generate-sources migrate ${db.url} ${db.username} ${db.password} filesystem:src/main/resources/db/migration org.jooq jooq-codegen-maven ${jooq.version} java-generator generate-sources generate ${db.url} ${db.username} ${db.password} org.jooq.util.mysql.MySQLDatabase .* flyway_test test.generated target/generated-sources/jooq-mysql-java
假設(shè)已經(jīng)插件MySQL數(shù)據(jù)庫:flyway_test
在src/main/resources/db/migration目錄(Flyway插件指定的location目錄)下插件創(chuàng)建腳本文件:
V1__create_author.sql
V2__create_book.sql
這三個腳本按照版本V[1,2,3...]創(chuàng)建,這是腳本的內(nèi)容:
# V1__create_author.sql CREATE TABLE `author` ( `id` int NOT NULL, `first_name` varchar(255) DEFAULT NULL, `last_name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ); INSERT INTO author VALUES (1, "George", "Orwell"); INSERT INTO author VALUES (2, "Paulo", "Coelho");
# V2__create_book.sql CREATE TABLE `book` ( `id` int NOT NULL, `author_id` int NOT NULL, `title` varchar(255) NOT NULL, PRIMARY KEY (`id`) ); INSERT INTO book VALUES (1, 1, "1984"); INSERT INTO book VALUES (2, 1, "Animal Farm"); INSERT INTO book VALUES (3, 2, "O Alquimista"); INSERT INTO book VALUES (4, 2, "Brida");四、數(shù)據(jù)庫遷移 & jOOQ代碼生成
執(zhí)行Maven構(gòu)建代碼時候,上一步的V1/V2腳本Flyway會按照版本順序去執(zhí)行,并由jOOQ生成Java代碼:
mvn clean install
成功后,新建測試用例測試:
import org.jooq.DSLContext; import org.jooq.Record; import org.jooq.Result; import org.jooq.SQLDialect; import org.jooq.impl.DSL; import java.sql.Connection; import java.sql.DriverManager; import static test.generated.tables.Author.AUTHOR; /** * 測試類 */ public class Main { public static void main(String[] args) { // 用戶名 String userName = "root"; // 密碼 String password = "123456"; // mysql連接url String url = "jdbc:mysql://127.0.0.1:33006/flyway_test?useUnicode=true&characterEncoding=UTF-8"; // Connection is the only JDBC resource that we need // PreparedStatement and ResultSet are handled by jOOQ, internally try (Connection conn = DriverManager.getConnection(url, userName, password)) { DSLContext create = DSL.using(conn, SQLDialect.MYSQL); Result五、數(shù)據(jù)庫變動result = create.select().from(AUTHOR).fetch(); for (Record r : result) { Integer id = r.getValue(AUTHOR.ID); String firstName = r.getValue(AUTHOR.FIRST_NAME); String lastName = r.getValue(AUTHOR.LAST_NAME); /** * 控制臺輸出 * ID: 1 first name: George last name: Orwell * ID: 2 first name: Paulo last name: Coelho */ System.out.println("ID: " + id + " first name: " + firstName + " last name: " + lastName); } // 關(guān)閉連接對象 conn.close(); } // For the sake of this tutorial, let"s keep exception handling simple catch (Exception e) { e.printStackTrace(); } } }
近期書庫里多了中文書籍,需要為book表添加語言種類字段
在src/main/resources/db/migration目錄下新增修改數(shù)據(jù)庫腳本:
# V3__book_add_language.sql ALTER TABLE `book` ADD COLUMN `language_id` int(7) DEFAULT "1" NOT NULL;
重新運行Maven構(gòu)建:
mvn clean install
測試用例:
import org.jooq.DSLContext; import org.jooq.Record; import org.jooq.Result; import org.jooq.SQLDialect; import org.jooq.impl.DSL; import java.sql.Connection; import java.sql.DriverManager; import static test.generated.tables.Author.AUTHOR; import static test.generated.tables.Book.BOOK; /** * 測試類 */ public class BookMain { public static void main(String[] args) { // 用戶名 String userName = "root"; // 密碼 String password = "123456"; // mysql連接url String url = "jdbc:mysql://127.0.0.1:33006/flyway_test?useUnicode=true&characterEncoding=UTF-8"; // Connection is the only JDBC resource that we need // PreparedStatement and ResultSet are handled by jOOQ, internally try (Connection conn = DriverManager.getConnection(url, userName, password)) { DSLContext create = DSL.using(conn, SQLDialect.MYSQL); Resultresult = create.select().from(BOOK).fetch(); for (Record r : result) { Integer id = r.getValue(BOOK.ID); String firstName = r.getValue(BOOK.TITLE); Integer languageId = r.getValue(BOOK.LANGUAGE_ID); /** * 控制臺輸出 * ID: 1 title: 1984 language: 英文 * ID: 2 title: Animal Farm language: 英文 * ID: 3 title: O Alquimista language: 英文 * ID: 4 title: Brida language: 英文 */ System.out.println("ID: " + id + " title: " + firstName + " language: " + (languageId.intValue() == 1 ? "英文" : "中文")); } // 關(guān)閉連接對象 conn.close(); } // For the sake of this tutorial, let"s keep exception handling simple catch (Exception e) { e.printStackTrace(); } } }
【jOOQ中文】教程代碼都會放在碼云,希望多多宣傳給Star(^_?)☆。
https://gitee.com/xujian_jaso...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67571.html
摘要:關(guān)于是一個基于編寫的工具包,具有簡單輕量函數(shù)式編程寫等獨特優(yōu)勢,非常適合敏捷快速迭代開發(fā)。三代碼生成在這一步中,我們將使用的命令行工具生成映射到表的類。注意不會主動關(guān)閉連接,需要我們手動關(guān)閉。 關(guān)于jOOQ jOOQ: The easiest way to write SQL in Java jOOQ是一個基于Java編寫SQL的工具包,具有:簡單、輕量、函數(shù)式編程寫SQL等獨特優(yōu)勢,...
摘要:在這個例子中,我們將整合但您也可以使用其他連接池,如,,等。作為構(gòu)建和執(zhí)行。 jOOQ和Spring很容易整合。 在這個例子中,我們將整合: Alibaba Druid(但您也可以使用其他連接池,如BoneCP,C3P0,DBCP等)。 Spring TX作為事物管理library。 jOOQ作為SQL構(gòu)建和執(zhí)行l(wèi)ibrary。 一、準(zhǔn)備數(shù)據(jù)庫 DROP TABLE IF EXIS...
摘要:日期和時間處理日期和時間的函數(shù)庫。使用中可觀察序列,創(chuàng)建異步基于事件應(yīng)用程序的函數(shù)庫。為分布式系統(tǒng)提供延遲和容錯處理。發(fā)布使用本機格式分發(fā)應(yīng)用程序的工具。將程序資源和打包成和的本機文件。圖像處理用來幫助創(chuàng)建評估或操作圖形的函數(shù)庫。 好資源要分享原文 譯者 唐尤華 翻譯自 github akullpp 構(gòu)建 這里搜集了用來構(gòu)建應(yīng)用程序的工具。 Apache Maven:Mave...
摘要:在我們的項目中使用進行數(shù)據(jù)庫版本控制。我們的項目采用管理。項目地址配置參考地址配置過程很簡單,只需要在中添加配置即可引入配件配置添加依賴默認(rèn)執(zhí)行的腳本路徑是,腳本以的方式命名。配置完成后,執(zhí)行可以看到可用的命令,執(zhí)行可以執(zhí)行腳本。 在我們的Springboot項目——studentsystem中使用flyway進行數(shù)據(jù)庫版本控制。我們的springboot項目采用gradle管理。 ...
閱讀 1329·2021-11-16 11:44
閱讀 3793·2021-10-09 10:01
閱讀 1789·2021-09-24 10:31
閱讀 3903·2021-09-04 16:41
閱讀 2545·2021-08-09 13:45
閱讀 1244·2019-08-30 14:08
閱讀 1820·2019-08-29 18:32
閱讀 1667·2019-08-26 12:12