首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Servlet 連接 Oracle 數據庫完整實戰:JSP 調用、驅動加載、結果集處理

     編輯:Java 相關知識

架構概覽

經典三層架構演示:JSP 前端 → Servlet 控制器 → JDBC 數據訪問 → Oracle 數據庫。適用於傳統 Java Web 應用維護與教學場景。

核心組件

1. 數據庫訪問 Servlet

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(""); } out.println(""); // 數據行(最多 100 行) int rowCount = 0; while (rs.next() && rowCount < 100) { out.println(""); for (int i = 1; i <= columnCount; i++) { out.println(""); } out.println(""); rowCount++; } out.println("
" + meta.getColumnLabel(i) + "
" + rs.getString(i) + "
"); if (rowCount == 100) { out.println("

僅顯示前 100 行...

"); } } private void closeQuietly(AutoCloseable resource) { if (resource != null) { try { resource.close(); } catch (Exception ignored) {} } } }

2. JSP 調用頁面

<%@ page contentType="text/html;charset=UTF-8" %>

調用 Servlet 查詢數據庫

Oracle 數據庫查詢演示

部署配置

web.xml 註冊 Servlet


    DatabaseServlet
    DatabaseServlet


    DatabaseServlet
    /servlet/DatabaseServlet

依賴準備

  1. Oracle JDBC 驅動:ojdbc6.jar 或 ojdbc8.jar 放入 WEB-INF/lib
  2. 編譯 Servlet:javac -cp servlet-api.jar:ojdbc6.jar DatabaseServlet.java
  3. 部署到 Tomcat:webapps/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

現代化改造建議

  1. 連接池:HikariCP/Druid 替代 DriverManager
  2. ORM 框架:MyBatis/JPA 替代裸 JDBC
  3. 參數化查詢:PreparedStatement 防 SQL 注入
  4. 異常處理:統一異常攔截、友好錯誤頁面
  5. 前後端分離:Servlet 返回 JSON、前端 Vue/React 渲染

總結

本文展示了 Servlet + JDBC 連接 Oracle 的完整流程:驅動加載、連接建立、語句執行、結果集處理、資源釋放。雖然現代開發多使用 Spring Boot + MyBatis,但理解底層 JDBC 機制對排查連接池問題、優化 SQL 性能、處理異常場景仍有重要價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved