JPAとJDBCの違いは何ですか?


119

私はJava EEを学習しています。同じためにGlassfishを使用してEclipseをダウンロードしました。Java EE 5のすべてを知るためにいくつかの例を見たり、Oracleのドキュメントを読んだりしました。データベースへの接続は非常に簡単でした。動的Webプロジェクトを開き、セッションEJBを作成し、EntityManagerを使用して、getメソッドを使用して、格納されたデータテーブルにアクセスできました。

次のプロジェクトでは、単純なクラスを作成し、DBテーブルにアクセスしました。私が遭遇した最初の問題は、PersistenceUnit属性がEJB、サーブレットなどによってのみ認識され、単純なJavaクラスでは認識されないことでした。それで、私はEntityManager方法を使用できませんでした(または私はできますか?)

「JDBC」の方法で行くように頼まれました。私が遭遇した最初の問題は、DBへの接続を取得することでした。これはすべてハードコーディングする必要があるようです。データベース接続を簡単に構成できるpersistence.xmlがありました。DB用のドライバーのセットアップも簡単でした。また、JDBCには、テーブルエンティティにアクセスするためのget / setメソッドはありません。

JDBCとの関係でJPAと永続性を理解するにはどうすればよいですか?JPAは何を考えていましたか?なぜset / getメソッドがあるのですか?誰かがこれら2つの本質に光を当てることはできますか?「専門用語」のない賛否両論は何ですか?リンクもいくつか提案してください。JPAとJDBCの違いをGoogleで簡単に検索したところ、フォローできない「用語」に満ちたサイトがいくつか見つかりました:(


2
JDBCチュートリアルから始めてみませんか:docs.oracle.com/javase/tutorial/jdbc/index.html
a_horse_with_no_name

2
JPAはEJBやJava EEなしで使用できます。永続性から直接EntityManagerFactoryを作成できます。
James

回答:


237

素人の言葉で:

  • JDBCはデータベースアクセスの標準です
  • JPAはORMの標準です

例えば- JDBCは、直接DBに接続し、それに対してSQLを実行するための規格でありSELECT * FROM USERS、データセットは、あなたのアプリで処理することができ、あなたがすべての通常の事を行うことができます返すことができるなどのようにINSERTDELETE実行ストアドプロシージャなどこれは、ほとんどのJavaデータベースアクセス(JPAプロバイダーを含む)の背後にある基盤技術の1つです。

従来のJDBCアプリの問題の1つは、データセットとオブジェクトの間で大量のマッピングが発生したり、ロジックがSQLと混合したりするなど、コードが不安定になることがよくあることです。

JPAはオブジェクトリレーショナルマッピングの標準です。これは、コード内のオブジェクトとデータベーステーブルをマッピングできるテクノロジーです。これにより、開発者からSQLを「隠す」ことができ、それらが扱うすべてがJavaクラスであり、プロバイダーはそれらを保存して魔法のようにロードすることができます。ほとんどの場合、XMLマッピングファイルまたはゲッターとセッターの注釈を使用して、JPAプロバイダーにオブジェクトのどのフィールドをDBのどのフィールドにマップするかを指示できます。最も有名なJPAプロバイダーはHibernateであるため、具体的な例を始めるのに最適な場所です。

その他の例には、OpenJPA、トップリンクなどがあります。

内部的には、JPAのHibernateおよびその他のほとんどのプロバイダーはSQLを書き込み、JDBCを使用してDBとの間で読み書きを行います。


3
iBatis(現在のMyBatis)はJPA実装ではありません。見てみると、コンセプトが全く違うことに気づくでしょう。
Mikko Maunu 2012

ありがとう!私の間違い、それはJPAを実装していると思いました、今修正されました!
Mark D

3
すべてのJPAプロバイダーがSQLを記述してJDBCを使用するわけではありません。「異なるタイプのデータストア」(MongoDB、Neo4jなど)まで持続する可能性があるためです。DataNucleus JPAはそのような例の1つです
DataNucleus 2012

真のDataNucleus .. Excel用のものさえあります-元の質問はJDBC / JPAだったので、彼がリレーショナルストアに興味があると私は正しくまたは間違って仮定しました。
マークD

52

JPAとJDBCの主な違いは、抽象化のレベルです。

JDBCは、データベースとの対話のための低レベルの標準です。JPAは、同じ目的のためのより高いレベルの標準です。JPAを使用すると、アプリケーションでオブジェクトモデルを使用できるようになり、作業がはるかに簡単になります。JDBCを使用すると、データベースを使用してより多くのことを直接実行できますが、注意が必要です。一部のタスクは、JPAを使用しても効率的に解決できませんが、JDBCを使用するとより効率的に解決できます。


20

JDBCは、JPAよりもはるかに低いレベル(および古いバージョン)の仕様です。必要不可欠なものであるJDBCは、純粋なSQLを使用してデータベースと対話するためのAPIであり、クエリを送信して結果を取得します。オブジェクトや階層の概念はありません。JDBCを使用する場合、結果セット(基本的には、SQLクエリによって返される1つ以上のデータベーステーブルからの値の行/列行列)をJavaオブジェクトに変換する必要があります。

ここで、JDBCを理解して使用するには、SQLの理解と実用的な知識が必要です。これにより、リレーショナルデータベースとは何か、どのように扱うか、テーブル、列、キー、リレーションシップなどの概念についても必要な洞察が得られます。データベース、SQL、およびデータモデリングの少なくとも基本的な理解がない限り、JDBCは実際にはこれらの上にある薄い抽象概念にすぎないため、JDBCをあまり活用できません。


10

JDBCはJPAの前身です。

JDBCは、Javaの世界とデータベースの世界の架け橋です。JDBCでは、テーブル名、列名など、CRUD操作に必要なすべてのダーティな詳細を公開する必要があります。一方、JPA(下でJDBCを使用)では、データベースメタデータの詳細も指定しますが、Javaアノテーションを使用します。

そのため、JPAは更新クエリを作成し、検索または作成/更新したエンティティを管理します(さらに多くのことを行います)。

Java EEコンテナなしでJPAを実行する場合は、Springとそのライブラリをまったく同じJavaアノテーションで使用できます。


「Java EEコンテナなし??」SpringとそのライブラリはWebコンテナから独立しているということですか?
Bruce Zu

@BruceZuもちろんです。Webコンテナーを必要とせずに、Springフレームワークコンポーネントの多くを使用できます。たとえば、依存性注入は、Webコンテキストでのみ必要なものではありません。
Dolfiz 2017年

1
@Dolfizは、Spring WebライブラリがJava WebおよびJava EEライブラリのラッパーではないのですか?
ライクマルディパック2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.