JPA atau JDBC, apa bedanya?

119

Saya belajar Java EE dan saya mengunduh gerhana dengan glassfish untuk hal yang sama. Saya melihat beberapa contoh dan juga membaca dokumen Oracle untuk mengetahui semua tentang Java EE 5. Menghubungkan ke database sangat sederhana. Saya membuka proyek web dinamis, membuat sesi EJB, saya menggunakan EntityManager dan dengan metode get dapat mengakses tabel data yang disimpan.

Untuk proyek saya berikutnya, saya telah membuat kelas sederhana dan kemudian mengakses beberapa tabel DB. Masalah pertama yang saya temui adalah bahwa atribut PersistenceUnit hanya akan dikenali oleh EJB, Servlet dll dan bukan kelas java sederhana. Jadi saya tidak bisa menggunakan cara EntityManager (atau bisakah saya?)

Saya diminta untuk melalui cara "JDBC". Masalah pertama yang saya temui adalah mendapatkan koneksi ke DB. Sepertinya semua ini harus di-hardcode. Saya memiliki persistence.xml yang dengannya saya dapat dengan mudah mengkonfigurasi koneksi basis data. Bahkan menyiapkan driver untuk DB itu mudah. Juga tidak ada metode get / set di JDBC untuk mengakses entitas tabel.

