首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

JDBC 入門範例:資料庫連線、查詢與資源管理完整流程

     編輯:Java 程式設計入門

JDBC (Java Database Connectivity) 是 Java 操作關聯式資料庫的標準 API。本文提供一個完整、可編譯執行的 JDBC 入門範例,涵蓋六大核心步驟:載入驅動、建立連線、建立 Statement、執行查詢、處理 ResultSet、關閉資源。

六大核心步驟

  1. 導入套件:import java.sql.*;
  2. 註冊驅動:Class.forName("com.mysql.cj.jdbc.Driver") (JDBC 4.0+ 可省略)
  3. 取得連線:DriverManager.getConnection(url, user, pass)
  4. 執行查詢:Statement.executeQuery(sql) 回傳 ResultSet
  5. 處理結果:迴圈 rs.next(),用 getXxx("column") 取值
  6. 釋放資源:逆序關閉 ResultSet → Statement → Connection

完整可執行範例

import java.sql.*;

public class JdbcFirstExample {
    // MySQL 8.0+ 連線字串範例(需依實際環境調整)
    private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String DB_URL = "jdbc:mysql://localhost:3306/EMP?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8";
    
    // 資料庫帳號密碼(請替換為實際值)
    private static final String USER = "root";
    private static final String PASS = "password";

    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        
        try {
            // 步驟 1-2:載入驅動 (JDBC 4.0+ SPI 機制自動載入,可省略)
            Class.forName(JDBC_DRIVER);
            
            // 步驟 3:建立連線
            System.out.println("連線資料庫中...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            
            // 步驟 4:建立 Statement 並執行查詢
            System.out.println("建立 Statement...");
            stmt = conn.createStatement();
            String sql = "SELECT id, first, last, age FROM Employees";
            rs = stmt.executeQuery(sql);
            
            // 步驟 5:處理結果集
            System.out.println("查詢結果:");
            while (rs.next()) {
                // 依欄位名稱取值(推薦,不依賴順序)
                int id = rs.getInt("id");
                int age = rs.getInt("age");
                String first = rs.getString("first");
                String last = rs.getString("last");
                
                System.out.printf("ID: %d, Age: %d, First: %s, Last: %s%n", id, age, first, last);
            }
            
        } catch (SQLException se) {
            // JDBC 相關錯誤
            System.err.println("SQL 錯誤: " + se.getMessage());
            se.printStackTrace();
        } catch (ClassNotFoundException cnfe) {
            // 驅動類別找不到
            System.err.println("找不到 JDBC 驅動: " + cnfe.getMessage());
            cnfe.printStackTrace();
        } catch (Exception e) {
            // 其他錯誤
            e.printStackTrace();
        } finally {
            // 步驟 6:釋放資源 (逆序關閉,各自 try-catch 保護)
            closeQuietly(rs);
            closeQuietly(stmt);
            closeQuietly(conn);
            System.out.println("資源已釋放,程式結束。");
        }
    }
    
    /** 靜默關閉 AutoCloseable 資源 */
    private static void closeQuietly(AutoCloseable resource) {
        if (resource != null) {
            try {
                resource.close();
            } catch (Exception e) {
                System.err.println("關閉資源時發生錯誤: " + e.getMessage());
            }
        }
    }
}

編譯與執行

# 編譯
javac -cp ".;mysql-connector-java-8.0.33.jar" JdbcFirstExample.java

# 執行 (Windows)
java -cp ".;mysql-connector-java-8.0.33.jar" JdbcFirstExample

# 執行 (Linux/Mac)
java -cp ".:mysql-connector-java-8.0.33.jar" JdbcFirstExample

預期輸出

連線資料庫中...
建立 Statement...
查詢結果:
ID: 100, Age: 18, First: Zara, Last: Ali
ID: 101, Age: 25, First: Mahnaz, Last: Fatma
ID: 102, Age: 30, First: Zaid, Last: Khan
ID: 103, Age: 28, First: Sumit, Last: Mittal
資源已釋放,程式結束。

進階最佳實務

使用 PreparedStatement (防 SQL 注入、效能更好)

String sql = "SELECT id, first, last, age FROM Employees WHERE age > ? AND last LIKE ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
    pstmt.setInt(1, 20);
    pstmt.setString(2, "K%");
    try (ResultSet rs = pstmt.executeQuery()) {
        // 處理結果
    }
}

使用 Try-with-resources (Java 7+ 自動關閉)

try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery(sql)) {
    
    while (rs.next()) {
        // 處理結果
    }
} // 自動關閉 rs, stmt, conn

連線池 (生產環境必備)

  • HikariCP:高效能、輕量、Spring Boot 2+ 預設
  • Druid:阿里巴巴開源,監控功能強大
  • DBCP2:Apache Commons 專案
// HikariCP 範例
HikariConfig config = new HikariConfig();
config.setJdbcUrl(DB_URL);
config.setUsername(USER);
config.setPassword(PASS);
config.setMaximumPoolSize(20);
HikariDataSource ds = new HikariDataSource(config);

// 使用時
try (Connection conn = ds.getConnection()) {
    // 業務邏輯
}

常見錯誤與解決

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤原因解決
ClassNotFoundException驅動 JAR 不在 classpath加入 mysql-connector-java 依賴
Communications link failureIP/埠錯誤、防火牆、MySQL 未啟用遠端檢查 url、bind-address、grant 權限
Public Key Retrieval is not allowedMySQL 8.0 預設 caching_sha2_passwordURL 加 allowPublicKeyRetrieval=true 或改用 mysql_native_password
SSL connection errorMySQL 5.7+ 預設要求 SSLURL 加 useSSL=false 或配置信任憑證
Timezone 錯誤伺服器時區未設定URL 加 serverTimezone=UTC 或 Asia/Taipei