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

JDBC 連接資料庫完整步驟與最佳實踐

     編輯:Java 相關知識

JDBC (Java Database Connectivity) 是 Java 應用連接關係型資料庫的標準 API。本文詳細說明 JDBC 連接資料庫的標準流程、關鍵代碼、常見異常處理,以及生產環境中推薦的連接池與工具類封裝模式。

JDBC 核心 5 步驟

  1. 加載驅動類:Class.forName("com.mysql.cj.jdbc.Driver")
  2. 建立連接:DriverManager.getConnection(url, user, password)
  3. 創建 Statement:conn.createStatement() 或 PreparedStatement
  4. 執行 SQL 與處理結果:executeQuery / executeUpdate
  5. 關閉資源:按 ResultSet → Statement → Connection 順序關閉

各步驟詳細說明

1. 加載驅動類


// MySQL 8.0+
Class.forName("com.mysql.cj.jdbc.Driver");

// Oracle
Class.forName("oracle.jdbc.driver.OracleDriver");

// PostgreSQL
Class.forName("org.postgresql.Driver");

常見異常:ClassNotFoundException,原因通常是:

  • 驅動 JAR 包未加入 Classpath
  • 驅動類名拼寫錯誤
  • JDK 版本與驅動不兼容(如 MySQL 8 需用 com.mysql.cj.jdbc.Driver)

2. 建立資料庫連接


// MySQL 連接字串範例
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8";
String user = "root";
String password = "123456";

Connection conn = DriverManager.getConnection(url, user, password);

不同資料庫 URL 格式差異:

  • MySQL: jdbc:mysql://host:port/dbname?params
  • Oracle: jdbc:oracle:thin:@host:port:sid
  • PostgreSQL: jdbc:postgresql://host:port/dbname
  • SQL Server: jdbc:sqlserver://host:port;databaseName=dbname

3. 執行 SQL 語句

Statement 介面三大核心方法:

推薦使用 PreparedStatement 防止 SQL 注入:

String sql = "SELECT * FROM users WHERE username = ? AND status = ?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
    ps.setString(1, "admin");
    ps.setInt(2, 1);
    try (ResultSet rs = ps.executeQuery()) {
        while (rs.next()) {
            System.out.println(rs.getString("username") + " - " + rs.getInt("id"));
        }
    }
}

4. 處理結果集

try (ResultSet rs = stmt.executeQuery("SELECT id, name FROM users")) {
    while (rs.next()) {
        int id = rs.getInt("id");           // 或 rs.getInt(1)
        String name = rs.getString("name"); // 或 rs.getString(2)
        System.out.println(id + ": " + name);
    }
}

ResultSet 常用導航方法:next()、previous()、first()、last()、absolute(row)、beforeFirst()、afterLast()

5. 關閉資源(關鍵)

必須在 finally 區塊或使用 try-with-resources (JDK 7+) 確保資源釋放:


// JDK 7+ 推薦寫法:自動關閉
try (Connection conn = DriverManager.getConnection(url, user, password);
     PreparedStatement ps = conn.prepareStatement(sql);
     ResultSet rs = ps.executeQuery()) {
    
    // 業務邏輯
} catch (SQLException e) {
    e.printStackTrace();
}

// 傳統寫法(JDK 6 或需兼容)
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
    conn = DriverManager.getConnection(url, user, password);
    ps = conn.prepareStatement(sql);
    rs = ps.executeQuery();
    // 處理結果
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    closeQuietly(rs);
    closeQuietly(ps);
    closeQuietly(conn);
}

private static void closeQuietly(AutoCloseable closeable) {
    if (closeable != null) {
        try { closeable.close(); } catch (Exception ignored) {}
    }
}

生產環境最佳實踐:連接池與工具類

為什麼需要連接池?

  • 頻繁創建/銷毀連接開銷大,影響效能
  • 無限制創建連接可能耗盡資料庫連接數
  • 連接池提供連接復用、超時管理、洩漏檢測等功能

主流連接池對比

方法適用場景返回值
executeQuery(sql)DQL 查詢ResultSet
executeUpdate(sql)DML (INSERT/UPDATE/DELETE)影響行數 (int)
execute(sql)任意 SQL,常用於 DDLboolean (是否有 ResultSet)

DBUtil 工具類封裝範例(含屬性檔配置)

config.properties

driverClassName=com.mysql.cj.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
username=root
password=123456
maxActive=20
maxWait=3000

DBUtil.java

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class DBUtil {
    private static HikariDataSource dataSource;
    
    static {
        try {
            Properties props = new Properties();
            try (InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("config.properties")) {
                props.load(is);
            }
            
            HikariConfig config = new HikariConfig();
            config.setDriverClassName(props.getProperty("driverClassName"));
            config.setJdbcUrl(props.getProperty("jdbcUrl"));
            config.setUsername(props.getProperty("username"));
            config.setPassword(props.getProperty("password"));
            config.setMaximumPoolSize(Integer.parseInt(props.getProperty("maxActive", "20")));
            config.setConnectionTimeout(Long.parseLong(props.getProperty("maxWait", "3000")));
            
            dataSource = new HikariDataSource(config);
        } catch (Exception e) {
            throw new ExceptionInInitializerError("資料庫連接池初始化失敗: " + e.getMessage());
        }
    }
    
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
    
    public static void close(AutoCloseable... closeables) {
        for (AutoCloseable c : closeables) {
            if (c != null) {
                try { c.close(); } catch (Exception ignored) {}
            }
        }
    }
}

使用範例

public class UserDao {
    public User findById(int id) {
        String sql = "SELECT * FROM users WHERE id = ?";
        try (Connection conn = DBUtil.getConnection();
             PreparedStatement ps = conn.prepareStatement(sql)) {
            
            ps.setInt(1, id);
            try (ResultSet rs = ps.executeQuery()) {
                if (rs.next()) {
                    User user = new User();
                    user.setId(rs.getInt("id"));
                    user.setName(rs.getString("name"));
                    return user;
                }
            }
        } catch (SQLException e) {
            throw new RuntimeException("查詢失敗", e);
        }
        return null;
    }
}

常見問題排查

連接池特點適用場景
HikariCP效能最優、輕量、預設 Spring Boot 2.x高併發、生產首選
Druid阿里開源、監控強大、SQL 防注入需要詳細監控的企業級應用
DBCP2Apache 老牌、穩定傳統項目維護
c3p0老牌、功能全但效能一般老舊項目
問題可能原因解決方案
Communications link failure網路不通、資料庫未啟動、防火牆攔截檢查主機/端口、啟動資料庫、放行防火牆
Access denied for user帳號密碼錯誤、權限不足、主機限制確認憑證、授權 GRANT、允許遠程連接
Connection refused資料庫服務未啟動、端口錯誤啟動服務、確認端口配置
No suitable driver驅動未加載、URL 格式錯誤加入驅動 JAR、修正 URL

總結

掌握 JDBC 基礎流程是 Java 後端開發的必備技能。生產環境務必使用成熟連接池(推薦 HikariCP),封裝通用工具類,統一異常處理與資源關閉邏輯,才能構建穩定高效的資料存取層。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved