Java >> Java Tutorial >  >> Tag >> Spring

Liquibase – Handhabung der Datenbank in Spring Boot

Wenn Sie eine Anwendung mit Spring Boot erstellen, wird der Umgang mit Datenbankänderungen mit der Zeit zu einem Alptraum. Je mehr Änderungen Sie hinzufügen, desto mehr Änderungen müssen Sie für Ihre Datenbank verwalten. Liquibase ist die beste Lösung da draußen. In diesem Beitrag zeigen wir, wie Datenbankänderungen mit liquibase behandelt werden.

Was ist Liquibase?

Liquibase ist eine Open-Source-Bibliothek zum Verfolgen, Verwalten und Anwenden von Datenbankänderungen. Liquibase verfolgt die Änderungen an der Datenbank über eine XML-Konfiguration, in der ein Entwickler normalerweise Änderungssätze hinzufügt.

Jeder Änderungssatz hat eine ID und Autorenattribute. Liquibase verwendet ein Änderungsprotokoll, um die Datenbankänderungen zu verfolgen. Jeder von Ihnen hinzugefügte Änderungssatz wird dem Änderungsprotokoll hinzugefügt. Das Änderungsprotokoll ist ein Verzeichnis aller Änderungen, die Sie an der Datenbank vornehmen.

Wie wirkt Liquibase?

Um Datenbankänderungen zu verfolgen, schreiben Sie eine plattformunabhängige XML-Datei. Diese XML-Datei wird auf der Befehlszeile verwendet, um sie in Skripte für Ihre Datenbank-Engine zu übersetzen.

Wir können auch ein Maven- oder Gradle-Plugin verwenden, um Datenbankänderungen in die Build-Konfiguration aufzunehmen.

Liquibase verwendet eigene Tabellen, um Änderungen nachzuverfolgen. Diese Tabellen sind Teil des Schemas, das Sie aus Konsistenzgründen erstellen. Es zeichnet den Hash jedes Changesets auf.

Wie schreibt man ein Changeset?

Zuvor habe ich erwähnt, dass Sie ein Changeset mit XML schreiben können. Aber liquibase bietet auch die Unterstützung für JSON oder YAML.

Als Teil dieses Beitrags werde ich zeigen, wie ich ein Changeset hinzufüge und Skripte für die Datenbank generiere.

Erstellen Sie eine XML-Changelog-Datei db.changelog-master.xml für unsere Datenbank unter Ordner src\main\resources\db . Wenn Sie liquibase von Projektbeginn an verwenden, erstellen Sie normalerweise eine anfängliche Änderungsprotokolldatei, die anfängliche Skripte generiert. Danach können Sie jede Änderung über ein Änderungsset nachverfolgen.

Die Datei ohne Änderungssatz sieht wie folgt aus:


<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd
    http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
</databaseChangeLog>

Jetzt kann ich diese Masterdatei auf zwei Arten handhaben. Für jeden Änderungssatz kann ich eine separate Datei erstellen und diese Datei in die Hauptdatei aufnehmen ODER ich kann jeden Änderungssatz in dieselbe Hauptdatei einfügen.

Jeder Änderungssatz benötigt einen Autor und eine eindeutige ID.

Jetzt fügen wir dieser Änderungsprotokolldatei einen Änderungssatz hinzu, der wie folgt aussieht:


<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd
    http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

    <changeSet author="Yogesh Mali" id="jira-ticket-01">
        <createTable tableName="user">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="guid" type="varchar(50)">
            </column>
            <column name="firstname" type="varchar(100)">
                <constraints nullable="false"/>
            </column>
            <column name="middlename" type="varchar(100)"></column>
            <column name="lastname" type="varchar(100)"></column>
            <column name="email" type="varchar(100)">
                <constraints nullable="false"/>
            </column>
            <column name="companyid" type="int"></column>
            <column name="roleid" type="int"></column>
        </createTable>
        <createTable tableName="company">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="guid" type="varchar(50)">
                <constraints nullable="false"/>
            </column>
            <column name="name" type="varchar(50)">
                <constraints nullable="false"/>
            </column>
            <column name="type" type="varchar(10)"></column>
        </createTable>
        <createTable tableName="role">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="role_name" type="varchar(20)">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <addForeignKeyConstraint baseTableName="user" baseColumnNames="companyid"
                                  constraintName="company_fk" referencedTableName="company"
                                  referencedColumnNames="id" />
        <addForeignKeyConstraint baseTableName="user" baseColumnNames="roleid"
                                  constraintName="role_fk" referencedTableName="role"
                                  referencedColumnNames="id"/>
    </changeSet>
