經典三層架構演示:JSP 前端 → Servlet 控制器 → JDBC 數據訪問 → Oracle 數據庫。適用於傳統 Java Web 應用維護與教學場景。
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class DatabaseServlet extends HttpServlet {
private static final String DRIVER = "oracle.jdbc.driver.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 request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=GB2312");
PrintWriter out = response.getWriter();
out.println("Servlet 連接 Oracle 演示 ");
out.println("數據庫查詢結果
");
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 1. 加載驅動
Class.forName(DRIVER).newInstance();
// 2. 建立連接
conn = DriverManager.getConnection(URL, USER, PASS);
// 3. 創建語句
stmt = conn.createStatement();
// 4. 執行查詢
String sql = "SELECT * FROM data";
rs = stmt.executeQuery(sql);
// 5. 處理結果集
displayResult(rs, out);
} catch (Exception e) {
out.println("錯誤: " + e.toString() + "
");
e.printStackTrace();
} finally {
// 6. 關閉資源(逆序)
closeQuietly(rs);
closeQuietly(stmt);
closeQuietly(conn);
}
out.println("");
out.close();
}
private void displayResult(ResultSet rs, PrintWriter out) throws SQLException {
ResultSetMetaData meta = rs.getMetaData();
int columnCount = meta.getColumnCount();
// 表頭
out.println("");
out.println("");
for (int i = 1; i <= columnCount; i++) {
out.println("" + meta.getColumnLabel(i) + " ");
}
out.println(" ");
// 數據行(最多 100 行)
int rowCount = 0;
while (rs.next() && rowCount < 100) {
out.println("");
for (int i = 1; i <= columnCount; i++) {
out.println("" + rs.getString(i) + " ");
}
out.println(" ");
rowCount++;
}
out.println("
");
if (rowCount == 100) {
out.println("僅顯示前 100 行...
");
}
}
private void closeQuietly(AutoCloseable resource) {
if (resource != null) {
try { resource.close(); } catch (Exception ignored) {}
}
}
}
<%@ page contentType="text/html;charset=UTF-8" %>
調用 Servlet 查詢數據庫
Oracle 數據庫查詢演示
DatabaseServlet
DatabaseServlet
DatabaseServlet
/servlet/DatabaseServlet
ojdbc6.jar 或 ojdbc8.jar 放入 WEB-INF/libjavac -cp servlet-api.jar:ojdbc6.jar DatabaseServlet.javawebapps/your-app/WEB-INF/classes/// 老式(JDBC 4.0 前):顯式加載
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
// 現代(JDBC 4.0+):SPI 自動發現,無需顯式加載
// 只要驅動 JAR 在 classpath 中即可
Connection conn = DriverManager.getConnection(url, user, pass);
// Thin 驅動(純 Java,推薦)
jdbc:oracle:thin:@host:port:SID
jdbc:oracle:thin:@host:port/service_name
// OCI 驅動(需 Oracle Client)
jdbc:oracle:oci:@tns_name
// Java 7+ try-with-resources 自動關閉
try (Connection conn = DriverManager.getConnection(url, user, pass);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
// 處理數據
}
} catch (SQLException e) {
// 異常處理
}
ResultSetMetaData meta = rs.getMetaData();
int cols = meta.getColumnCount();
for (int i = 1; i <= cols; i++) {
String name = meta.getColumnLabel(i); // 列別名
String type = meta.getColumnTypeName(i); // 數據類型
int precision = meta.getPrecision(i); // 精度
int scale = meta.getScale(i); // 小數位
boolean nullable = meta.isNullable(i) == ResultSetMetaData.columnNullable;
}
| 問題 | 原因 | 解決 |
|---|---|---|
| ClassNotFoundException | 驅動 JAR 不在 classpath | 放入 WEB-INF/lib、檢查部署 |
| ORA-12541: TNS:no listener | 監聽器未啟動/端口錯誤 | 檢查 listener.ora、tnsping 測試 |
| ORA-01017: invalid username/password | 用戶名密碼錯誤 | 確認賬號、鎖定狀態、大小寫 |
| 中文亂碼 | 字符集不匹配 | 設置 NLS_LANG、JDBC URL 加 characterEncoding |
| 連接洩漏 | 未正確關閉連接 | 使用連接池、try-with-resources |
本文展示了 Servlet + JDBC 連接 Oracle 的完整流程:驅動加載、連接建立、語句執行、結果集處理、資源釋放。雖然現代開發多使用 Spring Boot + MyBatis,但理解底層 JDBC 機制對排查連接池問題、優化 SQL 性能、處理異常場景仍有重要價值。