JDBC คืออะไร? บทนำสู่ Java Database Connectivity

JDBC (Java Database Connectivity) คือ Java API ที่จัดการการเชื่อมต่อกับฐานข้อมูลการออกแบบสอบถามและคำสั่งและจัดการชุดผลลัพธ์ที่ได้รับจากฐานข้อมูล เปิดตัวโดยเป็นส่วนหนึ่งของ JDK 1.1 ในปี 1997 JDBC เป็นหนึ่งในองค์ประกอบแรกที่พัฒนาขึ้นสำหรับเลเยอร์การคงอยู่ของ Java

เริ่มแรก JDBC ถูกมองว่าเป็น API ฝั่งไคลเอ็นต์ทำให้ไคลเอ็นต์ Java สามารถโต้ตอบกับแหล่งข้อมูลได้ ที่เปลี่ยนแปลงด้วย JDCB 2.0 ซึ่งรวมแพ็กเกจเสริมที่สนับสนุนการเชื่อมต่อ JDBC ฝั่งเซิร์ฟเวอร์ JDBC ใหม่ทุกรุ่นตั้งแต่นั้นมามีการอัปเดตทั้งแพ็กเกจฝั่งไคลเอ็นต์ ( java.sql) และแพ็กเกจฝั่งเซิร์ฟเวอร์ ( javax.sql) JDBC 4.3 ซึ่งเป็นเวอร์ชันล่าสุด ณ การเขียนนี้ได้รับการเผยแพร่โดยเป็นส่วนหนึ่งของ Java SE 9 ในเดือนกันยายน 2017

บทความนี้นำเสนอภาพรวมของ JDBC ตามด้วยคำแนะนำเบื้องต้นเกี่ยวกับการใช้ JDBC API เพื่อเชื่อมต่อไคลเอ็นต์ Java กับ SQLite ซึ่งเป็นฐานข้อมูลเชิงสัมพันธ์ที่มีน้ำหนักเบา

JDBC ทำงานอย่างไร

JDBC ได้รับการพัฒนาเป็นทางเลือกสำหรับ C-based ODBC (Open Database Connectivity) API นำเสนออินเทอร์เฟซระดับการเขียนโปรแกรมที่จัดการกลไกของแอปพลิเคชัน Java ที่สื่อสารกับฐานข้อมูลหรือ RDBMS อินเตอร์เฟส JDBC ประกอบด้วยสองชั้น:

  1. JDBC API สนับสนุนการสื่อสารระหว่างแอ็พพลิเคชัน Java และตัวจัดการ JDBC
  2. ไดรเวอร์ JDBC สนับสนุนการสื่อสารระหว่างตัวจัดการ JDBC และไดรเวอร์ฐานข้อมูล

JDBC เป็น API ทั่วไปที่โค้ดแอปพลิเคชันของคุณโต้ตอบด้วย ด้านล่างนั่นคือไดรเวอร์ที่เข้ากันได้กับ JDBC สำหรับฐานข้อมูลที่คุณใช้

รูปที่ 1 เป็นภาพรวมสถาปัตยกรรมของ JDBC ในเลเยอร์การคงอยู่ของ Java

JavaWorld /

ใช้ JDBC เพื่อเชื่อมต่อกับฐานข้อมูล

ข้อเท็จจริงที่น่ายินดีอย่างหนึ่งของการเขียนโปรแกรมในระบบนิเวศ Java คือคุณมีแนวโน้มที่จะพบตัวเชื่อมต่อฐานข้อมูล JDBC ที่เสถียรสำหรับฐานข้อมูลใดก็ตามที่คุณเลือก ในบทช่วยสอนนี้เราจะใช้ SQLite เพื่อทำความรู้จัก JDBC ส่วนใหญ่เป็นเพราะมันใช้งานง่ายมาก

