Stručný sprievodca načítaním počiatočných údajov pomocou Spring Boot

1. Prehľad

Vďaka Spring Boot je skutočne ľahké spravovať naše zmeny v databáze jednoduchým spôsobom. Ak ponecháme predvolenú konfiguráciu, vyhľadá entity v našich balíkoch a automaticky vytvorí príslušné tabuľky.

Niekedy však budeme potrebovať jemnejšiu kontrolu nad úpravami databázy. Vtedy môžeme použiť data.sql a schema.sql súbory na jar.

2. The data.sql Súbor

Vytvorme tu tiež predpoklad, že pracujeme s JPA - a definujeme jednoduchý Krajina subjekt v našom projekte:

@Entity public class Country {@Id @GeneratedValue (strategy = IDENTITY) private Integer id; @Column (nullable = false) private String name; // ...}

Ak spustíme našu aplikáciu, Spring Boot pre nás vytvorí prázdny stôl, ale ničím ho nevyplní.

Jednoduchý spôsob, ako to urobiť, je vytvoriť súbor s názvom data.sql:

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

Keď spustíme projekt s týmto súborom na ceste triedy, Spring ho zdvihne a použije na naplnenie databázy.

3. The schema.sql Súbor

Niekedy sa nechceme spoliehať na predvolený mechanizmus vytvárania schém. V takýchto prípadoch môžeme vytvoriť zvyk schema.sql spis:

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

Jar tento súbor vyzdvihne a použije ho na vytvorenie schémy.

Je tiež dôležité nezabudnúť vypnúť automatické vytváranie schém, aby ste predišli konfliktom:

spring.jpa.hibernate.ddl-auto = žiadny

4. Riadenie tvorby databázy pomocou režimu dlhodobého spánku

Jar poskytuje špecifické pre JPA vlastnosť, ktorú Hibernate používa na generovanie DDL: spring.jpa.hibernate.ddl-auto.

Štandardné hodnoty vlastnosti Hibernate sú: vytvoriť, aktualizovať, create-drop, potvrdiť a žiadny:

  • vytvoriť - Režim dlhodobého spánku najskôr zruší existujúce tabuľky, potom vytvorí nové tabuľky
  • aktualizovať - objektový model vytvorený na základe mapovaní (anotácií alebo XML) sa porovná s existujúcou schémou a režim dlhodobého spánku potom aktualizuje schému podľa rozdielu. Nikdy neodstráni existujúce tabuľky alebo stĺpce, aj keď ich už aplikácia nevyžaduje
  • create-drop - podobný vytvoriť, s dodatkom, že program Hibernate zruší databázu po dokončení všetkých operácií. Spravidla sa používa na testovanie jednotiek
  • potvrdiť - Režim dlhodobého spánku iba overuje, či tabuľky a stĺpce existujú, inak spôsobí výnimku
  • žiadny - táto hodnota efektívne vypne generovanie DDL

Spring Boot interne predvolene obsahuje túto hodnotu parametra create-drop ak nebol zistený žiadny správca schém, inak žiadny pre všetky ostatné prípady.

Hodnotu musíme nastaviť opatrne alebo použiť jeden z ďalších mechanizmov na inicializáciu databázy.

5. @Sql

Jar tiež poskytuje @Sql anotácia - deklaratívny spôsob inicializácie a vyplnenia našej testovacej schémy.

Pozrime sa, ako používať @Sql anotáciu, aby ste vytvorili novú tabuľku a tiež načítali tabuľku s počiatočnými údajmi pre náš test integrácie:

@Sql ({"/ employee_schema.sql", "/import_employees.sql"}) verejná trieda SpringBootInitialLoadIntegrationTest {@Autowired private EmployeeRepository employeeRepository; @Test public void testLoadDataForTestClass () {assertEquals (3, employeeRepository.findAll (). Size ()); }}

Atribúty @Sql anotácie sú:

  • konfigurácia - lokálna konfigurácia pre skripty SQL. Podrobne to popisujeme v nasledujúcej časti
  • executionPhase - tiež môžeme určiť, kedy sa majú skripty spustiť BEFORE_TEST_METHOD alebo AFTER_TEST_METHOD
  • Vyhlásenia - môžeme vyhlásiť vložené príkazy SQL na vykonanie
  • skripty - môžeme deklarovať cesty k vykonaniu súborov skriptu SQL. Toto je alias pre hodnotu atribút

The @Sql anotácia môžu byť použité na úrovni triedy alebo metódy. Môžeme načítať ďalšie údaje požadované pre konkrétny testovací prípad anotáciou tejto metódy:

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

Môžeme nakonfigurovať spôsob, akým analyzujeme a spúšťame skripty SQL pomocou @SqlConfig anotácia.

@SqlConfig možno deklarovať na úrovni triedy, kde slúži ako globálna konfigurácia. Alebo sa dá použiť na konfiguráciu konkrétneho @Sql anotácia.

Pozrime sa na príklad, kde určujeme kódovanie našich skriptov SQL, ako aj režim transakcie na vykonávanie skriptov:

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

A pozrime sa na rôzne atribúty @SqlConfig:

  • blockCommentStartDelimiter - oddeľovač na identifikáciu začiatku blokových komentárov v súboroch skriptov SQL
  • blockCommentEndDelimiter - oddeľovač na označenie konca blokových komentárov v súboroch skriptov SQL
  • komentárPrefix - predpona na identifikáciu jednoriadkových komentárov v súboroch skriptov SQL
  • dátový zdroj - názov javax.sql.DataSource fazuľa, proti ktorej sa budú skripty a vyhlásenia spúšťať
  • kódovanie - kódovanie súborov skriptu SQL, predvolené je kódovanie platformy
  • errorMode - režim, ktorý sa použije, keď sa pri spustení skriptov vyskytne chyba
  • oddeľovač - reťazec používaný na oddelenie jednotlivých príkazov, predvolené nastavenie je „-“
  • transactionManager - názov fazule PlatformTransactionManager ktoré sa použijú na transakcie
  • transactionMode - režim, ktorý sa použije pri vykonávaní skriptov pri transakcii

7. @SqlGroup

Java 8 a novšie umožňujú použitie opakovaných anotácií. Túto funkciu je možné využiť pre @Sql anotácie tiež. Pre Java 7 a staršiu verziu existuje anotácia kontajnera - @SqlGroup. Pomocou @SqlGroup anotácie, môžeme deklarovať viac @Sql anotácie:

@SqlGroup ({@Sql (scripts = "/employees_schema.sql", config = @SqlConfig (actionMode = TransactionMode.ISOLATED)), @Sql ("/ import_employees.sql")}) verejná trieda SpringBootSqlGroupAnnotationIntegrationTest {EmployerReport ; @Test public void testLoadDataForTestCase () {assertEquals (3, employeeRepository.findAll (). Size ()); }}

8. Záver

V tomto rýchlom článku sme videli, ako môžeme využiť pákový efekt schema.sql a data.sql súbory na nastavenie počiatočnej schémy a jej naplnenie údajmi. Tiež sme videli, ako môžeme využiť @Sql, @SqlConfiga @SqlGroup anotácie na načítanie údajov o skúškach.

Majte na pamäti, že tento prístup je vhodnejší pre základné a jednoduché scenáre, akákoľvek pokročilá manipulácia s databázou by si vyžadovala pokročilejšie a prepracovanejšie nástroje ako Liquibase alebo Flyway.

Útržky kódu, ako vždy, nájdete na GitHub.