JPA หรือ JDBC ต่างกันอย่างไร?


119

ฉันกำลังเรียนรู้ Java EE และฉันดาวน์โหลด eclipse ด้วย glassfish สำหรับสิ่งเดียวกัน ฉันเห็นตัวอย่างบางส่วนและอ่านเอกสาร Oracle เพื่อทราบข้อมูลทั้งหมดเกี่ยวกับ Java EE 5 การเชื่อมต่อกับฐานข้อมูลนั้นง่ายมาก ฉันเปิดโปรเจ็กต์เว็บแบบไดนามิกสร้างเซสชัน EJB ฉันใช้ EntityManager และด้วยเมธอด get สามารถเข้าถึงตารางข้อมูลที่เก็บไว้ได้

สำหรับโปรเจ็กต์ถัดไปของฉันฉันได้สร้างคลาสง่ายๆจากนั้นเข้าถึงตาราง DB ปัญหาแรกที่ฉันพบคือแอตทริบิวต์ PersistenceUnit จะได้รับการยอมรับโดย EJB, Servlet และอื่น ๆ เท่านั้นไม่ใช่คลาส java ธรรมดา ดังนั้นฉันจึงไม่สามารถใช้วิธี EntityManager ได้ (หรือฉันสามารถ?)

ฉันถูกขอให้ไปทาง "JDBC" ปัญหาแรกที่ฉันพบคือการเชื่อมต่อกับ DB ดูเหมือนว่าทั้งหมดนี้จะต้องเป็นฮาร์ดโค้ด ฉันมี persistence.xml ซึ่งฉันสามารถกำหนดค่าการเชื่อมต่อฐานข้อมูลได้อย่างง่ายดาย แม้แต่การตั้งค่าไดรเวอร์สำหรับ DB ก็ทำได้ง่าย นอกจากนี้ยังไม่มีเมธอด get / set ใน JDBC สำหรับการเข้าถึงเอนทิตีตาราง