ขั้นตอนในการเชื่อมต่อกับฐานข้อมูลด้วย JDBC มีดังต่อไปนี้:

  1. ติดตั้งหรือค้นหาฐานข้อมูลที่คุณต้องการเข้าถึง
  2. รวมไลบรารี JDBC
  3. ตรวจสอบให้แน่ใจว่าไดรเวอร์ JDBC ที่คุณต้องการอยู่บน classpath ของคุณ
  4. ใช้ไลบรารี JDBC เพื่อรับการเชื่อมต่อกับฐานข้อมูล
  5. ใช้การเชื่อมต่อเพื่อออกคำสั่ง SQL
  6. ปิดการเชื่อมต่อเมื่อคุณดำเนินการเสร็จสิ้น

เราจะทำตามขั้นตอนเหล่านี้ด้วยกัน

การค้นหาไดรเวอร์ JDBC

หากต้องการค้นหาไดรเวอร์สำหรับฐานข้อมูลที่คุณต้องการใช้เพียงแค่ค้นหาฐานข้อมูลและ JDBC บนเว็บ ตัวอย่างเช่นการพิมพ์ " mysql jdbc driver" จะเป็นการเปิดโปรแกรมควบคุมสำหรับ MySQL ฉันขอท้าให้คุณค้นหาฐานข้อมูลที่เข้ากันได้กับ Java โดยไม่มีไดรเวอร์ JDBC!

ขั้นตอนที่ 1. ดาวน์โหลดและติดตั้ง SQLite

SQLite เป็นฐานข้อมูลที่กะทัดรัดมาก ไม่ได้มีไว้สำหรับใช้ในการผลิต แต่เป็นตัวเลือกที่ยอดเยี่ยมสำหรับการทดลองใช้งานอย่างรวดเร็ว SQLite ใช้ไฟล์เป็นฐานข้อมูลที่ใช้งานได้โดยไม่ต้องติดตั้งเซอร์วิสหรือดีมอน

ในการเริ่มต้นกับการสาธิตนี้ไปข้างหน้าและดาวน์โหลดฐานข้อมูลตัวอย่าง SQLite แตก.dbไฟล์และบันทึกไว้ในที่ที่คุณจะลืมไม่ลง

ไฟล์นี้มีทั้งฐานข้อมูลแบบไฟล์ที่ใช้งานได้และสคีมาตัวอย่างและข้อมูลที่เราสามารถใช้ได้

SQL และ JDBC

NoSQL ได้รับความนิยมมากขึ้นในช่วงทศวรรษที่ผ่านมา แต่ฐานข้อมูลเชิงสัมพันธ์ยังคงเป็นประเภทของพื้นที่เก็บข้อมูลที่ใช้กันมากที่สุด ฐานข้อมูลเชิงสัมพันธ์เป็นพื้นที่เก็บข้อมูลที่มีโครงสร้างที่ประกอบด้วยตารางที่มีคอลัมน์และแถว SQL (Structured Query Language) เป็นภาษาที่สถาปนิกข้อมูลใช้ทำสิ่งต่างๆเช่นสร้างอ่านอัปเดตและลบระเบียนใหม่ในฐานข้อมูลเชิงสัมพันธ์ JDBC เป็นเลเยอร์อะแด็ปเตอร์จาก Java ไปยัง SQL: ช่วยให้นักพัฒนา Java มีอินเทอร์เฟซทั่วไปสำหรับเชื่อมต่อกับฐานข้อมูลการออกแบบสอบถามและคำสั่งและจัดการการตอบสนอง

ขั้นตอนที่ 2. นำเข้า JDBC ลงในแอปพลิเคชัน Java ของคุณ

เราสามารถเข้ารหัสใน IDE ได้ แต่การเข้ารหัสโดยตรงในโปรแกรมแก้ไขข้อความจะแสดงให้เห็นถึงความเรียบง่ายของ JDBC ได้ดีกว่า ในการเริ่มต้นคุณจะต้องมีการติดตั้ง JDK ที่เข้ากันได้สำหรับระบบปฏิบัติการของคุณ

