Кратко ръководство за зареждане на първоначални данни с Spring Boot

1. Общ преглед

Spring Boot прави наистина лесно управлението на промените в нашата база данни по лесен начин. Ако оставим конфигурацията по подразбиране, тя ще търси обекти в нашите пакети и автоматично ще създаде съответните таблици.

Но понякога ще се нуждаем от по-фин зърнест контрол върху промените в базата данни. Тогава можем да използваме файловете data.sql и schema.sql през пролетта.

2. data.sql File

Нека също така направим предположението, че работим с JPA - и да дефинираме прост субект Country в нашия проект:

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

Ако стартираме нашето приложение, Spring Boot ще създаде празна таблица за нас, но няма да го попълни с нищо.

Лесен начин да направите това е да създадете файл с име 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');

Когато стартираме проекта с този файл по пътя на класа, Spring ще го вземе и ще използва за попълване на базата данни.

3. schema.sql File

Понякога не искаме да разчитаме на механизма за създаване на схема по подразбиране. В такива случаи можем да създадем персонализиран файл schema.sql :

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

Spring ще вземе този файл и ще го използва за създаване на схема.

Също така е важно да запомните да изключите автоматичното създаване на схема, за да избегнете конфликти:

spring.jpa.hibernate.ddl-auto=none

4. Контрол на създаването на база данни чрез Hibernate

Spring предоставя специфично за JPA свойство, което Hibernate използва за генериране на DDL: spring.jpa.hibernate.ddl-auto .

Фиксираните стойности на имотите хибернация са: създаване на , актуализация , създаване на пускане , валидира и никой :

  • create - Hibernate първо пуска съществуващите таблици, след това създава нови таблици
  • актуализация - обектният модел, създаден въз основа на съпоставянията (анотации или XML), се сравнява със съществуващата схема и след това Hibernate актуализира схемата според разликата. Той никога не изтрива съществуващите таблици или колони, дори ако те вече не се изискват от приложението
  • create-drop - подобно на създаване , с добавянето, че Hibernate ще изпусне базата данни след приключване на всички операции. Обикновено се използва за модулно тестване
  • валидиране - Hibernate само проверява дали таблиците и колоните съществуват, в противен случай извежда изключение
  • няма - тази стойност ефективно изключва генерирането на DDL

Spring Boot вътрешно задава по подразбиране стойността на този параметър за създаване-отпадане, ако не е открит диспечер на схеми, иначе няма за всички останали случаи.

Трябва да зададем стойността внимателно или да използваме някой от другите механизми за инициализиране на базата данни.

5. @ Sql

Spring също така предоставя анотацията @Sql - декларативен начин за инициализиране и попълване на нашата тестова схема.

Нека да видим как да използваме анотацията @Sql за създаване на нова таблица и също така да заредим таблицата с първоначални данни за нашия тест за интеграция:

@Sql({"/employees_schema.sql", "/import_employees.sql"}) public class SpringBootInitialLoadIntegrationTest { @Autowired private EmployeeRepository employeeRepository; @Test public void testLoadDataForTestClass() { assertEquals(3, employeeRepository.findAll().size()); } }

Атрибутите на анотацията @Sql са:

  • config - локална конфигурация за SQL скриптове. Ние описваме това подробно в следващия раздел
  • ExecuPhase - можем също така да посочим кога да изпълняваме скриптовете, BEFORE_TEST_METHOD или AFTER_TEST_METHOD
  • оператори - можем да декларираме вградени SQL оператори за изпълнение
  • скриптове - можем да декларираме пътищата към SQL скрипт файловете за изпълнение. Това е псевдоним за атрибута стойност

В @Sql анотацията може да се използва на ниво клас или нивото на метод . Можем да заредим допълнителни данни, необходими за конкретен тестов случай, като анотираме този метод:

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

Можем да конфигурираме начина, по който анализираме и изпълняваме SQL скриптовете, като използваме анотацията @SqlConfig .

@SqlConfig може да бъде деклариран на ниво клас, където служи като глобална конфигурация. Или може да се използва за конфигуриране на конкретна @Sql анотация.

Нека да видим пример, в който определяме кодирането на нашите SQL скриптове, както и режима на транзакция за изпълнение на скриптовете:

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

И нека разгледаме различните атрибути на @SqlConfig :

  • blockCommentStartDelimiter - разделител за идентифициране на началото на коментари на блокове в SQL скрипт файлове
  • blockCommentEndDelimiter - разделител за означаване на края на коментарите на блокове в SQL скрипт файлове
  • commentPrefix - префикс за идентифициране на едноредови коментари в SQL скрипт файлове
  • dataSource - име на javax.sql.DataSource бин, срещу който ще се изпълняват скриптовете и изразите
  • encoding - кодиране на SQL скрипт файловете, по подразбиране е кодиране на платформа
  • errorMode - режим, който ще се използва, когато се срещне грешка при изпълнение на скриптовете
  • разделител - низ, използван за отделяне на отделни изрази, по подразбиране е „-“
  • actionManager - име на боб на PlatformTransactionManager, което ще се използва за транзакции
  • actionMode - режимът, който ще се използва при изпълнение на скриптове в транзакция

7. @SqlGroup

Java 8 and above allow the use of repeated annotations. This feature can be utilized for @Sql annotations as well. For Java 7 and below, there is a 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. Conclusion

In this quick article, we saw how we can leverage schema.sql and data.sql files for setting up an initial schema and populating it with data. We also saw how we can use @Sql, @SqlConfig, and @SqlGroup annotations to load test data for tests.

Имайте предвид, че този подход е по-подходящ за основни и прости сценарии, всяко разширено боравене с база данни ще изисква по-усъвършенствани и усъвършенствани инструменти като Liquibase или Flyway.

Кодови фрагменти, както винаги, можете да намерите в GitHub.