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

Java 連線 Oracle 11g 資料庫完整範例:JDBC 驅動配置、PreparedStatement 與資源釋放

     編輯:Java 相關知識

環境準備

  • 資料庫:Oracle 11g Express Edition (XE)
  • JDBC 驅動:ojdbc6.jar(JDK 6/7/8 通用)
  • 驅動路徑:$ORACLE_HOME/jdbc/lib/ojdbc6.jar,如 D:\Oracle\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6.jar

專案加入驅動(Eclipse 範例)

  1. 右鍵專案 → Build Path → Configure Build Path
  2. 選 Libraries 分頁 → Add External JARs
  3. 選取 ojdbc6.jar → 確定

標準連線與查詢程式碼

package com.example.jdbc;

import java.sql.*;

public class OracleJdbcDemo {

    public static void main(String[] args) {
        queryStudent("劉顯安");
    }

    public static void queryStudent(String name) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            // 1. 載入驅動(JDBC 4.0+ 可省略,保留相容)
            Class.forName("oracle.jdbc.driver.OracleDriver");

            // 2. 建立連線
            String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE"; // thin 驅動,SID=XE
            String user = "system";
            String password = "147"; // 安裝時設定的密碼

            conn = DriverManager.getConnection(url, user, password);
            System.out.println("✅ 資料庫連線成功!");

            // 3. 準備參數化查詢
            String sql = "SELECT id, name FROM student WHERE name = ?";
            ps = conn.prepareStatement(sql);
            ps.setString(1, name); // 索引從 1 開始

            // 4. 執行查詢
            rs = ps.executeQuery();

            // 5. 處理結果集
            while (rs.next()) {
                int id = rs.getInt("id");
                String n = rs.getString("name");
                System.out.printf("學號: %d, 姓名: %s%n", id, n);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 6. 逆序關閉資源(後開先關)
            closeQuietly(rs);
            closeQuietly(ps);
            closeQuietly(conn);
            System.out.println("🔒 資料庫連線已關閉");
        }
    }

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

關鍵最佳實踐解析

實踐說明
使用 PreparedStatement預編譯 SQL,防止 SQL 注入、提升重複執行效能、自動處理資料型別轉換。
參數索引從 1 開始ps.setString(1, ...) 對應 SQL 中第一個 ?,非 0 基索引。
executeQuery() 無參數已在 prepareStatement(sql) 綁定 SQL,執行時不再傳 SQL 字串。
資源逆序關閉ResultSet → Statement → Connection,避免資源洩漏與鎖殘留。
finally 保證釋放即使發生例外也會關閉連線,防止連線池耗盡。
JDBC 4.0 自動載入驅動JDK 6+ 只要 JAR 在 classpath,無需 Class.forName,保留以相容舊環境。

常見連線字串變體

// SID 格式(單實例)
jdbc:oracle:thin:@host:port:SID

// Service Name 格式(RAC/PDB)
jdbc:oracle:thin:@//host:port/service_name

// TNSNAMES 別名(需 oracle.net.tns_admin 系統屬性)
jdbc:oracle:thin:@myTnsAlias

// 支援 EZCONNECT 語法(12c+)
jdbc:oracle:thin:@host:port:SID?key=value&key=value

連線池建議(生產環境必備)

不要在生產碼中直接 DriverManager.getConnection,請使用成熟連線池:

  • HikariCP(最快、最輕量,Spring Boot 2+ 預設)
  • Druid(阿里巴巴、監控強、SQL 防火牆)
  • Tomcat JDBC Pool / DBCP2
// HikariCP 範例
HikariConfig cfg = new HikariConfig();
cfg.setJdbcUrl("jdbc:oracle:thin:@127.0.0.1:1521:XE");
cfg.setUsername("system");
cfg.setPassword("147");
cfg.setMaximumPoolSize(20);
DataSource ds = new HikariDataSource(cfg);

// 使用
try (Connection conn = ds.getConnection()) { ... }
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved