Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Подключение базы данных

Статьи в памяти пропадают при каждом перезапуске. Пора хранить их в базе данных. В учебнике вы работали с базой через 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: updateHibernate сам создаёт и дополняет таблицы по сущностям
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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.