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

JDBC 編程常見運行時錯誤診斷大全:從驅動加載到類型轉換的完整排查指南

     編輯:Java 綜合教學

JDBC 實戰避坑指南:6 大高頻異常深度解析

基於真實項目中的 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");
}

錯誤 1:ClassNotFoundException - 驅動類找不到

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 選中三個文件


錯誤 2:登錄失敗 - 認證信息錯誤

java.sql.SQLException: 用戶 'sa' 登錄失敗

根因:用戶名/密碼錯誤,或 sa 賬戶被禁用。
解決:
1. 企業管理器 → 安全性 → 登錄 → sa → 屬性 → 重置密碼
2. 確認 SQL Server 混合認證模式已啟用
3. 代碼中使用正確憑證


錯誤 3:Invalid parameter binding - 參數索引越界

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); // 正確索引


錯誤 4:對象名 'jspBook' 無效 - 表名錯誤

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=?


錯誤 5:列名 'bookId' 無效 - 列名不匹配

java.sql.SQLException: 列名 'bookId' 無效

根因:表 book 中實際列名為 book_Id (含下劃線)。
解決:SQL 改為 select * from book where book_Id=?,或代碼中 rs.getString("book_Id")。


錯誤 6:Value can not be converted - 類型不匹配

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"); // 類型必須完全匹配


JDBC 開發黃金法則

  1. 驅動先行:構建路徑包含正確版本驅動 jar
  2. URL 精確:必須指定 databaseName,避免誤入 master
  3. 參數從 1 開始:setXxx(1, val) 對應第一個 ?
  4. 元數據核對:表名、列名區分大小寫 (視數據庫配置)
  5. 類型強匹配:getString 讀 varchar,getInt 讀 int,getDate 讀 datetime
  6. 資源關閉:finally 塊關閉 ResultSet → Statement → Connection
  7. 使用連接池:生產環境必須用 HikariCP/Druid 替代 DriverManager

JDBC 異常 90% 源於「以為」而非「驗證」:以為驅動在、以為表名對、以為類型匹配。養成「先查元數據、再寫代碼、後驗證 SQL」的習慣,能消除絕大多數低級錯誤。

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