將資料庫連線邏輯封裝為 JavaBean,可在 JSP、Servlet 中透過標籤或依賴注入輕鬆存取資料,實現資料存取層與業務邏輯層分離。本文提供一個以 SQL Server (透過 ODBC) 為例的完整連線 Bean 實作。
| 項目 | 值 |
| ODBC 資料來源名稱 (DSN) | mysql |
| 使用者名稱 | dxaw |
| 密碼 | 123 |
完整原始碼:conndb.java
package conn.db;
import java.sql.*;
public class conndb {
private Connection conn;
private ResultSet rs;
private int count;
// 建構子:載入 JDBC-ODBC 橋接驅動
public conndb() {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch (Exception ex) {
// 建議記錄日誌而非忽略
}
}
// 執行查詢:回傳可捲動、可更新的 ResultSet
public ResultSet executeQuery(String sql) {
try {
conn = DriverManager.getConnection("Jdbc:Odbc:mysql", "dxaw", "123");
Statement stat = conn.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE
);
rs = stat.executeQuery(sql);
} catch (Exception ex1) {
// 建議拋出自訂例外或記錄錯誤
}
return rs;
}
// 執行更新:INSERT、UPDATE、DELETE
public void executeUpdate(String sql) {
try {
conn = DriverManager.getConnection("Jdbc:Odbc:mysql", "dxaw", "123");
Statement stat = conn.createStatement();
// 注意:此處應使用 executeUpdate 而非 executeQuery
stat.executeUpdate(sql);
} catch (Exception ex2) {
// 錯誤處理
}
}
}
關鍵技術點解析
1. JDBC-ODBC 橋接驅動
sun.jdbc.odbc.JdbcOdbcDriver 是 JDK 內建的橋接驅動,透過 ODBC 連接各類資料庫。注意:Java 8 起已移除此驅動,現代專案建議使用原生 JDBC 驅動(如 Microsoft JDBC Driver for SQL Server)。
2. ResultSet 類型與並行模式
TYPE_SCROLL_SENSITIVE:可捲動、對資料變更敏感
CONCUR_UPDATABLE:ResultSet 可直接更新資料庫
3. 部署方式
- 編譯類別檔
- 放置於 Web 應用的
WEB-INF/classes/conn/db/ 目錄
- JSP 頁面引入:
<jsp:useBean id="db" class="conn.db.conndb" scope="page" />
實務改進建議(重要)
⚠️ 此範例存在嚴重問題,生產環境請務必改進:
- 資源洩漏:Connection、Statement、ResultSet 未在 finally 關閉
- 例外吞沒:catch 區塊為空,導致錯誤無法追蹤
- 硬編碼認證:帳密寫死在程式碼,應外部化設定
- SQL 注入風險:直接拼接 SQL 字串,應使用 PreparedStatement
- 執行更新錯誤:
executeUpdate 方法中誤用 executeQuery
- 執行緒不安全:共用連線物件,多執行緒環境下會衝突
改進版架構建議
public class DatabaseBean {
private DataSource dataSource; // 透過 JNDI 注入
public void setDataSource(DataSource ds) { this.dataSource = ds; }
public List<Map<String, Object>> query(String sql, Object... params) {
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
// 設定參數、執行查詢、轉換為 List
結語
雖然原始範例展示了 JavaBean 封裝資料庫邏輯的基本概念,但實務開發中必須解決資源管理、安全性、執行緒安全等核心問題。建議採用成熟框架(Spring JDBC、MyBatis、Hibernate)或至少導入連線池與 PreparedStatement 模式。
- 上一篇文章: NetBeans 整合 JRuby 開發完整指南:從專案建立到測試部署
- 下一篇文章: JavaBean 與 Java Class 的關係深度解析:內省、反射與元件化設計
Copyright ©
程式碼之家 All Rights Reserved