Подключение базы данных
Статьи в памяти пропадают при каждом перезапуске. Пора хранить их в базе данных. В учебнике вы работали с базой через JDBC: писали SQL, читали ResultSet, закрывали соединения. В Spring Boot большую часть этого делают за вас три технологии, которые работают вместе.
Кто есть кто
| Название | Что это |
|---|---|
| JPA (Jakarta Persistence) | Стандарт: аннотации и правила, как связать класс Java с таблицей |
| Hibernate | Библиотека, которая реализует JPA и сама пишет SQL |
| Spring Data JPA | Надстройка Spring: репозитории без реализации, запросы по имени метода |
Вы описываете класс-сущность и интерфейс-репозиторий, а Hibernate превращает вызовы методов в SQL-запросы.
Зависимости
Добавьте в pom.xml три блока (на start.spring.io: Spring Data JPA и H2 Database):
<!-- pom.xml -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-h2console</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>H2 — база данных, написанная на Java. Ей не нужен отдельный сервер: она хранит данные в файле внутри проекта. Для разработки это удобно. Модуль spring-boot-h2console добавляет веб-консоль для просмотра таблиц.
Настройки
# src/main/resources/application.yaml
spring:
datasource:
url: jdbc:h2:file:./data/blog
jpa:
hibernate:
ddl-auto: update
show-sql: true
open-in-view: false
h2:
console:
enabled: true| Настройка | Что делает |
|---|---|
datasource.url | Адрес базы: файл data/blog.mv.db в папке проекта |
ddl-auto: update | Hibernate сам создаёт и дополняет таблицы по сущностям |
show-sql: true | Печатает в журнал каждый SQL-запрос |
open-in-view: false | Закрывает доступ к базе после выхода из сервиса — так ошибки видны сразу |
h2.console.enabled | Включает консоль H2 |
Режим ddl-auto: update нужен только на первых порах — в уроке о миграциях заменим его на Flyway. Добавьте папку data/ в .gitignore, чтобы файл базы не попал в Git.
Запуск
В журнале появятся строки о базе (сокращены):
INFO ... HHH000001: Hibernate ORM core version 7.4.5.Final
INFO ... HikariPool-1 - Added connection conn0: url=jdbc:h2:file:./data/blog user=
INFO ... H2 console available at '/h2-console'. Database available at 'jdbc:h2:file:./data/blog'HikariCP — пул соединений: он держит несколько открытых соединений с базой и раздаёт их запросам. Откройте http://localhost:8080/h2-console, в поле JDBC URL введите jdbc:h2:file:./data/blog, поле User Name оставьте пустым и нажмите Connect — откроется консоль с таблицами.
PostgreSQL вместо H2
На сервере обычно работает PostgreSQL. Для него нужен драйвер:
<!-- pom.xml -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>и другие настройки подключения:
# src/main/resources/application-prod.yaml
spring:
datasource:
url: jdbc:postgresql://localhost:5432/blog
username: blog
password: changemeКод сущностей и репозиториев менять не придётся — Hibernate сам подстроит SQL под нужную базу. Настоящий пароль в файл не пишут, об этом — в главе о выкладке.
Частая ошибка
Файловую базу H2 может открыть только одна программа. Если приложение уже запущено, а вы подключаетесь к тому же файлу из другой программы или запускаете вторую копию, получите:
Database may be already in use: ".../data/blog.mv.db". Possible solutions: close all other connection(s); use the server mode [90020-240]Остановите лишний процесс. Пока приложение работает, смотрите базу через его собственную консоль /h2-console.