@WebServlet("/dbQuery")
public class OracleQueryServlet extends HttpServlet {
private static final String DRIVER = "oracle.jdbc.OracleDriver";
private static final String URL = "jdbc:oracle:thin:@192.168.1.6:1521:PC6";
private static final String USER = "ndb";
private static final String PASS = "ndb";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.println("Oracle Query ");
out.println("資料查詢結果
");
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 1. 載入驅動 (JDBC 4.0+ 可省略)
Class.forName(DRIVER);
// 2. 建立連線
conn = DriverManager.getConnection(URL, USER, PASS);
// 3. 執行查詢
stmt = conn.createStatement();
String sql = "SELECT * FROM DATA";
rs = stmt.executeQuery(sql);
// 4. 顯示結果 (HTML 表格)
ResultSetMetaData meta = rs.getMetaData();
int colCount = meta.getColumnCount();
out.println("");
out.print("");
for (int i = 1; i <= colCount; i++) out.print("" + meta.getColumnLabel(i) + " ");
out.println(" ");
int rowCount = 0;
while (rs.next() && rowCount < 100) { // 限制顯示筆數
out.print("");
for (int i = 1; i <= colCount; i++) out.print("" + rs.getString(i) + " ");
out.println(" ");
rowCount++;
}
out.println("
");
out.println("共顯示 " + rowCount + " 筆資料
");
} catch (ClassNotFoundException e) {
out.println("驅動類未找到: " + e.getMessage() + "
");
} catch (SQLException e) {
out.println("資料庫錯誤: " + e.getMessage() + "
");
} finally {
// 5. 關閉資源 (逆序)
closeQuietly(rs);
closeQuietly(stmt);
closeQuietly(conn);
}
out.println("");
}
private void closeQuietly(AutoCloseable c) {
try { if (c != null) c.close(); } catch (Exception ignored) {}
}
}
| 項目 | 建議 |
|---|---|
| 驅動載入 | JDBC 4.0+ 透過 SPI 自動載入,`Class.forName` 可省略;保留可兼容舊環境。 |
| 連線管理 | **生產環境必須使用連線池** (HikariCP/Druid/Tomcat JNDI DataSource),避免頻繁建立/關閉開銷與洩漏。 |
| SQL 注入防護 | 使用 `PreparedStatement` + 參數綁定,絕不拼接字串。 |
| 資源關閉 | Java 7+ `try-with-resources` 自動關閉;舊版用 `finally` + `closeQuietly`。 |
| 編碼 | Oracle 連線屬性 `oracle.jdbc.defaultNChar=true` 處理 NCHAR/NVARCHAR2;URL 加 `?characterEncoding=UTF-8` (MySQL) 或確認 DB/表/欄位字符集一致。 |
| 大數據集 | 設定 `stmt.setFetchSize(1000)` 減少網路交互;或使用游標分頁查詢。 |