สมมติว่าคุณมีเครื่องมือสำหรับนักพัฒนาแพลตฟอร์ม Java ติดตั้งอยู่เราสามารถเริ่มต้นด้วยการสร้างโปรแกรม Java อย่างง่าย ในโปรแกรมแก้ไขข้อความของคุณให้วางรหัสที่แสดงในรายการ 1 เรียกไฟล์WhatIsJdbc.javaนี้

รายการ 1. โปรแกรม Java อย่างง่าย

 class WhatIsJdbc{ public static void main(String args[]){ System.out.println("Hello JavaWorld"); } } 

ตอนนี้รวบรวมรหัสโดยป้อนคำสั่ง: javac WhatIsJdbc.java. การคอมไพล์จะส่งออกWhatIsJdbc.classไฟล์ เรียกใช้ไฟล์นี้จากบรรทัดคำสั่งด้วยการเรียก: java WhatIsJdbc.

[ดู "JDK คืออะไรบทนำสู่ Java Developer Kit" สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการโต้ตอบกับ JDK บนบรรทัดคำสั่ง]

เมื่อคุณมีโปรแกรม Java พื้นฐานแล้วคุณสามารถรวมไลบรารี JDBC ได้ วางโค้ดจาก Listing 2 ที่ส่วนหัวของโปรแกรม Java อย่างง่าย

รายการ 2. การนำเข้า JDBC

 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; 

การนำเข้าแต่ละรายการเหล่านี้จัดเตรียมการเข้าถึงคลาสที่อำนวยความสะดวกในการเชื่อมต่อฐานข้อมูล Java มาตรฐาน:

  • Connection แสดงถึงการเชื่อมต่อกับฐานข้อมูล
  • DriverManagerรับการเชื่อมต่อกับฐานข้อมูล (อีกทางเลือกหนึ่งคือDataSourceใช้สำหรับการรวมการเชื่อมต่อ)
  • SQLException จัดการข้อผิดพลาดของ SQL ระหว่างแอ็พพลิเคชัน Java และฐานข้อมูล
  • ResultSetและStatementสร้างแบบจำลองชุดผลลัพธ์ข้อมูลและคำสั่ง SQL

เราจะเห็นการดำเนินการแต่ละอย่างในไม่ช้า

ขั้นตอนที่ 3. เพิ่มไดรเวอร์ JDBC ลงใน classpath ของคุณ

จากนั้นคุณจะเพิ่มไดรเวอร์ SQLite ลงใน classpath ของคุณ ไดรเวอร์ JDBCเป็นชั้นที่จะนำ API ของ JDBC สำหรับฐานข้อมูลที่เฉพาะเจาะจง

ดาวน์โหลดไดรเวอร์ SQLite จาก GitHub อย่าลืมรับ.jarไฟล์ล่าสุดและเก็บไว้ในที่ที่คุณจะจำได้

ในครั้งต่อไปที่คุณรันโปรแกรม Java ของคุณคุณจะดึง.jarไฟล์นั้นเข้ามาทาง classpath มีหลายวิธีในการตั้งค่า classpath รายการ 3 แสดงวิธีการทำโดยใช้สวิตช์บรรทัดคำสั่ง

รายการ 3. การเรียกใช้ไดรเวอร์ SQLite บนคลาสพา ธ Java

 java.exe -classpath /path-to-driver/sqlite-jdbc-3.23.1.jar:. WhatIsJdbc 

สังเกตว่าเราได้ตั้งค่า classpath ให้ชี้ไปที่ไดร์เวอร์และโลคัลไดเร็กทอรี วิธีนี้ Java จะยังคงพบไฟล์คลาสของเรา

ขั้นตอนที่ 4. รับการเชื่อมต่อฐานข้อมูล

