首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java JDBC 導入包衝突解析:java.sql.Statement vs java.beans.Statement

     編輯:程式設計疑難解答

錯誤現象

Type mismatch: cannot convert from java.sql.Statement to java.beans.Statement
The method executeQuery(String) is undefined for the type Statement

編譯器認為變量 st 是 java.beans.Statement,而該類沒有 executeQuery 方法。

根本原因

代碼中同時導入了 java.sql.* 和 java.beans.*,且聲明 Statement st; 時未使用全限定名,編譯器按字母順序匹配到 java.beans.Statement(Java Bean 規範中的事件監聽接口,與數據庫無關)。

三種修正方案

方案一:刪除錯誤導入(推薦)

// 刪除這行
// import java.beans.*;  

// 保留數據庫相關導入
import java.sql.*;

方案二:使用全限定名聲明

java.sql.Statement st = null;
java.sql.ResultSet rs = null;
// ...
st = ct.createStatement(); // 現在類型明確為 java.sql.Statement
rs = st.executeQuery("SELECT ...");

方案三:單獨導入具體類

import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.DriverManager;
// 不導入 java.beans.*

完整修正後的登錄邏輯片段

try {
    Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 8.0+ 驅動類名
    Connection ct = DriverManager.getConnection(
        "jdbc:mysql://127.0.0.1:3306/studentmanager?useSSL=false&serverTimezone=UTC",
        "root", "123456");

    Statement st = ct.createStatement();
    ResultSet rs = st.executeQuery("SELECT * FROM info WHERE quanxian='老師'");

    while (rs.next()) {
        String user = rs.getString("username"); // 建議用列名而非索引
        String pwd = rs.getString("password");
        // 比對邏輯...
    }
} catch (Exception e) {
    e.printStackTrace();
}

最佳實踐總結

  1. **禁止使用通配符導入**(import pkg.*;),顯式導入每個使用的類。
  2. 使用 IDE(IntelliJ IDEA / Eclipse)的「Organize Imports」功能自動清理。
  3. JDBC 代碼建議遷移到 try-with-resources(Java 7+)自動關閉資源。
  4. SQL 註入風險:生產環境務必使用 PreparedStatement 而非拼接字符串。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved