Kurzanleitung zum Laden der Anfangsdaten mit Spring Boot

Kurzanleitung zum Laden von Anfangsdaten mit Spring Boot

1. Überblick

Spring Boot macht es wirklich einfach, unsere Datenbankänderungen auf einfache Weise zu verwalten. Wenn wir die Standardkonfiguration beibehalten, wird nach Entitäten in unseren Paketen gesucht und die entsprechenden Tabellen automatisch erstellt.

Manchmal benötigen wir jedoch eine genauere Kontrolle über die Datenbankänderungen. Dann können wir im Frühjahr die Dateiendata.sql undschema.sql verwenden.

2. Diedata.sql-Datei

Nehmen wir hier auch an, dass wir mit JPA arbeiten - und definieren Sie eine einfacheCountry-Entität in unserem Projekt:

@Entity
public class Country {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Integer id;

    @Column(nullable = false)
    private String name;

    //...
}

Wenn wir unsere Anwendung ausführen,Spring Boot will create an empty table for us, but won’t populate it with anything.

Eine einfache Möglichkeit, dies zu tun, besteht darin, eine Datei mit dem Namendata.sql: zu erstellen

INSERT INTO country (name) VALUES ('India');
INSERT INTO country (name) VALUES ('Brazil');
INSERT INTO country (name) VALUES ('USA');
INSERT INTO country (name) VALUES ('Italy');

Wenn wir das Projekt mit dieser Datei im Klassenpfad ausführen, wird es von Spring abgerufen und zum Auffüllen der Datenbank verwendet.

3. Dieschema.sql-Datei

Manchmal möchten wir uns nicht auf den Standardmechanismus zur Schemaerstellung verlassen. In solchen Fällen können wir eine benutzerdefinierteschema.sql-Datei erstellen:

CREATE TABLE country (
    id   INTEGER      NOT NULL AUTO_INCREMENT,
    name VARCHAR(128) NOT NULL,
    PRIMARY KEY (id)
);

Spring wird diese Datei abholen und zum Erstellen eines Schemas verwenden.

Es ist auch wichtig, die automatische Schemaerstellung zu deaktivieren, um Konflikte zu vermeiden:

spring.jpa.hibernate.ddl-auto=none

4. Steuern der Datenbankerstellung im Ruhezustand

Spring liefert ein JPA-spezifischesproperty which Hibernate uses for DDL generation:*spring.jpa.hibernate.ddl-auto*.

Die Standardwerte für den Ruhezustand sind:create,update,create-drop,validate undnone:

  • create - Der Ruhezustand löscht zuerst vorhandene Tabellen und erstellt dann neue Tabellen

  • update - Das anhand der Zuordnungen (Anmerkungen oder XML) erstellte Objektmodell wird mit dem vorhandenen Schema verglichen, und der Ruhezustand aktualisiert das Schema entsprechend dem Unterschied. Die vorhandenen Tabellen oder Spalten werden nie gelöscht, auch wenn sie von der Anwendung nicht mehr benötigt werden

  • create-drop - ähnlich wiecreate, mit dem Zusatz, dass der Ruhezustand die Datenbank löscht, nachdem alle Vorgänge abgeschlossen sind. Wird normalerweise für Komponententests verwendet

  • validate - Der Ruhezustand überprüft nur, ob die Tabellen und Spalten vorhanden sind, andernfalls wird eine Ausnahme ausgelöst

  • none - Dieser Wert schaltet die DDL-Generierung effektiv aus

Spring Boot setzt diesen Parameterwert intern standardmäßig aufcreate-drop, wenn kein Schema-Manager erkannt wurde, andernfallsnone für alle anderen Fälle.

Wir müssen den Wert sorgfältig festlegen oder einen der anderen Mechanismen verwenden, um die Datenbank zu initialisieren.

5. @Sql

Spring bietet auch die Annotation@Sql- eine deklarative Methode zum Initialisieren und Auffüllen unseres Testschemas.

Lassen Sie uns sehen, wie Sie mit der Annotation@Sqleine neue Tabelle erstellen und die Tabelle mit den Anfangsdaten für unseren Integrationstest laden:

@Sql({"/employees_schema.sql", "/import_employees.sql"})
public class SpringBootInitialLoadIntegrationTest {

    @Autowired
    private EmployeeRepository employeeRepository;

    @Test
    public void testLoadDataForTestClass() {
        assertEquals(3, employeeRepository.findAll().size());
    }
}

