Gebruik Liquibase om uw database-schema veilig te ontwikkelen

1. Overzicht

In deze korte tutorial maken we gebruik van Liquibase om het databaseschema te ontwikkelen van een Java-webapplicatie.

We gaan ons eerst concentreren op een algemene Java-app, en we gaan ook enkele interessante opties bekijken die beschikbaar zijn voor Spring en Hibernate.

Heel kort, de kern van het gebruik van Liquibase is de changeLog het dossier - een XML-bestand dat alle wijzigingen bijhoudt die moeten worden uitgevoerd om de database bij te werken.

Laten we beginnen met de Maven-afhankelijkheid die we moeten toevoegen aan onze pom.xml:

 org.liquibase liquibase-core 3.4.1 

U kunt hier ook controleren of er een nieuwere versie van liquibase-core is.

2. Het databasewijzigingslogboek

Laten we nu eens kijken naar een eenvoudig changeLog bestand - deze voegt alleen een kolom toe "adres" Naar de tafel "gebruikers“:

Merk op hoe de wijzigingsset wordt geïdentificeerd door een ID kaart en een schrijver - om ervoor te zorgen dat het uniek kan worden geïdentificeerd en slechts één keer kan worden toegepast.

Laten we niet kijken hoe we dit in onze applicatie kunnen aansluiten en ervoor zorgen dat het wordt uitgevoerd wanneer de applicatie opstart.

3. Laat Liquibase draaien met een Spring Bean

Onze eerste optie om de wijzigingen bij het opstarten van de applicatie uit te voeren, is via een Spring bean. Er zijn natuurlijk veel andere manieren, maar als we te maken hebben met een Spring-applicatie, is dit een goede, eenvoudige manier om te gaan:

@Bean openbare SpringLiquibase liquibase () {SpringLiquibase liquibase = nieuwe SpringLiquibase (); liquibase.setChangeLog ("classpath: liquibase-changeLog.xml"); liquibase.setDataSource (dataSource ()); terug liquibase; }

Merk op hoe we het naar een geldig verwijzen changeLog bestand dat moet bestaan ​​op het klassenpad.

4. Gebruik Liquibase met Spring Boot

Als u Spring Boot gebruikt, hoeft u geen Boon voor Liquibase.

Het enige dat u nodig heeft, is uw wijzigingslogboek in te voeren "db / changelog / db.changelog-master.yaml”En Liquibase-migraties worden automatisch uitgevoerd bij het opstarten.

Let daar op:

  • U moet 'liquibase-core”Afhankelijkheid.
  • U kunt het standaard wijzigingslogbestand wijzigen met 'liquibase.change-log”Eigenschap - bijvoorbeeld:
liquibase.change-log = klassenpad: liquibase-changeLog.xml

5. Schakel Liquibase uit in Spring Boot

Soms moeten we de uitvoering van de Liquibase-migratie bij het opstarten uitschakelen.

De eenvoudigste optie die we hebben, is om een spring.liquibase.enabled eigendom. Op deze manier blijft alle resterende Liquibase-configuratie onaangeroerd.

Hier is het voorbeeld voor Spring Boot 2:

spring.liquibase.enabled = false

Voor Spring Boot 1.x moeten we een liquibase. ingeschakeld eigendom:

liquibase.enabled = false

6. Genereer het changeLog Met een Maven-plug-in

In plaats van het changeLog handmatig bestand - we kunnen de Liquibase Maven-plug-in gebruiken om er een te genereren en onszelf veel werk te besparen.

6.1. Plug-in configuratie

Hier zijn de wijzigingen in onze pom.xml:

 org.liquibase liquibase-maven-plugin 3.4.1 ... org.liquibase liquibase-maven-plugin 3.4.1 src / main / resources / liquibase.properties 

6.2. Genereer een ChangeLog Van een bestaande database

We kunnen de plug-in gebruiken om een ​​Changelog te genereren uit een bestaande database:

mvn liquibase: genererenChangeLog

Hier zijn de liquibase eigenschappen:

