JPA hay JDBC, chúng khác nhau như thế nào?


119

Tôi đang học Java EE và tôi đã tải xuống nhật thực với cá thủy tinh cho cùng một. Tôi đã xem một số ví dụ và cũng đọc tài liệu Oracle để biết tất cả về Java EE 5. Kết nối với cơ sở dữ liệu rất đơn giản. Tôi đã mở một dự án web động, tạo một phiên EJB, tôi sử dụng EntityManager và với các phương thức get có thể truy cập vào bảng dữ liệu được lưu trữ.

Đối với dự án tiếp theo của tôi, tôi đã tạo một lớp đơn giản và sau đó truy cập một số bảng DB. Vấn đề đầu tiên tôi gặp phải là thuộc tính PersistenceUnit sẽ chỉ được nhận dạng bởi EJB, Servlet, v.v. chứ không phải là một lớp java đơn giản. Vì vậy, sau đó tôi không thể sử dụng cách EntityManager (hoặc tôi có thể?)

Tôi đã được yêu cầu sử dụng "JDBC". Vấn đề đầu tiên tôi gặp phải là nhận được kết nối với DB. Có vẻ như tất cả điều này phải được mã hóa cứng. Tôi đã có một Persence.xml mà tôi có thể dễ dàng định cấu hình kết nối cơ sở dữ liệu. Ngay cả việc thiết lập một trình điều khiển cho DB cũng rất dễ dàng. Ngoài ra, không có phương thức get / set nào trong JDBC để truy cập các thực thể bảng.

