JPA ou JDBC, em que são diferentes?

119

Estou aprendendo Java EE e baixei o eclipse com glassfish para o mesmo. Eu vi alguns exemplos e também li a documentação da Oracle para saber tudo sobre o Java EE 5. Conectar-se a um banco de dados foi muito simples. Abri um projeto web dinâmico, criei uma sessão EJB, usei o EntityManager e com os métodos get consegui acessar a tabela de dados armazenados.

Para meu próximo projeto, criei uma classe simples e, em seguida, acessei alguma tabela de banco de dados. O primeiro problema que encontrei foi que o atributo PersistenceUnit só seria reconhecido por EJB, Servlet etc, e não por uma simples classe java. Então, eu não poderia usar a forma EntityManager (ou posso?)

Pediram-me para usar o método "JDBC". O primeiro problema que encontrei foi conseguir a conexão com o banco de dados. Parece que tudo isso deve estar codificado. Eu tinha um persistence.xml com o qual poderia facilmente configurar a conexão do banco de dados. Até mesmo configurar um driver para o DB foi fácil. Além disso, não há métodos get / set no JDBC para acessar entidades de tabela.

Como posso entender JPA e persistência em relação a JDBC? O que foi pensado para JPA? Por que existem métodos set / get? Alguém pode lançar alguma luz sobre a essência desses dois e quais são os prós / contras sem "jargões" ?? Por favor, também sugira alguns links. Uma simples pesquisa no Google por diferenças de JPA e JDBC me levou a alguns sites cheios de "terminologia" que não consegui acompanhar :(

user907810
fonte
2
Por que não começar com o tutorial JDBC: docs.oracle.com/javase/tutorial/jdbc/index.html
a_horse_with_no_name
2
JPA pode ser usado sem EJB ou mesmo Java EE, você pode criar um EntityManagerFactory diretamente do Persistence.
James

Respostas:

237

Em termos leigos:

  • JDBC é um padrão para acesso ao banco de dados
  • JPA é um padrão para ORM

JDBC é um padrão para conectar a um DB diretamente e executar SQL contra ele - por exemplo SELECT * FROM USERS, etc. Os conjuntos de dados podem ser devolvidas que você pode segurar em seu aplicativo, e você pode fazer todas as coisas habituais, como INSERT, DELETE, procedimentos armazenados executados, etc. É uma das tecnologias subjacentes por trás da maioria do acesso ao banco de dados Java (incluindo provedores JPA).

Um dos problemas com aplicativos JDBC tradicionais é que muitas vezes você pode ter algum código de baixa qualidade, onde muitos mapeamentos entre conjuntos de dados e objetos ocorrem, a lógica é misturada com SQL, etc.

JPA é um padrão para Mapeamento Relacional de Objeto. Esta é uma tecnologia que permite mapear entre objetos em tabelas de código e de banco de dados. Isso pode "ocultar" o SQL do desenvolvedor, de modo que todos eles lidem com classes Java, e o provedor permite que você os salve e carregue magicamente. Principalmente, arquivos de mapeamento XML ou anotações em getters e setters podem ser usados ​​para informar ao provedor JPA quais campos em seu objeto mapeiam para quais campos no banco de dados. O provedor JPA mais famoso é o Hibernate , portanto, é um bom lugar para começar com exemplos concretos.

Outros exemplos incluem OpenJPA, toplink, etc.

Nos bastidores, o Hibernate e a maioria dos outros provedores de JPA escrevem SQL e usam JDBC para ler e gravar de e para o banco de dados.

Mark D
fonte
3
iBatis (hoje em dia MyBatis) não é uma implementação de JPA. Se você der uma olhada, verá que tem um conceito muito diferente.
Mikko Maunu
obrigado! Erro meu, pensei que implementava JPA, corrigido agora!
Mark D
3
Nem todos os provedores JPA escrevem SQL e usam JDBC ... já que eles podem persistir em um "tipo diferente de armazenamento de dados" (MongoDB, Neo4j, etc). DataNucleus JPA é um exemplo
DataNucleus
true DataNucleus .. existem até mesmo para excel, etc - as perguntas originais eram JDBC / JPA, então eu, certa ou erroneamente, presumi que ele estava interessado em armazenamentos relacionais.
Mark D
52

A principal diferença entre JPA e JDBC é o nível de abstração.

JDBC é um padrão de baixo nível para interação com bancos de dados. JPA é um padrão de nível superior para o mesmo propósito. O JPA permite que você use um modelo de objeto em seu aplicativo, o que pode tornar sua vida muito mais fácil. O JDBC permite que você faça mais coisas diretamente com o banco de dados, mas requer mais atenção. Algumas tarefas não podem ser resolvidas de forma eficiente usando JPA, mas podem ser resolvidas de forma mais eficiente com JDBC.

gkuzmin
fonte
20

JDBC é uma especificação de nível muito inferior (e mais antiga) do que JPA. Em seus fundamentos básicos, JDBC é uma API para interagir com um banco de dados usando SQL puro - enviando consultas e recuperando resultados. Não tem noção de objetos ou hierarquias. Ao usar JDBC, cabe a você traduzir um conjunto de resultados (essencialmente uma matriz de linha / coluna de valores de uma ou mais tabelas de banco de dados, retornada por sua consulta SQL) em objetos Java.

Agora, para entender e usar o JDBC, é essencial que você tenha algum conhecimento e compreensão prática de SQL. Com isso também vem uma visão necessária sobre o que é um banco de dados relacional, como você trabalha com ele e conceitos como tabelas, colunas, chaves e relacionamentos. A menos que você tenha pelo menos um conhecimento básico de bancos de dados, SQL e modelagem de dados, não será capaz de fazer muito uso de JDBC, pois na verdade é apenas uma abstração tênue em cima dessas coisas.

papa
fonte
10

JDBC é o predecessor do JPA.

JDBC é uma ponte entre o mundo Java e o mundo dos bancos de dados. Em JDBC, você precisa expor todos os detalhes sujos necessários para operações CRUD, como nomes de tabelas, nomes de colunas, enquanto em JPA (que está usando JDBC por baixo), você também especifica esses detalhes de metadados de banco de dados, mas com o uso de anotações Java.

Portanto, o JPA cria consultas de atualização para você e gerencia as entidades que você pesquisou ou criou / atualizou (ele também faz mais).

Se você quiser fazer JPA sem um contêiner Java EE, o Spring e suas bibliotecas podem ser usados ​​com as mesmas anotações Java.

Pawel Solarski
fonte
"sem um contêiner Java EE ??" Você quer dizer que o Spring e suas bibliotecas são independentes do contêiner da web?
Bruce Zu de
@BruceZu Claro que é. Você pode usar muitos dos componentes da estrutura Spring sem a necessidade de um contêiner da web. A injeção de dependência, por exemplo, não é algo que você precisa apenas em um contexto da web.
Dolfiz
1
@Dolfiz não são as bibliotecas da web da primavera um invólucro das bibliotecas Java Web e Java EE?
raikumardipak