พื้นฐาน JDBC
การเชื่อมต่อ คำสั่ง และชุดผลลัพธ์
พื้นฐาน JDBC เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
เจดีบีซีคืออะไร
เจดีบีซี (การเชื่อมต่อฐานข้อมูลของ Java) คือส่วนต่อประสานโปรแกรมประยุกต์มาตรฐานสำหรับเชื่อมต่อกับฐานข้อมูลเชิงสัมพันธ์จาก Java
- อยู่ในแพ็กเกจ
java.sql - ฐานข้อมูลแต่ละระบบมี โปรแกรมควบคุมที่ใช้งานอินเทอร์เฟซของเจดีบีซี
- คุณเขียนโค้ดโดยอ้างอิงอินเทอร์เฟซ เช่น
Connection,StatementและResultSetโดยไม่อ้างอิงคลาสเฉพาะของผู้ผลิตโดยตรง
แนวคิดนามธรรมนี้ทำให้โค้ดเดียวกันทำงานกับ PostgreSQL, MySQL, เอชทู หรือออราเคิลได้
อินเทอร์เฟซหลัก
อินเทอร์เฟซสามชนิดทำหน้าที่ส่วนใหญ่ ดังนี้
Connection— เซสชันที่เปิดอยู่กับฐานข้อมูลStatement/PreparedStatement— ส่งเอสคิวแอลResultSet— ตัวชี้สำหรับแถวที่ส่งกลับจากคำค้น
คุณรับ Connection ได้จาก DriverManager หรือ DataSource
การเปิดการเชื่อมต่อ
DriverManager.getConnection(url, user, password) ส่งกลับ Connection ที่กำลังทำงานอยู่
ที่อยู่เจดีบีซีใช้ระบุฐานข้อมูล เช่น jdbc:postgresql://localhost:5432/shop โปรแกรมควบคุมรุ่นใหม่ลงทะเบียนตัวเองโดยอัตโนมัติ ดังนั้นคุณจึงไม่ต้องเรียกใช้ Class.forName(...) อีกต่อไป
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/shop";
try (Connection conn = DriverManager.getConnection(url, "app", "secret")) {
System.out.println("Connected: " + !conn.isClosed());
} catch (SQLException e) {
System.out.println("Connection failed: " + e.getMessage());
}
}
}การจัดการทรัพยากรอัตโนมัติ
Connection, Statement และ ResultSet ต่างใช้งาน AutoCloseable
เปิดใช้งานสิ่งเหล่านี้ภายใน บล็อกที่จัดการทรัพยากรอัตโนมัติเสมอ เพื่อให้ปิดโดยอัตโนมัติ แม้จะเกิดข้อยกเว้นขึ้นก็ตาม การไม่ปิดการเชื่อมต่อจะทำให้การเชื่อมต่อที่ฐานข้อมูลรองรับหมดลงอย่างรวดเร็ว
- ทรัพยากรจะปิดตามลำดับย้อนกลับ
- ไม่จำเป็นต้องมีบล็อก
finally
การเรียกใช้คำค้น
สำหรับ SELECT แบบง่าย ให้สร้าง Statement แล้วเรียกใช้ executeQuery ซึ่งจะส่งกลับ ResultSet
ตัวอย่างนี้ใช้การจำลองในหน่วยความจำ เพื่อให้คุณเห็นลำดับการทำงานโดยไม่ต้องมีฐานข้อมูลจริง ในระบบจริง เอสคิวแอลจะทำงานกับการเชื่อมต่อ
import java.util.List;
public class Main {
public static void main(String[] args) {
// Simulated result of: SELECT name FROM users
List<String> names = List.of("Ada", "Linus", "Grace");
System.out.println("Query returned " + names.size() + " rows:");
for (String name : names) {
System.out.println(" - " + name);
}
}
}การอ่าน ResultSet
ResultSet จะเริ่มต้นอยู่ ก่อนแถวแรก ให้เรียก rs.next() ในลูป โดยเมธอดนี้จะส่งกลับ false เมื่อไม่มีแถวเหลือแล้ว
อ่านคอลัมน์ด้วยชื่อหรือดัชนีที่เริ่มนับจาก 1 โดยใช้เมธอดรับค่าตามชนิดข้อมูล
rs.getInt("id")rs.getString("name")rs.getDouble("price")
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Main {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/shop";
try (Connection conn = DriverManager.getConnection(url, "app", "secret");
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT id, name FROM users")) {
while (rs.next()) {
System.out.println(rs.getInt("id") + ": " + rs.getString("name"));
}
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
}executeUpdate สำหรับการเขียนข้อมูล
สำหรับ INSERT, UPDATE และ DELETE ให้ใช้ executeUpdate เมธอดนี้ส่งกลับค่า int ซึ่งคือจำนวนแถวที่ได้รับผลกระทบ
ใช้ execute เฉพาะเมื่อคุณไม่ทราบล่วงหน้าว่าคำสั่งจะส่งกลับชุดผลลัพธ์หรือไม่
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Main {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/shop";
try (Connection conn = DriverManager.getConnection(url, "app", "secret");
Statement st = conn.createStatement()) {
int rows = st.executeUpdate("DELETE FROM sessions WHERE expired = true");
System.out.println("Deleted " + rows + " rows");
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
}การแปลงแถวเป็นออบเจ็กต์
แอปพลิเคชันส่วนใหญ่จะแปลงแต่ละแถวเป็นออบเจ็กต์ของโดเมน ให้วนลูปผ่าน ResultSet แล้วสร้างอินสแตนซ์
นี่คือรูปแบบการทำงานที่จำลองไว้เพื่อให้ทำงานได้โดยอิสระ การใช้ recordช่วยให้การแปลงกระชับขึ้น
import java.util.ArrayList;
import java.util.List;
public class Main {
record User(int id, String name) {}
public static void main(String[] args) {
// Stand-in for iterating a ResultSet
String[][] rows = {{"1", "Ada"}, {"2", "Linus"}};
List<User> users = new ArrayList<>();
for (String[] row : rows) {
users.add(new User(Integer.parseInt(row[0]), row[1]));
}
users.forEach(System.out::println);
}
}การจัดการ SQLException
เมธอดของเจดีบีซีเกือบทั้งหมดจะโยนข้อยกเว้นที่ต้องจัดการอย่าง SQLException
ข้อยกเว้นนี้มีข้อมูลวินิจฉัยที่เป็นประโยชน์
getMessage()— ข้อความที่มนุษย์อ่านได้getSQLState()— รหัสสถานะมาตรฐานที่มี 5 อักขระgetErrorCode()— รหัสเฉพาะของผู้ผลิต
ให้บันทึกข้อมูลเหล่านี้แทนการละทิ้งข้อยกเว้น
import java.sql.SQLException;
public class Main {
public static void main(String[] args) {
SQLException e = new SQLException("duplicate key", "23505", 7);
System.out.println("Message: " + e.getMessage());
System.out.println("SQLState: " + e.getSQLState());
System.out.println("ErrorCode: " + e.getErrorCode());
}
}DatabaseMetaData
conn.getMetaData() ส่งกลับออบเจ็กต์ DatabaseMetaData ซึ่งอธิบายฐานข้อมูลนั้นเอง
ออบเจ็กต์นี้บอกชื่อและรุ่นของผลิตภัณฑ์ คุณลักษณะที่รองรับ และยังแสดงรายการตารางกับคอลัมน์ได้ด้วย นี่คือวิธีที่เครื่องมืออย่างโปรแกรมดูโครงสร้างฐานข้อมูลทำงานโดยไม่ต้องกำหนดรายละเอียดเฉพาะของผู้ผลิตไว้ล่วงหน้า
นำทุกอย่างมาประกอบกัน
ลำดับการอ่านข้อมูลโดยทั่วไปมีดังนี้
- เปิด
Connectionภายในบล็อกที่จัดการทรัพยากรอัตโนมัติ - สร้าง
Statementหรือควรใช้PreparedStatementมากกว่า - เรียกใช้
executeQueryแล้ววนลูปด้วยrs.next() - แปลงคอลัมน์เป็นออบเจ็กต์
- ปล่อยให้บล็อกที่จัดการทรัพยากรอัตโนมัติปิดทุกอย่าง
บทเรียนถัดไป เราจะทำให้คำค้นปลอดภัยจากการฉีดคำสั่ง
ตรวจสอบความเข้าใจอย่างรวดเร็ว
Statement.executeUpdate ส่งกลับค่าอะไร
ทบทวน
ตอนนี้คุณเข้าใจลำดับการทำงานหลักของเจดีบีซีแล้ว
DriverManager.getConnectionเปิดConnectionStatementส่งเอสคิวแอล ส่วนexecuteQueryส่งกลับResultSetและexecuteUpdateส่งกลับจำนวนแถวที่ได้รับผลกระทบ- วนอ่านข้อมูลด้วย
rs.next()และเมธอดรับค่าตามชนิดข้อมูล - ใช้ บล็อกที่จัดการทรัพยากรอัตโนมัติเสมอ และจัดการ
SQLExceptionโดยใช้รหัสสถานะและรหัสข้อผิดพลาดของข้อยกเว้น
คำถามที่พบบ่อย
บทเรียน “พื้นฐาน JDBC” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “พื้นฐาน JDBC” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐาน JDBC”
การเชื่อมต่อ คำสั่ง และชุดผลลัพธ์ คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “พื้นฐาน JDBC” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