Connection 封裝單一資料庫連線,包含該連線上執行的 SQL 語句與結果。應用可對單一資料庫建立多連線,或連接多個資料庫。
String url = "jdbc:odbc:wombat";
Connection con = DriverManager.getConnection(url, "oboy", "12Java");
DriverManager 遍歷已註冊驅動,尋找支援該 URL 的驅動建立連線。
protocol:subprotocol:subname (JDBC 固定協議為 jdbc):
odbc 保留給 JDBC-ODBC Bridge)。//hostname:port/subprotocol。範例:
jdbc:odbc:fred // 本地 ODBC 資料源
jdbc:dcenaming:accounts-payable // DCE 命名服務解析邏輯名稱
jdbc:dbnet://wombat:356/fred // 網路協議 dbnet 連接遠端主機
允許屬性值對:jdbc:odbc:<資料源>[;<屬性>=<值>]*
jdbc:odbc:wombat;CacheSize=20;ExtensionCase=LOWER
jdbc:odbc:qeora;UID=kgh;PWD=fooey
驅動開發者可向 Sun 申請保留子協議名稱 (如 miracle 給 Miracle DBMS),避免衝突。郵件至 jdbc@wombat.eng.sun.com 申請。
Connection 提供三個工廠方法:
| 介面 | 建立方法 | 用途 |
|---|---|---|
Statement | createStatement() | 簡單 SQL (無參數) |
PreparedStatement | prepareStatement(sql) | 帶 IN 參數的預編譯 SQL,重複執行效率高 |
CallableStatement | prepareCall(sql) | 呼叫預存程序,支援 IN/OUT/INOUT 參數 |
選擇指南:無參數用 createStatement;有 IN 參數或頻繁執行用 prepareStatement;呼叫預存程序用 prepareCall。
每條語句執行完自動 commit(),單語句即一交易。
con.setAutoCommit(false) 關閉自動提交,交易延遲至顯式呼叫 commit() 或 rollback(),包含上次提交/回滾以來所有語句。
優勢:多語句原子性——全成或全敗。範例:兩筆更新同成敗:
con.setAutoCommit(false);
try {
stmt.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
stmt.executeUpdate("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
con.commit(); // 雙雙生效
} catch (SQLException e) {
con.rollback(); // 雙雙復原
}
並發交易衝突類型:髒讀 (讀未提交)、不可重複讀、幻讀。JDBC 定義五級隔離 (介面常數):
| 等級常數 | 髒讀 | 不可重複讀 | 幻讀 | 並發度 |
|---|---|---|---|---|
TRANSACTION_NONE | - | - | - | 最高 (不支援交易) |
TRANSACTION_READ_UNCOMMITTED | 允許 | 允許 | 允許 | 最高 |
TRANSACTION_READ_COMMITTED | 防止 | 允許 | 允許 | 高 |
TRANSACTION_REPEATABLE_READ | 防止 | 防止 | 允許 | 中 |
TRANSACTION_SERIALIZABLE | 防止 | 防止 | 防止 | 最低 (完全序列化) |
設定方式:con.setTransactionIsolation(TRANSACTION_READ_COMMITTED)。新等級對該連線餘下時間生效。
注意:交易中途變更隔離等級會觸發隱性 commit(),**強烈不建議**。單一交易需特殊隔離等級,應在交易開始前設定、結束後復原。
實際支援等級取決於 DBMS 能力,可透過 DatabaseMetaData 查詢。
掌握 JDBC URL 語法規範、三大 Statement 分工、交易原子性控制與隔離等級權衡,是建立穩健資料庫應用的核心能力。讓 DriverManager 處理驅動選擇,專注於交易邏輯與 SQL 優化。