ฉันจะเข้าใจ JPA และความคงอยู่ที่สัมพันธ์กับ JDBC ได้อย่างไร JPA คิดเพื่ออะไร? ทำไมจึงมีวิธี set / get? ใครบางคนสามารถชี้ให้เห็นถึงสาระสำคัญของสองสิ่งนี้และข้อดี / ข้อเสียที่ไม่มี "ศัพท์แสง" คืออะไร ?? กรุณาแนะนำลิงค์บางส่วนด้วย การค้นหาโดย Google ง่ายๆสำหรับความแตกต่างของ JPA และ JDBC ทำให้ฉันไปยังไซต์บางแห่งที่เต็มไปด้วย "คำศัพท์เฉพาะ" ฉันไม่สามารถปฏิบัติตาม :(


2
ทำไมไม่เริ่มด้วยบทช่วยสอน JDBC: docs.oracle.com/javase/tutorial/jdbc/index.html
a_horse_with_no_name

2
JPA สามารถใช้ได้โดยไม่ต้อง EJB หรือแม้แต่ Java EE คุณสามารถสร้าง EntityManagerFactory ได้โดยตรงจาก Persistence
James

คำตอบ:


238

ในแง่ของคนธรรมดา:

  • JDBC เป็นมาตรฐานสำหรับการเข้าถึงฐานข้อมูล
  • JPA เป็นมาตรฐานสำหรับ ORM

JDBC เป็นมาตรฐานสำหรับการเชื่อมต่อกับฐานข้อมูลโดยตรงและใช้ SQL กับมัน - เช่นSELECT * FROM USERSฯลฯ ชุดข้อมูลที่สามารถกลับมาที่คุณสามารถจัดการแอปของคุณและคุณสามารถทำทุกสิ่งปกติเช่นINSERT, DELETEเรียกใช้วิธีการจัดเก็บและอื่น ๆ เป็นหนึ่งในเทคโนโลยีพื้นฐานที่อยู่เบื้องหลังการเข้าถึงฐานข้อมูล Java ส่วนใหญ่ (รวมถึงผู้ให้บริการ JPA)

ปัญหาอย่างหนึ่งของแอพ JDBC แบบเดิมคือคุณมักจะมีโค้ดเส็งเคร็งซึ่งมีการแมประหว่างชุดข้อมูลและอ็อบเจ็กต์จำนวนมากตรรกะจะผสมกับ SQL เป็นต้น

JPA เป็นมาตรฐานสำหรับ Object Relational Mapping นี่คือเทคโนโลยีที่ช่วยให้คุณสามารถแมประหว่างวัตถุในโค้ดและตารางฐานข้อมูล สิ่งนี้สามารถ "ซ่อน" SQL จากผู้พัฒนาเพื่อให้ทั้งหมดที่จัดการกับคลาส Java และผู้ให้บริการอนุญาตให้คุณบันทึกและโหลดได้อย่างน่าอัศจรรย์ โดยส่วนใหญ่ไฟล์การแมป XML หรือคำอธิบายประกอบบน getters และ setters สามารถใช้เพื่อบอกผู้ให้บริการ JPA ว่าฟิลด์ใดบนออบเจ็กต์แมปของคุณกับฟิลด์ใดใน DB ผู้ให้บริการ JPA ที่มีชื่อเสียงที่สุดคือHibernateดังนั้นจึงเป็นจุดเริ่มต้นที่ดีสำหรับตัวอย่างที่เป็นรูปธรรม

ตัวอย่างอื่น ๆ ได้แก่ OpenJPA, toplink และอื่น ๆ

ภายใต้ประทุน Hibernate และผู้ให้บริการอื่น ๆ ส่วนใหญ่สำหรับ JPA เขียน SQL และใช้ JDBC เพื่ออ่านและเขียนจากและไปยัง DB


3
iBatis (ปัจจุบันคือ MyBatis) ไม่ใช่การใช้งาน JPA หากลองดูจะสังเกตได้ว่ามีแนวคิดที่แตกต่างกันมาก
Mikko Maunu

ขอบคุณ! ความผิดพลาดของฉันฉันคิดว่ามันใช้ JPA แก้ไขแล้ว!
Mark D

3
ไม่ใช่ผู้ให้บริการ JPA ทุกรายที่เขียน SQL และใช้ JDBC ... เนื่องจากอาจยังคงเป็น "พื้นที่เก็บข้อมูลประเภทอื่น" (MongoDB, Neo4j ฯลฯ ) DataNucleus JPA เป็นตัวอย่างหนึ่ง
DataNucleus

DataNucleus ที่แท้จริง .. มีแม้กระทั่งคำถามสำหรับ excel ฯลฯ - คำถามเดิมคือ JDBC / JPA ดังนั้นฉันคิดถูกหรือผิดว่าเขาสนใจร้านค้าเชิงสัมพันธ์
เครื่องหมาย D

52

ความแตกต่างหลักระหว่าง JPA และ JDBC คือระดับของนามธรรม

JDBC เป็นมาตรฐานระดับต่ำสำหรับการโต้ตอบกับฐานข้อมูล JPA เป็นมาตรฐานระดับที่สูงกว่าสำหรับวัตถุประสงค์เดียวกัน JPA ช่วยให้คุณใช้โมเดลวัตถุในแอปพลิเคชันของคุณซึ่งจะทำให้ชีวิตของคุณง่ายขึ้นมาก JDBC ช่วยให้คุณทำสิ่งต่างๆได้มากขึ้นด้วยฐานข้อมูลโดยตรง แต่ต้องให้ความสนใจมากขึ้น งานบางอย่างไม่สามารถแก้ไขได้อย่างมีประสิทธิภาพโดยใช้ JPA แต่อาจแก้ไขได้อย่างมีประสิทธิภาพมากขึ้นด้วย JDBC


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 และไลบรารีของมันไม่ขึ้นกับคอนเทนเนอร์เว็บหรือไม่?
Bruce Zu

@BruceZu แน่นอนค่ะ คุณสามารถใช้ส่วนประกอบ Spring framework ได้หลายอย่างโดยไม่จำเป็นต้องมีเว็บคอนเทนเนอร์ ตัวอย่างเช่นการพึ่งพาอาศัยกันไม่ใช่สิ่งที่คุณต้องการในบริบทของเว็บเท่านั้น
Dolfiz

1
@Dolfiz ไม่ใช่ Spring Web Libraries ที่เป็น Wrapper บน Java Web และ Java EE libraries ใช่หรือไม่?
raikumardipak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.