«1. Обзор
В этом руководстве мы рассмотрим использование H2 с Spring Boot. Как и в случае с другими базами данных, в экосистеме Spring Boot имеется полная встроенная поддержка.
2. Зависимости
Начнем с зависимостей h2 и spring-boot-starter-data-jpa:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
3. Конфигурация базы данных
По умолчанию Spring Boot настраивает приложение для подключения к хранилище в памяти с именем пользователя sa и пустым паролем.
Однако мы можем изменить эти параметры, добавив следующие свойства в файл application.properties:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
Кроме того, мы также можем использовать YAML для конфигурации базы данных приложения, добавив соответствующие свойства в приложение. Файл .yaml:
spring:
datasource:
url: jdbc:h2:mem:mydb
username: sa
password: password
driverClassName: org.h2.Driver
jpa:
spring.jpa.database-platform: org.hibernate.dialect.H2Dialect
База данных в оперативной памяти является энергозависимой и приводит к потере данных после перезапуска приложения.
Мы можем изменить это поведение, используя файловое хранилище. Для этого нам нужно обновить свойство spring.datasource.url:
spring.datasource.url=jdbc:h2:file:/data/demo
Аналогично, в application.yaml мы можем добавить такое же свойство для файлового хранилища:
spring:
datasource:
url: jdbc:h2:file:/data/demo
База данных также может работать в других режимах.
4. Операции с базой данных
Выполнение операций CRUD с H2 в Spring Boot такое же, как и с другими базами данных SQL, и наши руководства из серии Spring Persistence хорошо освещают это.
4.1. Инициализация источника данных
Мы можем использовать базовые сценарии SQL для инициализации базы данных. Чтобы продемонстрировать это, давайте добавим файл data.sql в каталог src/main/resources:
INSERT INTO countries (id, name) VALUES (1, 'USA');
INSERT INTO countries (id, name) VALUES (2, 'France');
INSERT INTO countries (id, name) VALUES (3, 'Brazil');
INSERT INTO countries (id, name) VALUES (4, 'Italy');
INSERT INTO countries (id, name) VALUES (5, 'Canada');
Здесь скрипт заполняет таблицу стран в нашей схеме некоторыми примерами данных.
Spring Boot автоматически подберет этот файл и запустит его во встроенной базе данных в памяти, такой как наш настроенный экземпляр H2. Это хороший способ заполнить базу данных для целей тестирования или инициализации.
Мы можем отключить это поведение по умолчанию, установив для свойства spring.sql.init.mode значение never. Кроме того, можно настроить несколько файлов SQL для загрузки исходных данных.
Наша статья о загрузке исходных данных более подробно раскрывает эту тему.
4.2. Hibernate и data.sql
По умолчанию сценарий data.sql выполняется перед инициализацией Hibernate. Это согласовывает инициализацию на основе сценариев с другими инструментами миграции баз данных, такими как Flyway и Liquibase. Поскольку мы каждый раз воссоздаем схему, сгенерированную Hibernate, нам нужно установить дополнительное свойство:
spring.jpa.defer-datasource-initialization=true
Это изменяет поведение Spring Boot по умолчанию и заполняет данные после того, как схема сгенерирована Hibernate. Кроме того, мы также можем использовать сценарий schema.sql для создания схемы, сгенерированной Hibernate, до заполнения с помощью data.sql. Однако такое смешение различных механизмов генерации схем не рекомендуется.
5. Доступ к консоли H2
База данных H2 имеет встроенную консоль с графическим интерфейсом для просмотра содержимого базы данных и выполнения SQL-запросов. По умолчанию консоль H2 не включена в Spring.
Чтобы включить его, нам нужно добавить следующее свойство в application.properties:
spring.h2.console.enabled=true
Если мы используем конфигурацию YAML, нам нужно добавить свойство в application.yaml:
spring:
h2:
console.enabled: true
Затем, после запуска приложения, мы можем перейти по адресу http://localhost:8080/h2-console, который предоставит нам страницу входа.
На странице входа мы предоставим те же учетные данные, которые мы использовали в application.properties:
После подключения мы увидим обширную веб-страницу со списком всех таблиц в левой части страницы. и текстовое поле для запуска SQL-запросов:
Веб-консоль имеет функцию автозаполнения, которая предлагает ключевые слова SQL. Тот факт, что консоль невелика, делает ее удобной для визуального осмотра базы данных или непосредственного выполнения необработанного SQL.
Кроме того, мы можем дополнительно настроить консоль, указав следующие свойства в application.properties проекта с нужными нам значениями:
spring.h2.console.path=/h2-console
spring.h2.console.settings.trace=false
spring.h2.console.settings.web-allow-others=false
Аналогично, при использовании конфигурации YAML мы можем добавить указанные выше свойства как: ~~ ~
spring:
h2:
console.path: /h2-console
console.settings.trace: false
spring.h2.console.settings.web-allow-others: false
«В приведенных выше фрагментах мы указываем путь к консоли как /h2-console, что соответствует адресу и порту нашего работающего приложения. Поэтому, если наше приложение запущено по адресу http://localhost:9001, консоль будет доступна по адресу http://localhost:9001/h2-console.
Кроме того, мы устанавливаем для spring.h2.console.settings.trace значение false, чтобы предотвратить вывод трассировки, и мы также можем отключить удаленный доступ, установив для spring.h2.console.settings.web-allow-others значение false.
6. Заключение
База данных H2 полностью совместима с Spring Boot. Мы увидели, как его настроить и как использовать консоль H2 для управления нашей работающей базой данных.
Полный исходный код доступен на GitHub.