JAR 升级后找不到符号 PreparedStatement

cannot find symbol PreparedStatement after JAR upgrade

我刚刚升级了 mysql jdbc 连接 JAR(从 mysql-connector-java-5.0.5.jar 到 mysql- connector-java-8.0.19.jar) 并且项目开始显示导入语句错误:

import com.mysql.jdbc.PreparedStatement;

java: cannot find symbol
  symbol:   class PreparedStatement
  location: class package.ClassName 

在哪里可以找到新 jar 文件中 PreparedStatement 的位置或包,或者它是否被新 JAR 中的任何其他 class 替换?

尝试将其替换为:

import java.sql.PreparedStatement;

使用 com.mysql.jdbc.PreparedStatement 特定于 mysql,不应直接导入。

因此,除非您需要 MySQL 特定功能,否则最好使用独立于数据库的界面 java.sql.PreparedStatement。另见 this

com.mysql.jdbc.PreparedStatement 是 MySQL 5.x JDBC 驱动程序的内部 class。您的代码不应导入它。它应该使用标准 java.sql.PreparedStatement class 来代替。

MySQL 8.x JDBC 驱动程序中的包名称已更改,这就是导致您的代码开始出现编译错误的原因。

解决方案:

  1. 修复您的代码,使其不导入任何 MySQL 实现 classes1。请改用 java.sql.*javax.sql.* class。

  2. 更改您的项目依赖项,使 MySQL 驱动程序 JAR 不是 compile-time 依赖项。这样做会导致 意外 对 JDBC 驱动程序的源代码依赖被标记为编译错误。它还会阻止您的 IDE 对 import 语句提出错误的建议。 (我的猜测是这就是伪造导入进入您的代码库的方式。)

  3. 如果您的代码(仍然)使用 Class.forName 来加载 JDBC 驱动程序,请将其改为使用 java.sql.DriverManager;参见 javadoc。这样你就不会被 MySQL 驱动程序 class 名称的另一个变化所困扰。


1 - 您的 Java 代码不应该 需要 依赖于 MySQL-specific API。据我所知,MySQL 实现 classes 反映了标准 JDBC API,因此直接使用它们没有任何好处。并非所有供应商都如此。