От JDBC до Spring Data: часть 1



Общение с базой данных связано с огромным количеством технологий — навскидку вспоминаем JDBC, JPA, Hibernate и Spring Data. Они тесно переплетены, и не всегда люди чётко понимают, что есть что и зачем нужно.



В ближайших постах разложу по полочкам основные технологии по работе с данными.



Почему всё так сложно? Почему нельзя сохранить всё как есть?



Приложение использует оперативную память и представляет данные в виде объектов. Можно работать с любым объектом в любой момент — чтение и запись происходят быстро. Минус оперативки — когда приложение завершается, память освобождается, и данные пропадают.



Чтобы данные пережили приложение, они записываются в постоянную память. Хранением и организацией данных занимается БД.



В оперативке данные лежат кое-как — где место нашлось, там объект и создаётся. В постоянной памяти данных много, всё упорядочено и оптимизировано. Поэтому модели данных в БД и приложении иногда отличаются.



А ещё БД — это отдельное приложение. В итоге для сохранения/извлечения данных нужна куча дополнительной работы:

🔸 открыть соединение

🔸 составить SQL запрос

🔸 передать в запросе данные из приложения

🔸 преобразовать ответ БД в java объект

🔸 закрыть соединение



JDBC



— стандартные java методы, которые выполняют все пункты выше. Все инструменты по работе с БД под капотом используют как раз JDBC.



Работа с соединениями и преобразование данных — утомительная работа. Поэтому и появляются библиотеки, облегчающие этот труд.



Spring JDBC



берёт на себя работу с соединениями. Разработчик всё так же составляет запросы, передаёт параметры и преобразует ответы в java объекты.



ORM



Object Relational Mapping — преобразование данных (mapping) из java объектов в сущности БД и обратно.



Формально, ORM — просто название процесса. В случае JDBC весь ОRМ разработчик делает вручную.



На практике под ORM подразумевают ORM библиотеку/фреймворк — какой-нибудь инструмент, который берёт на себя часть работы по запросам и преобразованию данных.



Hibernate



— самая популярная ORM библиотека. Составляет простые SQL запросы и преобразует данные. Упростил жизнь многим и заслужил их любовь❤️



В хибернейте не всё идеально:

▪️ Работа с соединениями (сессиями) остаётся на пользователе

▪️ Для корректной работы надо знать внутрянку (dirty session, как разруливаются отношения и тд).



Сложно не признать, что Hibernate великолепен. Ворвался на олимп ORM библиотек в 2001 году и до сих пор оттуда не слезает🏆



JPA



Сейчас большинство приложений базируются на спринге, но 10-15 лет назад приложения часто опирались на Java ЕЕ. В те года ORM Java ЕЕ выглядел сложно — для каждой сущности требовались несколько классов и кучка интерфейсов.



Hibernate выглядел привлекательно, но нельзя просто взять и добавить библиотеку в проект. Во вселенной Java EE всё работает через спецификации — стандартные интерфейсы.



Поэтому появилась новая спека по ORM — Java Persistence API или JPA. С небольшими отличиями почти полностью списана с хибернейта. Вскоре Hibernate подстроился под JPA и стал использоваться в Java EE.



Итого



⭐️ JDBC — базовое API по работе с БД

⭐️ ORM — преобразование данных между приложением и БД. На практике под “у нас на проекте ORM” имеют в виду, что используется ORM библиотека, например, Hibernate

⭐️ JPA — спецификация по ORM. Набор интерфейсов, аннотаций и описание, как всё должно работать. Не включает в себя конкретную реализацию

⭐️ Hibernate — популярная ORM библиотека, реализующая JPA



В следующем посте распишу вариации Spring Data, и почему материалы по хибернейт могут не соответствовать реальности.