0Pricing
Java Academy · บทเรียน

พื้นฐาน 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 เปิด Connection
  • Statement ส่งเอสคิวแอล ส่วน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน JDBC
  2. PreparedStatement
  3. ธุรกรรม
  4. การรวมการเชื่อมต่อด้วย HikariCP
← กลับไปที่ Java Academy