JPA или JDBC, чем они отличаются?

119

Я изучаю Java EE, и я загрузил затмение с помощью Glassfish для того же. Я видел несколько примеров, а также читал документацию Oracle, чтобы узнать все о Java EE 5. Подключиться к базе данных было очень просто. Я открыл динамический веб-проект, создал сеансовый EJB, использовал EntityManager и с помощью методов get мог получить доступ к сохраненной таблице данных.

Для моего следующего проекта мне пришлось создать простой класс, а затем получить доступ к некоторой таблице БД. Самая первая проблема, с которой я столкнулся, заключалась в том, что атрибут PersistenceUnit будет распознаваться только EJB, сервлетом и т. Д., А не простым классом java. Итак, я не мог использовать способ EntityManager (или могу?)

Меня попросили пойти по пути "JDBC". Самой первой проблемой, с которой я столкнулся, было подключение к БД. Похоже, все это надо жестко запрограммировать. У меня был файл persistence.xml, с помощью которого я мог легко настроить соединение с базой данных. Даже настроить драйвер для БД было несложно. Также в JDBC нет методов get / set для доступа к сущностям таблиц.

Как я понимаю JPA и постоянство по отношению к JDBC? Для чего была задумана JPA? Почему существуют методы set / get? Может кто-нибудь пролить свет на суть этих двух и какие плюсы / минусы без "жаргонов" ?? Пожалуйста, также предложите несколько ссылок. Простой поиск в Google различий между JPA и JDBC привел меня к некоторым сайтам, заполненным "терминологией", которой я не мог следовать :(

user907810
источник
2
Почему бы не начать с учебника по JDBC: docs.oracle.com/javase/tutorial/jdbc/index.html
a_horse_with_no_name
2
JPA можно использовать без EJB или даже без Java EE, вы можете создать EntityManagerFactory прямо из Persistence.
Джеймс

Ответы:

237

Проще говоря:

  • JDBC - это стандарт для доступа к базе данных
  • JPA - это стандарт ORM

JDBC является стандартом для подключения к БД непосредственно и работает SQL против него - например , SELECT * FROM USERSи т.д. наборы данных могут быть возвращены , которые вы можете обрабатывать в вашем приложении, и вы можете делать все обычные вещи , как INSERT, DELETE, запускать хранимые процедуры и т.д. Это одна из основных технологий, лежащих в основе доступа к базам данных Java (включая поставщиков JPA).

Одна из проблем с традиционными приложениями JDBC заключается в том, что у вас часто может быть какой-то дрянной код, в котором происходит множество сопоставлений между наборами данных и объектами, логика смешивается с SQL и т. Д.

JPA - это стандарт объектно-реляционного сопоставления. Это технология, которая позволяет отображать объекты в коде и таблицы базы данных. Это может «скрыть» SQL от разработчика, так что все, с чем они имеют дело, - это классы Java, а провайдер позволяет вам сохранять и загружать их волшебным образом. В основном файлы сопоставления XML или аннотации к получателям и сеттерам могут использоваться, чтобы сообщить провайдеру JPA, какие поля на вашей карте объектов и каким полям в БД. Самый известный поставщик JPA - это Hibernate , так что это хорошее место для начала работы с конкретными примерами.

Другие примеры включают OpenJPA, toplink и т. Д.

Под капотом Hibernate и большинство других провайдеров JPA пишут SQL и используют JDBC для чтения и записи из БД и в нее.

Марк D
источник
3
iBatis (ныне MyBatis) не является реализацией JPA. Если вы посмотрите на него, вы заметите, что у него совсем другая концепция.
Микко Мауну,
Спасибо! Моя ошибка, я думал, что это реализовано JPA, исправлена ​​сейчас!
Mark D
3
Не все провайдеры JPA пишут SQL и используют JDBC ... поскольку они могут сохраняться в хранилище данных «другого типа» (MongoDB, Neo4j и т. Д.). DataNucleus JPA - один из таких примеров
DataNucleus
true DataNucleus ... есть даже вопросы для excel и т. д. - исходный вопрос был JDBC / JPA, поэтому я правильно или ошибочно предположил, что его интересовали реляционные хранилища.
Mark D
52

Основное различие между JPA и JDBC - уровень абстракции.

JDBC - это стандарт низкого уровня для взаимодействия с базами данных. JPA - это стандарт более высокого уровня для той же цели. JPA позволяет вам использовать объектную модель в вашем приложении, что может значительно облегчить вашу жизнь. JDBC позволяет делать больше вещей напрямую с базой данных, но требует большего внимания. Некоторые задачи не могут быть эффективно решены с помощью JPA, но могут быть решены более эффективно с помощью JDBC.

gkuzmin
источник
20

JDBC - это спецификация гораздо более низкого уровня (и более старая), чем JPA. По сути, JDBC - это API для взаимодействия с базой данных с использованием чистого SQL - отправки запросов и получения результатов. Он не имеет понятия об объектах или иерархиях. При использовании JDBC вы должны преобразовать набор результатов (по сути, матрицу строк / столбцов значений из одной или нескольких таблиц базы данных, возвращенных вашим запросом SQL) в объекты Java.

Теперь, чтобы понять и использовать JDBC, важно иметь некоторое понимание и практические знания SQL. С этим также приходит необходимое понимание того, что такое реляционная база данных, как вы работаете с ней и такие концепции, как таблицы, столбцы, ключи и отношения. Если у вас нет хотя бы базового понимания баз данных, SQL и моделирования данных, вы не сможете широко использовать JDBC, поскольку на самом деле это лишь тонкая абстракция поверх всего этого.

кашка
источник
10

JDBC является предшественником JPA.

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

Таким образом, JPA создает для вас запросы на обновление и управляет объектами, которые вы искали или создавали / обновляли (он также делает больше).

Если вы хотите создать JPA без контейнера Java EE, то Spring и его библиотеки можно использовать с теми же аннотациями Java.

Павел Соларски
источник
"без контейнера Java EE ??" Вы имеете в виду, что Spring и его библиотеки не зависят от веб-контейнера?
Брюс Зу,
@BruceZu Конечно, это так. Вы можете использовать многие компоненты фреймворка Spring без веб-контейнера. Например, внедрение зависимостей - это не то, что вам нужно только в веб-контексте.
Dolfiz
1
@Dolfiz - разве веб-библиотеки Spring не являются оболочкой для библиотек Java Web и Java EE?
raikumardipak 05