В этой статье я собираюсь объяснить разницу между JDBC, JPA, Hibernate, Spring Data Jpa.
После общения со многими своими студентами на курсах и менторской программе, я обнаружил, что даже самые опытные из учеников не до конца понимают разницу между инструментами для подключения Java приложения к базе данных.
Вот используем мы например любимый мною Spring Boot фреймворк и его библиотеку Data Jpa, и студент не может понять – нужно ли ему подключать зависимости для Hibernate. Подключать ли зависимости для JDBC если мы используем Hibernate? Сегодня попытаюсь собрать все воедино и наконец-то положить конец путаницам с библиотеками и инструментами для баз данных и Java.
Большинство программ Java используют реляционные базы данных (MySQL, PostgreSQL) для хранения данных для дальнейшей обработки. Это обычный факт. Особенно если речь идет о веб приложениях, которые имеют очень широкий спектр взаимодействия с пользователем.
Подключение базы данных к Java приложению процесс непростой. Нужно учесть пул соединений, уровень доступа к данным, правильный маппинг таблицы базы данных и Java объекта.
К счастью, уже имеются серьезные наработки в виде библиотек и фреймворков, которые программисты могут использовать, чтобы упростить себе работу с вышеперечисленными задачами.
В этой статье я постараюсь раскрыть только разницу между JDBC, JPA, Hibernate, Spring Data JPA в рамках выполнения запросов через Java, без учета пулов соединений и других нюансов.
Самый первый способ подключить джава приложение к базе данных – это использование JDBC (Java Database Connectivity).
Sun Microsystems выпустила JDBC как часть JDK в феврале 1997 года. Классы JDBC содержатся в пакетах java.sql и javax.sql для подключения и управления данными в базах данных.
Более подробно функционал JDBC мы рассмотрели когда писали простое веб приложение на Java, в статье:Работа с базой данных MySql в Java
Можно сказать, что JDBC – это мост между миром Java и миром баз данных. Ведь первое, что мы ищем когда хотим подключить базу данных к нашему приложению – jdbc драйвер. Если мы работаем с Maven, тогда мы ищем зависимость для драйвера к определенной базе.
Одним из недостатков JDBC является то, что код, который получается в конце – выглядит очень большим по объему (хотя работы он выполняет не много). Также, очень сложно приходится, когда объект джава который мы пытаемся сохранить в базе или достать – достаточно большой. Нужно правильно замапить поля базы данных и поля класса Java. Бывает такое, что в процессе работы нужно добавить поле к готовой таблице в базе. И потом нужно находить все запросы в базу в коде приложения чтобы добавить это поле. Чтобы прочувствовать всю “боль” работы с JDBC, нужно с ним поработать. А для тех, кто уже знаком с этим функционалом я думаю объяснения будут излишне.
Для пущего эфекта я просто продемонстрирую сколько нужно кода чтобы достать список статтей из одной таблицы:

JPA призвана устранить вышеперечисленные недостатки.
Спецификация Java Persistence API – это технология, которая позволяет удобно мапить объект Java и таблицу базы данных.
В JDBC при написании каждого запроса, Вам необходимо указать в коде все детали, необходимые для операций CRUD, такие как имена таблиц, имена столбцов. В JPA (которая использует JDBC “под капотом”) Вы также указываете эти данные, но уже только один раз, когда навешиваете аннотации на Java класс:

Сама по себе спецификация JPA не является инструментом или фреймворком; скорее, она определяет набор концепций, которые могут и должны быть реализованы любым другим инструментом.
Так как JPA – это просто спецификация, Вам нужен инструмент для ее реализации. Этим инструментом может быть Hibernate, TopLink, iBatis и т. д.
Так как Hibernate самый популярный ORM (Object Relational Mapping) фреймворк для работы с базой данных, я оставил свой выбор на нем. Но то же самое касается и других библиотек ORM о которых Вы скорее всего даже не слышали.
Вы можете рассматривать JPA как интерфейс, а Hibernate – как реализацию. Без Hibernate, от JPA в Вашем коде будет мало полезности. Хотя как Hibernate так и JPA можно использовать по отдельности в связке с другими инструментами.
Более подробно о Hibernate иJPA мы говорили в статье: Что такое hibernate.
Что насчет Spring Data Jpa?
Эта библиотека является частью Spring Framework – одного из самых популярных Java фреймворков на сегодняшний день.
Цель Spring Data – уменьшить объем стандартного кода, необходимого для реализации уровней доступа к данным для различных баз данных.
Spring Data JPA – это библиотека, которая добавляет дополнительный уровень абстракции поверх ORM реализации JPA. По умолчанию Spring Data JPA использует Hibernate, в качестве ORM провайдера (чтобы выполнять запросы). Это, кстати, можно изменить используя настройки Spring. Хотя делать это неопытным пользователям я бы не советовал.
Если Вы используете Spring Boot вместе с Spring Data JPA, то имеете все необходимые настройки подключения Java приложения к базе данных “из коробки”. Единственное, что нужно указать – это хост для Вашей базы данных, имя пользователя и пароль для доступа к ней. Spring Boot обеспечивает автоматическую настройку для всего подключения к базе. В том числе и пул соединений.
Более подробно с вышеописанной библиотекой мы познакомились статье: Spring Boot — пример с Postgres и JPA
Как видите, со временем, JDBC которую зарелизили в 1997 году обросла слоями абстракций, которые позволяют программистам сосредоточиться на том, чтобы решить проблему бизнеса вместо того, чтобы тратить свое время на написание кучи конфигурационных классов настроек к базе данных.
Сейчас у Вас есть возможность подключить любое хранилище данных (не только реляционную базу) в пару кликов, без необходимости включать “танцы с бубном”, как это делалось раньше.
В каком-то роде, мы платим тем, что SQL запросы должны будут пройти через множество слоев прежде чем достигнут самой базы. Но по своему опыту могу сказать, что в большинстве случаев падение скорости выполнения запросов не наблюдается если использовать JDBC или Spring Data JPA. Нужно только быть внимательным со сложными и большими запросами.

Для новичков, я советую попробовать сначала JDBC. Чтобы можно было сравнить потом с Hibernate и Spring. Разница будет реально ощутима. При этом Вы будете знать как все фреймворки примерно работают под капотом. Так как все они основаны на JDBC, который был разработан изначально.
Кому интересно, я также записал видео на английском, в котором объясняю вышеописанное. Также, не забывайте подписываться на канал в ютубе и телеграмм:)
Отлично все расписано. Наконец-то понял разницу. Спасибо!
Отличная статья!
Спасибо, помогла разобраться.