Bagaimana saya memahami JPA dan ketekunan dalam kaitannya dengan JDBC? Untuk apa JPA dipikirkan? Mengapa ada metode set / get? Bisakah seseorang menjelaskan esensi dari keduanya dan apa pro / kontra tanpa "jargon" ?? Harap juga sarankan beberapa tautan. Pencarian Google sederhana untuk perbedaan JPA dan JDBC membawa saya ke beberapa situs yang penuh dengan "terminologi" yang tidak dapat saya ikuti :(

pengguna907810
sumber
2
Mengapa tidak memulai dengan tutorial JDBC: docs.oracle.com/javase/tutorial/jdbc/index.html
a_horse_with_no_name
2
JPA dapat digunakan tanpa EJB atau bahkan Java EE, Anda dapat membuat EntityManagerFactory langsung dari Persistence.
Yakobus

Jawaban:

237

Dalam istilah awam:

  • JDBC adalah standar untuk Akses Database
  • JPA adalah standar untuk ORM

JDBC adalah standar untuk menghubungkan ke DB langsung dan menjalankan SQL terhadap hal itu - misalnya SELECT * FROM USERS, dll data set dapat dikembalikan yang dapat Anda menangani di aplikasi Anda, dan Anda dapat melakukan semua hal yang biasa seperti INSERT, DELETE, menjalankan prosedur yang tersimpan, dll Ini adalah salah satu teknologi yang mendasari di balik sebagian besar akses database Java (termasuk penyedia JPA).

Salah satu masalah dengan aplikasi JDBC tradisional adalah Anda sering dapat memiliki beberapa kode jelek di mana banyak pemetaan antara kumpulan data dan objek terjadi, logika bercampur dengan SQL, dll.

JPA adalah standar untuk Pemetaan Relasional Objek. Ini adalah teknologi yang memungkinkan Anda untuk memetakan antara objek dalam kode dan tabel database. Ini dapat "menyembunyikan" SQL dari pengembang sehingga yang mereka tangani hanyalah kelas-kelas Java, dan penyedia memungkinkan Anda untuk menyimpannya dan memuatnya secara ajaib. Sebagian besar, file pemetaan XML atau anotasi pada getter dan setter dapat digunakan untuk memberi tahu penyedia JPA bidang mana pada peta objek Anda ke bidang mana di DB. Penyedia JPA paling terkenal adalah Hibernate , jadi ini adalah tempat yang baik untuk memulai dengan contoh konkret.

Contoh lain termasuk OpenJPA, toplink, dll.

Di bawah tenda, Hibernate dan sebagian besar penyedia JPA lainnya menulis SQL dan menggunakan JDBC untuk membaca dan menulis dari dan ke DB.

Mark D
sumber
3
iBatis (sekarang MyBatis) bukan merupakan implementasi JPA. Jika Anda melihatnya, Anda akan melihat bahwa itu memang memiliki konsep yang sangat berbeda.
Mikko Maunu
Terima kasih! Kesalahan saya, saya pikir itu menerapkan JPA, diperbaiki sekarang!
Mark D
3
Tidak semua penyedia JPA menulis SQL dan menggunakan JDBC ... karena mereka mungkin tetap menggunakan "tipe datastore yang berbeda" (MongoDB, Neo4j, dll). DataNucleus JPA adalah salah satu contohnya
DataNucleus
true DataNucleus .. bahkan ada yang untuk excel, dll - pertanyaan aslinya adalah JDBC / JPA jadi saya benar atau salah berasumsi dia tertarik pada toko relasional.
Mark D
52

Perbedaan utama antara JPA dan JDBC adalah tingkat abstraksi.

JDBC adalah standar tingkat rendah untuk interaksi dengan database. JPA adalah standar tingkat yang lebih tinggi untuk tujuan yang sama. JPA memungkinkan Anda untuk menggunakan model objek dalam aplikasi Anda yang dapat membuat hidup Anda lebih mudah. JDBC memungkinkan Anda melakukan lebih banyak hal dengan Basis data secara langsung, tetapi JDBC membutuhkan lebih banyak perhatian. Beberapa tugas tidak dapat diselesaikan secara efisien menggunakan JPA, tetapi dapat diselesaikan dengan lebih efisien dengan JDBC.

gkuzmin.dll
sumber
20

JDBC adalah spesifikasi tingkat yang jauh lebih rendah (dan lebih tua) daripada JPA. Pada dasarnya, JDBC adalah API untuk berinteraksi dengan database menggunakan SQL murni - mengirimkan kueri dan mengambil hasil. Itu tidak memiliki gagasan tentang objek atau hierarki. Saat menggunakan JDBC, terserah Anda untuk menerjemahkan kumpulan hasil (pada dasarnya matriks baris / kolom nilai dari satu atau beberapa tabel database, yang dikembalikan oleh kueri SQL Anda) ke dalam objek Java.

Sekarang, untuk memahami dan menggunakan JDBC, penting bagi Anda untuk memiliki pemahaman dan pengetahuan tentang SQL. Dengan itu juga muncul wawasan yang diperlukan tentang apa itu database relasional, bagaimana Anda bekerja dengannya dan konsep seperti tabel, kolom, kunci dan hubungan. Kecuali jika Anda memiliki setidaknya pemahaman dasar tentang database, SQL dan pemodelan data, Anda tidak akan dapat menggunakan JDBC karena ini hanyalah abstraksi tipis di atas hal-hal ini.

pap
sumber
10

JDBC adalah pendahulu JPA.

JDBC adalah jembatan antara dunia Java dan dunia database. Di JDBC Anda perlu mengekspos semua detail kotor yang diperlukan untuk operasi CRUD, seperti nama tabel, nama kolom, sementara di JPA (yang menggunakan JDBC di bawahnya), Anda juga menentukan detail metadata database tersebut, tetapi dengan menggunakan anotasi Java.

Jadi JPA membuat kueri pembaruan untuk Anda dan mengelola entitas yang Anda cari atau buat / perbarui (juga berfungsi lebih baik).

Jika Anda ingin melakukan JPA tanpa container Java EE, Spring dan library-nya dapat digunakan dengan anotasi Java yang sama.

Pawel Solarski
sumber
"tanpa wadah Java EE ??" Apakah maksud Anda Spring dan perpustakaannya tidak bergantung pada wadah web?
Bruce Zu
@BruceZu Tentu saja. Anda dapat menggunakan banyak komponen framework Spring tanpa memerlukan container web. Injeksi ketergantungan, misalnya, bukanlah sesuatu yang Anda butuhkan hanya dalam konteks web.
Dolfiz
1
@ Dolfiz bukankah pustaka web musim semi merupakan pembungkus dari pustaka Java Web dan Java EE?
raikumardipak