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 для конфигурации базы данных приложения, добавив соответствующие свойства в файл application.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. Спящий режим и 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 .