</databaseChangeLog>

Jetzt sind wir bereit, liquibase Bean in unserem Spring Boot-Projekt zu erstellen. Wir müssen die folgende Eigenschaft in unserem application.properties hinzufügen Datei.

spring.liquibase.changeLog=classpath:/db/db.changelog-master.xml .

Vergessen Sie auch nicht, Datenbankeigenschaften in application.properties hinzuzufügen Datei.


spring.datasource.url=jdbc:mysql://127.0.0.1/demo
spring.datasource.username = sa
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.liquibase.changeLog=classpath:/db/db.changelog-master.xml

Bevor wir unser Spring Boot-Projekt ausführen, fügen Sie die Liquibase-Abhängigkeit in unserem Gradle-Projekt hinzu.

compile('org.liquibase:liquibase-core:4.0.0') .

Wenn wir nun unser Spring Boot-Projekt ausführen, sehen wir die in den Protokollmeldungen erstellten Datenbanktabellen wie folgt:


2020-07-26 12:22:24.362  INFO 32412 --- [           main] liquibase.lockservice                    : Successfully acquired change log lock
2020-07-26 12:22:25.314  INFO 32412 --- [           main] liquibase.changelog                      : Creating database history table with name: blogdemo.DATABASECHANGELOG
2020-07-26 12:22:25.345  INFO 32412 --- [           main] liquibase.changelog                      : Reading from blogdemo.DATABASECHANGELOG
2020-07-26 12:22:25.427  INFO 32412 --- [           main] liquibase.changelog                      : Table user created
2020-07-26 12:22:25.443  INFO 32412 --- [           main] liquibase.changelog                      : Table company created
2020-07-26 12:22:25.458  INFO 32412 --- [           main] liquibase.changelog                      : Table role created
2020-07-26 12:22:25.520  INFO 32412 --- [           main] liquibase.changelog                      : Foreign key constraint added to user (companyid)
2020-07-26 12:22:25.588  INFO 32412 --- [           main] liquibase.changelog                      : Foreign key constraint added to user (roleid)
2020-07-26 12:22:25.588  INFO 32412 --- [           main] liquibase.changelog                      : ChangeSet db/db.changelog-master.xml::jira-ticket-01::Yogesh Mali ran successfully in 186ms
2020-07-26 12:22:25.600  INFO 32412 --- [           main] liquibase.lockservice                    : Successfully released change log lock


Als Teil dieser Ausführung erstellte liquibase auch die Tabellen databasechangelog und databasechangeloglock . Liquibase verwendet diese Tabellen, um die Änderungen für die Datenbank zu verfolgen. Wenn Sie der Änderungsprotokolldatei einen weiteren Änderungssatz hinzufügen, identifiziert liquibase diesen Änderungssatz basierend auf früheren Änderungen und führt die entsprechende Aktion aus, wenn Sie die Anwendung das nächste Mal ausführen.

Schlussfolgerung

In diesem Beitrag habe ich gezeigt, wie man liquibase verwendet, um Datenbankänderungen in einem Spring Boot-Projekt zu handhaben.

Eine Sache, die ich in diesem Beitrag nicht besprochen habe, ist ein weiteres Datenbankmigrationstool Flyway. Flyway ist auch ein Open-Source-Datenbankmigrationstool.

Wenn Ihnen dieser Beitrag gefallen hat, abonnieren Sie hier meinen Blog.

Referenzen

  • Liquibase – Liquibase mit Spring Boot und Maven

Java-Tag