ขณะนี้ classpath สามารถเข้าถึงไดรเวอร์ได้แล้ว ตอนนี้เปลี่ยนไฟล์แอปพลิเคชัน Java ธรรมดาของคุณให้ดูเหมือนโปรแกรมใน Listing 4

รายการ 4. การใช้คลาส JDBC Connection เพื่อเชื่อมต่อกับ SQLite

 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; class WhatIsJdbc{ public static void main(String[] args) { Connection conn = null; try { String url = "jdbc:sqlite:path-to-db/chinook/chinook.db"; conn = DriverManager.getConnection(url); System.out.println("Got it!"); } catch (SQLException e) { throw new Error("Problem", e); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException ex) { System.out.println(ex.getMessage()); } } } } 

คอมไพล์และรันโค้ดนี้ สมมติว่าทุกอย่างเป็นไปด้วยดีคุณจะได้รับข้อความยืนยัน

ไม่พบไดรเวอร์ที่เหมาะสม?

หากคุณได้รับข้อผิดพลาดที่ดูเหมือน " No suitable driver found for jdbc:sqlite" คุณจะต้องกลับไปที่ classpath และตรวจสอบให้แน่ใจว่าได้ชี้ไปที่ไดรเวอร์ที่คุณดาวน์โหลด การเชื่อมต่อไดรเวอร์ที่ล้มเหลวเป็นปัญหาที่พบบ่อยที่สุดสำหรับผู้เริ่มต้นใช้ JDBC อย่าเหงื่อออก เพียงแค่แก้ไข

ตอนนี้เราพร้อมสำหรับคำสั่ง SQL บางคำสั่ง

ขั้นตอนที่ 5. สืบค้นฐานข้อมูล

ด้วยออบเจ็กต์การเชื่อมต่อแบบสดในมือเราสามารถทำสิ่งที่เป็นประโยชน์เช่นการสืบค้นฐานข้อมูล รายการ 5 แสดงวิธีการสอบถาม SQLite โดยใช้ JDBC ConnectionและStatementอ็อบเจ็กต์

รายการ 5. การสืบค้นฐานข้อมูลด้วย JDBC

 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; class WhatIsJdbc{ public static void main(String[] args) { Connection conn = null; try { String url = "jdbc:sqlite:path-to-db-file/chinook/chinook.db"; conn = DriverManager.getConnection(url); Statement stmt = null; String query = "select * from albums"; try { stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query); while (rs.next()) { String name = rs.getString("title"); System.out.println(name); } } catch (SQLException e ) { throw new Error("Problem", e); } finally { if (stmt != null) { stmt.close(); } } } catch (SQLException e) { throw new Error("Problem", e); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException ex) { System.out.println(ex.getMessage()); } } } } 

ในรายชื่อ 5 เราใช้ของเราConnectionวัตถุที่จะได้รับวัตถุ:Statement conn.createStatement()จากนั้นเราจะใช้วัตถุนี้ในการดำเนินการการสอบถาม stmt.executeQuery(query)SQL:

The executeQuery command returns a ResultSet object, which we then use to iterate over the data with while (rs.next()). In this example, you should see the album titles we've queried on as output.

Notice that we also closed the connection, via a call to conn.close().

Network connections with JDBC

The database connection string in Listing 5 is for a local connection: jdbc:sqlite:path-to-db-file/chinook/chinook.db. To access the database via a network, the connection string would need to include the network URL and (usually) credentials for accessing it.

Doing more with JDBC

So far we've covered the basics of using JDBC to connect to a database and issue SQL commands. While Statementss and ResultSets work well for common scenarios, you'll likely need additional options for larger or more complex applications. Fortunately, the JDBC library continues evolving to meet most database access needs.

PreparedStatements

One easy way to increase the flexibility of your code is to replace the Statement class with PreparedStatement, as shown in Listing 6.

