Разница между JDBC, JPA, Hibernate, Spring Data JPA

разница между jdbc, jpa, hibernate, spring data jpa

В этой статье я собираюсь объяснить разницу между 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, нужно с ним поработать. А для тех, кто уже знаком с этим функционалом я думаю объяснения будут излишне.

Для пущего эфекта я просто продемонстрирую сколько нужно кода чтобы достать список статтей из одной таблицы:

Это все чтобы просто выполнить один SELECT

JPA призвана устранить вышеперечисленные недостатки.

Спецификация Java Persistence API — это технология, которая позволяет удобно мапить объект Java и таблицу базы данных.

 В JDBC при написании каждого запроса, Вам необходимо указать в коде все детали, необходимые для операций CRUD, такие как имена таблиц, имена столбцов. В JPA (которая использует JDBC «под капотом») Вы также указываете эти данные, но уже только один раз, когда навешиваете аннотации на Java класс:

Аннотации JPA


Сама по себе спецификация 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, который был разработан изначально.

Кому интересно, я также записал видео на английском, в котором объясняю вышеописанное. Также, не забывайте подписываться на канал в ютубе и телеграмм:)

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: