基於真實項目中的 GetBookByID 案例,系統梳理 JDBC 開發中最常見的 6 類運行時異常,提供錯誤現象、根因分析與標準化解決方案。
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
String dbUrl = "jdbc:microsoft:sqlserver://localhost:1433";
Connection con = DriverManager.getConnection(dbUrl, "sa", "123");
String sqlStr = "select * from jspBook where bookId=?";
PreparedStatement pst = con.prepareStatement(sqlStr);
pst.setInt(3, 3); // 故意錯誤
ResultSet rs = pst.executeQuery();
while(rs.next()){
String book_id = rs.getString("bookId");
String book_name = rs.getString("book_name");
}
java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver
根因:SQL Server 的 3 個驅動 jar 包未加入項目 Classpath。
解決:
1. 項目建立 lib 目錄
2. 複製 msbase.jar、mssqlserver.jar、msutil.jar 至 lib
3. 右鍵項目 → Build Path → Configure Build Path → Libraries → Add JARs 選中三個文件
java.sql.SQLException: 用戶 'sa' 登錄失敗
根因:用戶名/密碼錯誤,或 sa 賬戶被禁用。
解決:
1. 企業管理器 → 安全性 → 登錄 → sa → 屬性 → 重置密碼
2. 確認 SQL Server 混合認證模式已啟用
3. 代碼中使用正確憑證
java.sql.SQLException: Invalid parameter binding(s)
at ... BasePreparedStatement.setInt(Unknown Source)
at GetBookByID.main(GetBookByID.java:32) // pst.setInt(3, 3)
根因:SQL 只有 1 個佔位符 ?,索引從 1 開始,代碼卻傳了 3。
解決:pst.setInt(1, 3); // 正確索引
java.sql.SQLException: 對象名 'jspBook' 無效
根因:
① JDBC URL 缺少 databaseName 參數,默認連 master 庫
② 目標庫中表名實為 book 而非 jspBook
解決:
1. URL 補全:jdbc:microsoft:sqlserver://localhost:1433;databaseName=YourDB
2. SQL 修正:select * from book where bookId=?
java.sql.SQLException: 列名 'bookId' 無效
根因:表 book 中實際列名為 book_Id (含下劃線)。
解決:SQL 改為 select * from book where book_Id=?,或代碼中 rs.getString("book_Id")。
java.sql.SQLException: Value can not be converted to requested type
at ... BaseResultSet.getInt(Unknown Source)
at GetBookByID.main(GetBookByID.java:39) // int book_name = rs.getInt("book_name")
根因:數據庫 book_name 是 varchar(40),代碼嘗試用 getInt() 讀取。Java 不支持 String → int 自動轉換。
解決:String book_name = rs.getString("book_name"); // 類型必須完全匹配
setXxx(1, val) 對應第一個 ?getString 讀 varchar,getInt 讀 int,getDate 讀 datetimefinally 塊關閉 ResultSet → Statement → ConnectionJDBC 異常 90% 源於「以為」而非「驗證」:以為驅動在、以為表名對、以為類型匹配。養成「先查元數據、再寫代碼、後驗證 SQL」的習慣,能消除絕大多數低級錯誤。