Java: Веб-технологии
Теория: Работа с базой данных в Javalin
Репозитории, которыми мы пользовались в уроках этого курса, хранят свои данные в обычных переменных. Это было удобно для того, чтобы не отвлекаться на взаимодействие с базой и сфокусироваться на особенностях работы веба.
Теперь мы привыкли к фреймворку и понимаем принципы создания приложений на нем, поэтому можно начинать работу с реальной базой данных.
Чтобы начать хранить и извлекать данные из базы, нам нужно выполнить несколько действий:
- Подключить пакеты, необходимые для работы с базой данных
- Настроить подключение к базе данных и дать к нему доступ из приложения
- Создать начальную структуру базы данных с нужными таблицами
- Переписать методы репозиториев так, чтобы они работали с данными через базу
В этом уроке мы проделаем все эти шаги на примере создания части CRUD для сущности Car с полями make (марка) и model (модель).
Устанавливаем зависимости
Для простоты мы будем использовать базу данных H2 с хранением в памяти. Этого достаточно в обучении, но в реальном окружении уже понадобится поставить PostgreSQL или его аналог:
В дополнение к самой базе данных, нам понадобится пакет HikariCP. Он предоставляет пул соединений для работы в конкурентной среде, когда множество клиентов выполняют запросы одновременно. В такой ситуации одного соединения с базой данных будет недостаточно. Ниже мы увидим, как это работает.
Настраиваем подключение
Рассмотрим такой пример:
В примере выше мы создаем базу данных H2 с именем hexlet_project и расположением в памяти. После создания базы данных мы получаем переменную dataSource, через которую мы будем работать с базой. Доступ к ней нам будет нужен в репозиториях, потому что запросы должны быть сосредоточенны в них.
Поэтому нам нужно создать общий базовый класс для всех репозиториев со статическим полем для хранения этой переменой. Все остальные репозитории от него наследуются:
Строим начальную структуру базы данных
В нашем случае база данных создается при старте приложения, поэтому ее инициализацию мы будем делать там же, во время старта. Для этого создадим файл с нужной схемой данных и затем добавим ее в базу данных:
-
Добавляем файл src/main/resources/schema.sql:
-
Во время инициализации базы данных загружаем схему в базу:
Создаем репозиторий CarRepository
Перейдем к созданию репозитория:
Принцип создания всех методов для работы с базой данных одинаковый:
- Описываем шаблон запроса
- Получаем соединение
- Формируем стейтмент
- Делаем подстановки
- Выполняем запрос
- Собираем результат
- Возвращаем ответ
Рассматриваем примеры операций
Структура контроллеров не меняется, несмотря на все изменения, которые мы сделали. Как видно на примере ниже, правильная организация абстракций и разделение по слоям приводят к тому, что изменение внутренностей не оказывает особого влияния на строение приложения:



