JAR升级后找不到符号PreparedStatement

时间:2020-08-04 10:50:55

标签: java mysql jdbc jar prepared-statement

我刚刚升级了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中用其他任何类替换它?

enter image description here

2 个答案:

答案 0 :(得分:4)

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

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

解决方案:

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

  2. 更改项目依赖项,以使MySQL驱动程序JAR不是编译时依赖项。这样做将导致对JDBC驱动程序的任何偶然源代码依赖关系都标记为编译错误。它还将阻止您的IDE为import语句提出错误建议。 (我的猜测是,这就是伪造的导入进入您的代码库的方式。)

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


1-您的Java代码不应不需要依赖于MySQL特定的API。据我所知,MySQL实现类反映了标准的JDBC API,因此直接使用它们并不会带来任何好处。并非所有供应商都这样。

答案 1 :(得分:3)

尝试将其替换为:

import java.sql.PreparedStatement;

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

因此,除非需要MySQL特定的功能,否则最好使用与数据库无关的接口java.sql.PreparedStatement。另请参见this