Làm cách nào để hiểu về JPA và sự bền bỉ liên quan đến JDBC? JPA đã nghĩ đến điều gì? Tại sao có các phương thức set / get? Ai đó có thể ném một số ánh sáng về bản chất của hai điều này và ưu / nhược điểm là gì mà không có "biệt ngữ" ?? Cũng xin đề xuất một số liên kết. Một tìm kiếm đơn giản trên google về sự khác biệt giữa JPA và JDBC đã dẫn tôi đến một số trang web chứa đầy "thuật ngữ" mà tôi không thể theo dõi :(


2
Tại sao không bắt đầu với hướng dẫn JDBC: docs.oracle.com/javase/tutorial/jdbc/index.html
a_horse_with_no_name

2
JPA có thể được sử dụng mà không cần EJB hoặc thậm chí Java EE, bạn có thể tạo EntityManagerFactory trực tiếp từ Persistence.
James

Câu trả lời:


237

Trong điều khoản của Giáo dân:

  • JDBC là một tiêu chuẩn để truy cập cơ sở dữ liệu
  • JPA là một tiêu chuẩn cho ORM

JDBC là một tiêu chuẩn để kết nối với một DB trực tiếp và chạy SQL chống lại nó - ví dụ SELECT * FROM USERS, vv bộ dữ liệu có thể được trả lại mà bạn có thể xử lý trong ứng dụng của bạn, và bạn có thể làm tất cả những điều bình thường như INSERT, DELETE, chạy các thủ tục lưu trữ, vv Nó là một trong những công nghệ cơ bản đằng sau hầu hết các truy cập cơ sở dữ liệu Java (bao gồm cả các nhà cung cấp JPA).

Một trong những vấn đề với các ứng dụng JDBC truyền thống là bạn thường có thể có một số mã khó hiểu trong đó có rất nhiều ánh xạ giữa các tập dữ liệu và đối tượng xảy ra, logic bị trộn lẫn với SQL, v.v.

JPA là một tiêu chuẩn cho Ánh xạ quan hệ đối tượng. Đây là một công nghệ cho phép bạn ánh xạ giữa các đối tượng trong bảng mã và cơ sở dữ liệu. Điều này có thể "ẩn" SQL khỏi nhà phát triển để tất cả những gì họ xử lý là các lớp Java và nhà cung cấp cho phép bạn lưu chúng và tải chúng một cách kỳ diệu. Hầu hết, các tệp ánh xạ XML hoặc các chú thích trên getters và setters có thể được sử dụng để cho nhà cung cấp JPA biết những trường nào trên đối tượng của bạn ánh xạ tới những trường nào trong DB. Nhà cung cấp JPA nổi tiếng nhất là Hibernate , vì vậy đây là một nơi tốt để bắt đầu cho các ví dụ cụ thể.

Các ví dụ khác bao gồm OpenJPA, toplink, v.v.

Về cơ bản, Hibernate và hầu hết các nhà cung cấp khác cho JPA viết SQL và sử dụng JDBC để đọc và ghi từ và đến DB.


3
iBatis (ngày nay là MyBatis) không phải là một triển khai JPA. Nếu bạn nhìn vào nó, bạn sẽ nhận thấy rằng nó có khái niệm rất khác.
Mikko Maunu

cảm ơn! Sai lầm của tôi, tôi nghĩ rằng nó đã triển khai JPA, đã sửa ngay bây giờ!
Mark D

3
Không phải tất cả các nhà cung cấp JPA đều viết SQL và sử dụng JDBC ... vì chúng có thể tồn tại ở một "loại kho dữ liệu khác" (MongoDB, Neo4j, v.v.). DataNucleus JPA là một ví dụ như vậy
DataNucleus

true DataNucleus .. thậm chí còn có những cái cho excel, v.v. - các câu hỏi ban đầu là JDBC / JPA nên tôi cho rằng đúng hay sai anh ấy quan tâm đến các cửa hàng quan hệ.
Mark D

52

Sự khác biệt chính giữa JPA và JDBC là mức độ trừu tượng.

JDBC là một tiêu chuẩn cấp thấp để tương tác với cơ sở dữ liệu. JPA là tiêu chuẩn cấp cao hơn cho cùng mục đích. JPA cho phép bạn sử dụng một mô hình đối tượng trong ứng dụng của mình, điều này có thể giúp cuộc sống của bạn dễ dàng hơn nhiều. JDBC cho phép bạn trực tiếp làm nhiều việc hơn với Cơ sở dữ liệu, nhưng nó đòi hỏi nhiều sự chú ý hơn. Một số tác vụ không thể được giải quyết hiệu quả bằng JPA, nhưng có thể được giải quyết hiệu quả hơn với JDBC.


20

JDBC là một đặc tả cấp thấp hơn (và cũ hơn) nhiều so với JPA. Về cơ bản, JDBC là một API để tương tác với cơ sở dữ liệu bằng cách sử dụng SQL thuần túy - gửi truy vấn và truy xuất kết quả. Nó không có khái niệm về các đối tượng hoặc phân cấp. Khi sử dụng JDBC, bạn có thể dịch tập kết quả (về cơ bản là ma trận hàng / cột của các giá trị từ một hoặc nhiều bảng cơ sở dữ liệu, do truy vấn SQL của bạn trả về) sang các đối tượng Java.

Bây giờ, để hiểu và sử dụng JDBC, điều cần thiết là bạn phải có một số hiểu biết và kiến ​​thức về SQL. Cùng với đó, bạn cũng cần có một cái nhìn sâu sắc về cơ sở dữ liệu quan hệ là gì, cách bạn làm việc với nó và các khái niệm như bảng, cột, khóa và mối quan hệ. Trừ khi bạn có ít nhất hiểu biết cơ bản về cơ sở dữ liệu, SQL và mô hình dữ liệu, bạn sẽ không thể sử dụng nhiều JDBC vì nó thực sự chỉ là một phần trừu tượng mỏng về những thứ này.


10

JDBC là tiền thân của JPA.

JDBC là cầu nối giữa thế giới Java và thế giới cơ sở dữ liệu. Trong JDBC, bạn cần hiển thị tất cả các chi tiết bẩn cần thiết cho các hoạt động CRUD, chẳng hạn như tên bảng, tên cột, trong khi trong JPA (đang sử dụng JDBC bên dưới), bạn cũng chỉ định các chi tiết đó của siêu dữ liệu cơ sở dữ liệu, nhưng với việc sử dụng các chú thích Java.

Vì vậy, JPA tạo các truy vấn cập nhật cho bạn và quản lý các thực thể mà bạn đã tra cứu hoặc tạo / cập nhật (nó còn làm được nhiều việc hơn).

Nếu bạn muốn thực hiện JPA mà không có vùng chứa Java EE, thì Spring và các thư viện của nó có thể được sử dụng với các chú thích Java giống nhau.


"không có vùng chứa Java EE ??" Ý bạn là Spring và các thư viện của nó độc lập với vùng chứa web?
Bruce Zu

@BruceZu Tất nhiên là như vậy. Bạn có thể sử dụng nhiều thành phần Spring framework mà không cần vùng chứa web. Ví dụ: tiêm phụ thuộc không phải là thứ bạn chỉ cần trên ngữ cảnh web.
Dolfiz

1
@Dolfiz không phải thư viện web mùa xuân là một trình bao bọc trên các thư viện Java Web và Java EE?
raikumardipak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.