ojdbc6.jar(JDK 6/7/8 通用)$ORACLE_HOME/jdbc/lib/ojdbc6.jar,如 D:\Oracle\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6.jarojdbc6.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 範例
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()) { ... }