在 JSP 頁面中直連數據庫雖非生產環境最佳實踐 (建議使用連接池 + Servlet/Service 層),但作為原型開發、快速驗證、教學演示的基礎技能至關重要。本文匯總 7 大主流數據庫的驅動類名、JDBC URL 格式、完整 JSP 代碼模板,並針對中文編碼、驅動版本等常見坑點給出註解說明。
<%@ page import="java.sql.*" %>
<%@ page import="javax.sql.*" %>
<%
// 1. 加載驅動 (JDBC 4.0+ 可省略,DriverManager 會自動發現 META-INF/services/java.sql.Driver)
Class.forName("driver.class.Name").newInstance();
// 2. 構建連接 URL
String url = "jdbc:subprotocol:subname";
// 3. 獲取連接
Connection conn = DriverManager.getConnection(url, "user", "password");
// 或使用 Properties 傳遞屬性 (含編碼設置)
// Properties props = new Properties();
// props.put("user", "user"); props.put("password", "pwd"); props.put("characterEncoding", "UTF-8");
// Connection conn = DriverManager.getConnection(url, props);
// 4. 創建 Statement (可滾動、可更新)
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE
);
// 5. 執行查詢
ResultSet rs = stmt.executeQuery("SELECT * FROM test_table");
// 6. 處理結果集
while (rs.next()) {
out.println("欄位1: " + rs.getString(1) + " <br>");
out.println("欄位2: " + rs.getString(2) + " <br>");
}
// 7. 關鍵:finally 關閉資源 (逆序)
rs.close(); stmt.close(); conn.close();
%>
| 數據庫 | 驅動類名 | JDBC URL 格式 | 關鍵參數/注意事項 |
|---|---|---|---|
| Oracle 8/8i/9i+ | oracle.jdbc.driver.OracleDriver (舊)oracle.jdbc.OracleDriver (新, 10g+) |
jdbc:oracle:thin:@host:port:SIDjdbc:oracle:thin:@//host:port/service_name (10g+ 推薦) |
Thin 模式無需客戶端。SID vs Service Name。 編碼: URL 添加 ?characterEncoding=UTF-8 或屬性傳遞。 |
| SQL Server 7.0/2000 | com.microsoft.jdbc.sqlserver.SQLServerDriver (Microsoft 老驅動) |
jdbc:microsoft:sqlserver://host:1433;DatabaseName=dbname |
默認端口 1433。注意:Microsoft 老驅動已停維護,生產環境請用 com.microsoft.sqlserver.jdbc.SQLServerDriver (sqljdbc4.jar+)。 |
| DB2 | com.ibm.db2.jdbc.app.DB2Driver (本地/Type 2)com.ibm.db2.jcc.DB2Driver (通用/Type 4, jcc.jar) |
jdbc:db2://host:50000/dbname (Type 4) |
Type 2 需安裝 DB2 客戶端。Type 4 純 Java 推薦。默認端口 50000。 |
| Informix | com.informix.jdbc.IfxDriver |
jdbc:informix-sqli://host:port/dbname:INFORMIXSERVER=server_name;user=usr;password=pwd |
URL 含實例名 INFORMIXSERVER。驅動通常在 ifxjdbc.jar / ifxjdbcx.jar (XA)。 |
| Sybase ASE | com.sybase.jdbc4.jdbc.SybDriver (JDBC 4, jConnect 7+) |
jdbc:sybase:Tds:host:port/dbname |
推薦使用 Properties 傳遞 user/password。jConnect 版本需與 ASE 版本匹配。 |
| MySQL | com.mysql.cj.jdbc.Driver (8.0+, mysql-connector-java 8.x)com.mysql.jdbc.Driver (5.1, 舊版) |
jdbc:mysql://host:3306/dbname?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai |
關鍵參數:useUnicode=true&characterEncoding=UTF-8 解決中文亂碼useSSL=false (開發環境)serverTimezone (8.0+ 必填避免時區錯誤)allowPublicKeyRetrieval=true (8.0+ 新認證) |
| PostgreSQL | org.postgresql.Driver |
jdbc:postgresql://host:5432/dbname |
默認端口 5432。驅動 postgresql-x.x.x.jar。支持 URL 參數 ?currentSchema=myschema 指定 Schema。 |
<%@ page contentType="text/html;charset=UTF-8" import="java.sql.*" %>
<%
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/mydb?" +
"useUnicode=true&characterEncoding=UTF-8&" +
"useSSL=false&serverTimezone=Asia/Shanghai&" +
"allowPublicKeyRetrieval=true";
String user = "root";
String pwd = "123456";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName(driver).newInstance();
conn = DriverManager.getConnection(url, user, pwd);
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery("SELECT id, name, email FROM users");
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("<font color='red'>錯誤: " + e.getMessage() + "</font>");
e.printStackTrace();
} finally {
try { if (rs != null) rs.close(); } catch (Exception ignore) {}
try { if (stmt != null) stmt.close(); } catch (Exception ignore) {}
try { if (conn != null) conn.close(); } catch (Exception ignore) {}
}
%>
characterEncoding;Oracle 需確保數據庫/表/列字符集一致 (AL32UTF8);JSP 頁面指令 contentType="text/html;charset=UTF-8"。serverTimezone=Asia/Shanghai 及 allowPublicKeyRetrieval=true (非 SSL 時)。PreparedStatement。context.xml),JSP 中 ctx.lookup("jdbc/mydb") 獲取。UserDao.findAll()。掌握各數據庫 JDBC URL 格式、驅動類名、關鍵連接參數,是 Java Web 開發者的基本功。本文提供的模板可直接用於快速驗證連通性、表結構查看、原型開發。切記:生產環境禁用 JSP 直連,必須使用連接池、分層架構、參數化查詢。