url = jdbc: mysql: // localhost: 3306 / oauth_reddit gebruikersnaam = tutorialuser wachtwoord = tutorialmy5ql driver = com.mysql.jdbc. Driver outputChangeLogFile = src / main / resources / liquibase-outputChangeLog.xml

Het eindresultaat is een changeLog bestand dat we kunnen gebruiken om een ​​initieel DB-schema te maken of om gegevens te vullen. Hier is hoe dat eruit zou zien voor onze voorbeeld-app:

                     ... 

6.3. Genereer een ChangeLog Van verschil tussen twee databases

We kunnen de plug-in gebruiken om een changeLog bestand uit de verschillen tussen twee bestaande databases (bijvoorbeeld: ontwikkeling en productie):

mvn liquibase: diff

Dit zijn de eigenschappen:

changeLogFile = src / main / resources / liquibase-changeLog.xml url = jdbc: mysql: // localhost: 3306 / oauth_reddit gebruikersnaam = tutorialgebruiker wachtwoord = tutorialmy5ql driver = com.mysql.jdbc. Stuurprogramma-referentieUrl = jdbc: h2: mem: oauth_reddit diffChangeLogFile = src / main / resources / liquibase-diff-changeLog.xml referenceDriver = org.h2.Driver referenceUsername = sa referencePassword =

En hier is een fragment van het gegenereerde changeLog:

Dit is een superkrachtige manier om uw database te laten evolueren door - bijvoorbeeld - Hibernate automatisch een nieuw ontwikkelingsschema te laten genereren en dat vervolgens als referentiepunt te gebruiken ten opzichte van het oude schema.

7. Gebruik de Liquibase Hibernate-plug-in

Als de toepassing Hibernate gebruikt, gaan we kijken naar een zeer handige manier om het changeLog.

Ten eerste - hier is hoe de liquibase-winterslaap plug-in moet worden geconfigureerd in Maven:

7.1. Plug-in configuratie

Laten we eerst de nieuwe plug-in configureren en de juiste afhankelijkheden gebruiken:

  org.liquibase liquibase-maven-plugin 3.4.1 src / main / resources / liquibase.properties org.liquibase.ext liquibase-hibernate4 3.5 org.springframework spring-beans 4.1.7.RELEASE org.springframework.data spring-data-jpa 1.7.3 VRIJGAVE 

7.2. Genereer een changeLog van Verschillen tussen een database en persistentie-entiteiten

Nu, voor het leuke gedeelte. We kunnen deze plug-in gebruiken om een changeLog bestand uit de verschillen tussen een bestaande database (bijvoorbeeld productie) en onze nieuwe persistentie-entiteiten.

Dus - om het simpel te houden - als een entiteit eenmaal is gewijzigd, kunt u eenvoudig de wijzigingen genereren tegen het oude DB-schema, get een schone, krachtige manier om uw schema in productie te ontwikkelen.

Dit zijn de liquibase-eigenschappen:

changeLogFile = classpath: liquibase-changeLog.xml url = jdbc: mysql: // localhost: 3306 / oauth_reddit gebruikersnaam = tutorialuser wachtwoord = tutorialmy5ql driver = com.mysql.jdbc. Stuurprogramma-referentieUrl = winterslaap: lente: org.baeldung.persistence.model ? dialect = org.hibernate.dialect.MySQLDialect diffChangeLogFile = src / main / resources / liquibase-diff-changeLog.xml

Merk op referenceUrl pakketscan gebruikt, dus het dialect parameter is vereist.

8. Conclusie

In deze tutorial hebben we verschillende manieren geïllustreerd om Liquibase te gebruiken en op een veilige en volwassen manier te komen het ontwikkelen en herstructureren van het DB-schema van een Java-app.

De implementatie van al deze voorbeelden en codefragmenten kan gevonden worden in mijn github-project - dit is een op Eclipse gebaseerd project, dus het zou gemakkelijk moeten kunnen worden geïmporteerd en uitgevoerd zoals het is.