本文內容與 ID 110805 高度重複,此處提供**去重優化、補充最佳實踐、修正驅動版本**的精簡版,供快速參考。完整詳細版請參考《JSP 連接主流數據庫完全指南》(ID: 110805)。
<!-- Tomcat context.xml 配置 JNDI DataSource (以 MySQL 為例) -->
<Resource name="jdbc/MyDB"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8mb4&useSSL=false&serverTimezone=Asia/Shanghai"
username="user"
password="pwd"
maxTotal="20"
maxIdle="10"
maxWaitMillis="10000"
/>
JSP 中獲取:
<%@ page import="javax.naming.*, javax.sql.*, java.sql.*" %>
<%
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyDB");
Connection conn = ds.getConnection();
// ... 業務邏輯
conn.close(); // 歸還池,非物理關閉
%>
| 數據庫 | 推薦驅動類名 (最新版) | JDBC URL 模板 | 關鍵參數 |
|---|---|---|---|
| Oracle 11g/12c/19c | oracle.jdbc.OracleDriver (ojdbc8.jar) |
jdbc:oracle:thin:@//host:1521/service_name |
Service Name 優於 SID; oracle.net.CONNECT_TIMEOUT |
| SQL Server 2012+ | com.microsoft.sqlserver.jdbc.SQLServerDriver (mssql-jdbc) |
jdbc:sqlserver://host:1433;databaseName=db;encrypt=true;trustServerCertificate=true |
encrypt=true (Azure/雲必需); trustServerCertificate=true (自簽證書) |
| DB2 11+ | com.ibm.db2.jcc.DB2Driver (jcc.jar / db2jcc4.jar) |
jdbc:db2://host:50000/dbname |
Type 4 純 Java; currentSchema=xxx 指定 Schema |
| MySQL 8.0 | com.mysql.cj.jdbc.Driver (mysql-connector-j 8.x) |
jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useSSL=false&serverTimezone=Asia/Shanghai |
必加 serverTimezone; allowPublicKeyRetrieval=true (非SSL) |
| PostgreSQL 13+ | org.postgresql.Driver (postgresql.jar) |
jdbc:postgresql://host:5432/db?currentSchema=public |
支持 reWriteBatchedInserts=true 批次優化 |
| Sybase ASE 16 | com.sybase.jdbc4.jdbc.SybDriver (jConnect 7+) |
jdbc:sybase:Tds:host:5000/dbname |
Properties 傳 user/password; CHARSET=utf8 |
| Informix 14 | com.informix.jdbc.IfxDriver (ifxjdbc.jar) |
jdbc:informix-sqli://host:port/db:INFORMIXSERVER=myserver |
INFORMIXSERVER 必填; IFX_LOCK_MODE_WAIT=10 |
<%@ page import="java.sql.*, javax.naming.*, javax.sql.*" contentType="text/html;charset=UTF-8" %>
<%
String driver = "com.mysql.cj.jdbc.Driver"; // 修改此處切換數據庫
String url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf8mb4&useSSL=false&serverTimezone=Asia/Shanghai";
String user = "root";
String pwd = "123456";
Connection conn = null;
PreparedStatement pstmt = null; // 推薦 PreparedStatement 防注入
ResultSet rs = null;
try {
// Class.forName(driver); // JDBC 4.0+ 可省略
conn = DriverManager.getConnection(url, user, pwd);
String sql = "SELECT id, name, email FROM users WHERE status = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 1); // 參數化查詢
rs = pstmt.executeQuery();
out.println("<table border='1'><tr><th>ID</th><th>姓名</th><th>郵箱</th></tr>");
while (rs.next()) {
out.println("<tr><td>" + rs.getInt("id") + "</td>" +
"<td>" + rs.getString("name") + "</td>" +
"<td>" + rs.getString("email") + "</td></tr>");
}
out.println("</table>");
} catch (Exception e) {
out.println("<div style='color:red'>錯誤: " + e.getMessage() + "</div>");
e.printStackTrace();
} finally {
// 逆序關閉,單獨 try-catch 確保釋放
try { if (rs != null) rs.close(); } catch (Exception ignore) {}
try { if (pstmt != null) pstmt.close(); } catch (Exception ignore) {}
try { if (conn != null) conn.close(); } catch (Exception ignore) {}
}
%>
掌握各數據庫 JDBC URL 格式、驅動類名、關鍵參數是基本功。**生產環境核心原則:JNDI DataSource + 連接池 + PreparedStatement + 事務邊界清晰 + 異常處理完善**。本文提供的模板僅作為快速驗證連通性、表結構的起點,請務必遷移至分層架構。