Listing 6. Using JDBC PreparedStatements

 String prepState = "insert into albums values (?, ?);"; PreparedStatement prepState = connection.prepareStatement(sql); prepState.setString(1, "Uprising"); prepState.setString(2, "Bob Marley and the Wailers "); int rowsAffected = preparedStatement.executeUpdate(); 

PreparedStatement replaces Statement's hard-coded values with question marks (?). Using PreparedStatements optimizes your code for reuse: a PreparedStatement is compiled only once, and can then be reused with a variety of parameters. As your code base grows, you simply insert new values into the statement, instead of hacking the string object itself.

Batch updates

Whenever an application has several updates to issue, doing them in batches can greatly benefit performance. The essence of batching is to take the multiple updates and collect them together, then issue them all at once. Listing 7 uses JDBC's batch methods to perform a batch update of several PreparedStatements.

Listing 7. Batching with PreparedStatement

 prepState.setString(1, "Uprising"); prepState.setString(2, "Bob Marley and the Wailers"); preparedStatement.addBatch(); prepState.setString(1, "Wildflowers"); prepState.setString(2, "Tom Petty and the Heartbreakers"); preparedStatement.addBatch(); int[] rowsAffected = preparedStatement.executeBatch(); 

JDBC transactions

Transactions in relational databases allow for a set of updates to be wrapped in an interaction that either succeeds or fails altogether. The basics of using a transaction via JDBC are to tell the system to turn off auto-commit, and then manually tell the system to commit when you are done. By default, auto-commit is on, which means whenever an executeUpdate or executeInsert is run, the command is committed.

Listing 8 shows a small slice of a JDBC transaction.

Listing 8. JDBC transactions

 connection.setAutoCommit(false); // Use executeUpdate multiple times connection.commit(); 

When connection.commit() is encountered, all the updates wrapped inside will be attempted, and if any fail, they all will be rolled back.

There are many more features in JDBC 4.3 worth exploring, including using CallableStatement for stored procedures, using DataSource objects for improved application performance (especially via connection pooling), and converting a JDBC ResultSet to a Java Stream.

Database-specific features

Although every JDBC-compliant database offers the same core features for connecting and interacting with a database via SQL, some databases do more than others. As an example, Oracle DB offers result caching, which is not required by the JDBC specification. Here's an example:

 conn.prepareStatement ("select /*+ result_cache */ * from employees where employee_id < : 1"); 

This example is taken from the documentation for Oracle's JDBC OCI Driver.

Conclusion

JDBC is one of Java's oldest APIs, providing an easy-to-use solution for one of the perennial needs of Java application development. Knowing just the few JDBC calls demonstrated in this article will get you started using JDBC to connect to virtually any database. Once you've got those commands down, you can begin to explore some of the more sophisticated options that have been built into JDBC.

แม้ว่า JDBC จะเพียงพอสำหรับแอปพลิเคชันที่เรียบง่าย แต่ในที่สุดนักพัฒนาส่วนใหญ่จะมองหา Java Persistence API (JPA) เพื่อพัฒนาชั้นการเข้าถึงข้อมูลที่เป็นทางการมากขึ้น JPA ต้องการการทำงานล่วงหน้ามากขึ้นและความเข้าใจที่ซับซ้อนมากขึ้นเกี่ยวกับสถาปัตยกรรมแอปพลิเคชัน แต่จะช่วยให้คุณมีชั้นการเข้าถึงข้อมูลที่สอดคล้องแยกกันและกำหนดไว้อย่างชัดเจนมากขึ้น ดูคำแนะนำในบทความนี้ "JPA คืออะไรรู้เบื้องต้นเกี่ยวกับ Java Persistence API" สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการพัฒนาเลเยอร์การคงอยู่ของข้อมูลสำหรับแอปพลิเคชัน Java ของคุณ

เรื่องนี้ "JDBC คืออะไรรู้เบื้องต้นเกี่ยวกับ Java Database Connectivity" เผยแพร่ครั้งแรกโดย JavaWorld