Die Attribute der Annotation@Sqlind:

  • config – lokale Konfiguration für die SQL-Skripte. Wir beschreiben dies ausführlich im nächsten Abschnitt

  • executionPhase – können wir auch angeben, wann die Skripte ausgeführt werden sollen, entwederBEFORE_TEST_METHOD oderAFTER_TEST_METHOD

  • statements – we kann Inline-SQL-Anweisungen für die Ausführung deklarieren

  • scripts – we kann die Pfade zu SQL-Skriptdateien deklarieren, die ausgeführt werden sollen. Dies ist ein Alias ​​für dasvalue -Sattribut

Die Annotation@Sqlcan be used at the class level or the method level. Wir können zusätzliche Daten laden, die für einen bestimmten Testfall erforderlich sind, indem wir diese Methode mit Anmerkungen versehen:

@Test
@Sql({"/import_senior_employees.sql"})
public void testLoadDataForTestCase() {
    assertEquals(5, employeeRepository.findAll().size());
}

6. @SqlConfig

Wir könnenconfigure the way we parse and run the SQL scripts verwenden, indem wir die Annotation@SqlConfig verwenden.

@SqlConfig kann auf Klassenebene deklariert werden, wo es als globale Konfiguration dient. Oder es kann verwendet werden, um die Annotation eines bestimmten@Sqlzu konfigurieren.

Sehen wir uns ein Beispiel an, in dem wir die Codierung unserer SQL-Skripte sowie den Transaktionsmodus für die Ausführung der Skripte angeben:

@Test
@Sql(scripts = {"/import_senior_employees.sql"},
  config = @SqlConfig(encoding = "utf-8", transactionMode = TransactionMode.ISOLATED))
public void testLoadDataForTestCase() {
    assertEquals(5, employeeRepository.findAll().size());
}

Schauen wir uns die verschiedenen Attribute von@SqlConfig an:

  • blockCommentStartDelimiter - Trennzeichen zum Identifizieren des Beginns von Blockkommentaren in SQL-Skriptdateien

  • blockCommentEndDelimiter - Trennzeichen für das Ende von Blockkommentaren in SQL-Skriptdateien

  • commentPrefix - Präfix zum Identifizieren einzeiliger Kommentare in SQL-Skriptdateien

  • dataSource - Name derjavax.sql.DataSource-Bean, für die die Skripte und Anweisungen ausgeführt werden

  • encoding - Codierung für die SQL-Skriptdateien, Standard ist die Plattformcodierung

  • errorMode - Modus, der verwendet wird, wenn beim Ausführen der Skripte ein Fehler auftritt

  • separator - Zeichenfolge zum Trennen einzelner Anweisungen, Standard ist "-"

  • transactionManager - Bean-Name desPlatformTransactionManager , der für Transaktionen verwendet wird

  • transactionMode - Der Modus, der beim Ausführen von Skripten in Transaktionen verwendet wird

7. @SqlGroup

In Java 8 und höher können wiederholte Anmerkungen verwendet werden. Diese Funktion kann auch für@Sql Anmerkungen verwendet werden. Für Java 7 und niedriger gibt es eine Container-Annotation -@SqlGroup. Using the @SqlGroup annotation, we can declare multiple @Sql annotations:

@SqlGroup({
  @Sql(scripts = "/employees_schema.sql",
    config = @SqlConfig(transactionMode = TransactionMode.ISOLATED)),
  @Sql("/import_employees.sql")})
public class SpringBootSqlGroupAnnotationIntegrationTest {

    @Autowired
    private EmployeeRepository employeeRepository;

    @Test
    public void testLoadDataForTestCase() {
        assertEquals(3, employeeRepository.findAll().size());
    }
}

8. Fazit

In diesem kurzen Artikel haben wir gesehen, wie wir die Dateienschema.sql unddata.sql nutzen können, um ein anfängliches Schema einzurichten und es mit Daten zu füllen. Wir haben auch gesehen, wie wir die Anmerkungen@Sql, @SqlConfig und@SqlGroup verwenden können, um Testdaten für Tests zu laden.

Beachten Sie, dass dieser Ansatz besser für einfache und einfache Szenarien geeignet ist. Für jede erweiterte Datenbankbehandlung sind erweiterte und verfeinerte Tools wieLiquibase oderFlyway erforderlich.

Code-Schnipsel finden Sie wie immer inover on GitHub.