Hurtigveiledning for innlasting av startdata med vårstøvel

1. Oversikt

Spring Boot gjør det veldig enkelt å administrere databaseendringene våre på en enkel måte. Hvis vi forlater standardkonfigurasjonen, vil den søke etter enheter i pakkene våre og opprette de respektive tabellene automatisk.

Men noen ganger trenger vi litt finere kontroll over databaseendringene. Det er da vi kan bruke data.sql og schema.sql filer på våren.

2. Den data.sql Fil

La oss også anta her at vi jobber med JPA - og definere en enkel Land enhet i prosjektet vårt:

@Entity offentlig klasse Land {@Id @GeneratedValue (strategi = IDENTITET) privat Heltall-id; @Column (nullable = false) private Strengnavn; // ...}

Hvis vi kjører søknaden vår, Spring Boot vil lage en tom tabell for oss, men vil ikke fylle den ut med noe.

En enkel måte å gjøre dette på er å opprette en fil med navnet data.sql:

INSERT I land (navn) VERDIER ('India'); INSERT I land (navn) VERDIER ('Brasil'); INSERT I land (navn) VERDIER ('USA'); INSERT I land (navn) VERDIER ('Italia');

Når vi kjører prosjektet med denne filen på klassestien, vil Spring hente den og bruke den til å fylle ut databasen.

3. Den schema.sql Fil

Noen ganger vil vi ikke stole på standardopprettingsmekanismen for skjemaer. I slike tilfeller kan vi lage en egendefinert schema.sql fil:

OPPRETT TABELL land (id INTEGER IKKE NULL AUTO_INCREMENT, navn VARCHAR (128) IKKE NULL, PRIMÆR NØKKEL (id));

Spring henter denne filen og bruker den til å lage et skjema.

Det er også viktig å huske å slå av automatisk skjemaoppretting for å unngå konflikter:

spring.jpa.hibernate.ddl-auto = ingen

4. Kontrollere oppretting av databaser ved hjelp av dvalemodus

Spring gir en JPA-spesifikk eiendom som dvalemodus bruker for DDL-generering: spring.jpa.hibernate.ddl-auto.

Standardverdiene for dvalemodus er: skape, Oppdater, create-drop, validere og ingen:

  • skape - Hibernate dropper først eksisterende tabeller, og oppretter deretter nye tabeller
  • Oppdater - objektmodellen som er opprettet basert på tilordningene (merknader eller XML) sammenlignes med det eksisterende skjemaet, og deretter oppdaterer dvalemodus skjemaet i henhold til forskjellen. Den sletter aldri de eksisterende tabellene eller kolonnene, selv om de ikke lenger kreves av applikasjonen
  • create-drop - lik skape, med tillegg at dvalemodus vil slippe databasen etter at alle operasjoner er fullført. Vanligvis brukt til enhetstesting
  • validere - Dvalemodus validerer bare om tabellene og kolonnene eksisterer, ellers gir det et unntak
  • ingen - denne verdien slår effektivt av DDL-generasjonen

Spring Boot har som standard denne parameterverdien som create-drop hvis ingen skjemabehandler har blitt oppdaget, ellers ingen for alle andre saker.

Vi må sette verdien nøye eller bruke en av de andre mekanismene for å initialisere databasen.

5. @Sql

Våren gir også @Sql kommentar - en deklarativ måte å initialisere og fylle ut testskjemaet vårt.

La oss se hvordan du bruker @Sql kommentar for å opprette en ny tabell og også laste tabellen med innledende data for vår integrasjonstest:

@Sql ({"/ ansatte_schema.sql", "/import_medarbeidere.sql"}) offentlig klasse SpringBootInitialLoadIntegrationTest {@Autowired private EmployeeRepository employeeRepository; @Test offentlig ugyldig testLoadDataForTestClass () {assertEquals (3, employeeRepository.findAll (). Size ()); }}

Attributtene til @Sql merknader er:

  • config - lokal konfigurasjon for SQL-skriptene. Vi beskriver dette i detalj i neste avsnitt
  • kjøring fase - vi kan også spesifisere når man skal utføre skriptene FØR_TEST_METHOD eller ETTER_TEST_METHOD
  • uttalelser - vi kan erklære innebygde SQL-setninger å kjøre
  • skript - vi kan erklære stiene til SQL-skriptfiler å kjøre. Dette er et alias for verdi Egenskap

De @Sql kommentar kan brukes på klassenivå eller metodenivå. Vi kan laste inn tilleggsdata som kreves for en bestemt testsak ved å kommentere den metoden:

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

Vi kan konfigurere måten vi analyserer og kjører SQL-skriptene på ved å bruke @SqlConfig kommentar.

@SqlConfig kan deklareres på klassenivå, der den fungerer som en global konfigurasjon. Eller det kan brukes til å konfigurere en bestemt @Sql kommentar.

La oss se et eksempel der vi spesifiserer kodingen av SQL-skriptene våre samt transaksjonsmodus for utføring av skriptene:

@Test @Sql (scripts = {"/import_senior_employees.sql"}, config = @SqlConfig (koding = "utf-8", transactionMode = TransactionMode.ISOLATED)) offentlig ugyldig testLoadDataForTestCase () {assertEquals (5, employeeRepository ).størrelse()); }

Og la oss se på de forskjellige egenskapene til @SqlConfig:

  • blockCommentStartDelimiter - skilletegn for å identifisere starten på blokkeringskommentarer i SQL-skriptfiler
  • blockCommentEndDelimiter - skilletegn for å betegne slutten på blokkkommentarer i SQL-skriptfiler
  • commentPrefix - prefiks for å identifisere enlinjekommentarer i SQL-skriptfiler
  • datakilde - navnet på javax.sql.DataSource bønne som manusene og uttalelsene kjøres mot
  • koding - koding for SQL-skriptfilene, standard er plattformkoding
  • errorMode - modus som vil bli brukt når det oppstår en feil som kjører skriptene
  • separator - streng brukt til å skille individuelle utsagn, standard er “-“
  • transactionManager - bønnenavnet til PlatformTransactionManager som vil bli brukt til transaksjoner
  • transactionMode - modusen som skal brukes når man utfører skript i transaksjonen

7. @SqlGroup

Java 8 og nyere tillater bruk av gjentatte kommentarer. Denne funksjonen kan brukes til @Sql kommentarer også. For Java 7 og nyere er det en containernotering - @SqlGroup. Bruker @SqlGroup kommentar, vi kan erklære flere @Sql kommentarer:

@SqlGroup ({@Sql (scripts = "/employees_schema.sql", config = @SqlConfig (transactionMode = TransactionMode.ISOLATED)), @Sql ("/ import_employees.sql")}) offentlig klasse SpringBootSqlGroupAnnotationIntegrationTestMedarbeider ; @Test offentlig ugyldig testLoadDataForTestCase () {assertEquals (3, employeeRepository.findAll (). Size ()); }}

8. Konklusjon

I denne raske artikkelen så vi hvordan vi kan utnytte schema.sql og data.sql filer for å sette opp et innledende skjema og fylle det ut med data. Vi så også hvordan vi kan bruke @Sql, @SqlConfig, og @SqlGroup merknader for å laste inn testdata for tester.

Husk at denne tilnærmingen er mer egnet for grunnleggende og enkle scenarier. Enhver avansert databashåndtering vil kreve mer avansert og raffinert verktøy som Liquibase eller Flyway.

Kodebiter, som alltid, finnes på GitHub.