【问题标题】:cannot find symbol PreparedStatement after JAR upgradeJAR 升级后找不到符号 PreparedStatement
【发布时间】:2020-11-24 10:57:18
【问题描述】:

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

【问题讨论】:

  • 你的意思是java.sql.PreparedStatement
  • @khelwood - 你能帮忙理解一下吗?你的意思是 import com.mysql.jdbc.* 现在用新的 JAR 文件替换为 import java.sql.* 吗? (我不是专业的 Java 开发人员,所以不太了解这个包的变化。)
  • 不,我的意思是我在 Java 中唯一使用过的 PreparedStatement 类型是 java.sql.PreparedStatement,也许这就是您要寻找的类型。
  • 实际上我的项目中有import com.mysql.jdbc.PreparedStatement;,在我将JDBC连接jar文件升级到mysql-connector-java-8.0.21.jar之前它工作正常。它的分辨率是多少
  • import com.mysql.jdbc.PreparedStatement 可能是个错误 - 在使用 JDBC 时,您通常只针对 java.sql 接口进行编码。

标签: java mysql jdbc jar prepared-statement


【解决方案1】:

尝试将其替换为:

import java.sql.PreparedStatement;

使用com.mysql.jdbc.PreparedStatement是mysql特有的,不应该直接导入。

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

【讨论】:

  • 所以你的意思是 import com.mysql.jdbc.* 现在被 import java.sql.* 替换为新的 JAR 文件 mysql-connector-java-8.0.21.jar?
  • @Krunal 导入 java.sql.* 接口而不是 MySQL 实现类总是更好,你现在只是遇到了之前导入错误类的错误,因为 MySQL 移动并重命名了一个MySQL Connector/J 中的很多实现类。
【解决方案2】:

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,因此直接使用它们没有任何好处。并非所有供应商都如此。

【讨论】:

  • 一般来说你是对的,但有时可能需要使用特定于实现的类或接口来访问 JDBC 中未指定的功能(特定于供应商的扩展)。
  • 我不认为 MySQL 是这样的。我记得(咳咳)一些旧的 Oracle JDBC 驱动程序需要你做那种事情。也许 Postgres 也是。
  • MySQL 没有很多,但例如您可能想要转换或解包到 com.mysql.cj.jdbc.JdbcStatement 以访问 setLocalInfileInputStream 方法。 JdbcConnection 接口包含一些方法 - 我认为 - 主要供内部使用,但在某些情况下可能会有所帮助。
猜你喜欢
  • 2019-11-18
  • 2021-11-30
  • 2018-09-07
  • 1970-01-01
  • 2016-09-16
  • 2023-03-29
  • 1970-01-01
  • 2023-01-05
  • 2018-05-10
相关资源
最近更新 更多