не удается найти символ PreparedStatement после обновления JAR - PullRequest
2 голосов
/ 04 августа 2020

Я только что обновил mysql jdb c 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 

Где найти расположение или пакет для PreparedStatement в новом файле JAR или он заменен каким-либо другим классом в новом JAR?

введите описание изображения здесь

Ответы [ 2 ]

4 голосов
/ 04 августа 2020

com.mysql.jdbc.PreparedStatement - это внутренний класс для драйвера MySQL 5.x JDB C. Ваш код не должен импортировать его. Вместо этого следует использовать стандартный класс java.sql.PreparedStatement.

Имена пакетов в драйверах MySQL 8.x JDB C были изменены, и именно это привело к тому, что ваш код начал выдавать ошибки компиляции.

Решение:

  1. Исправьте свой код, чтобы он не импортировал какие-либо MySQL классы реализации 1 . Вместо этого используйте классы java.sql.* и javax.sql.*.

  2. Измените зависимости проекта, чтобы JAR-файл драйвера MySQL не был зависимостью во время компиляции. Это приведет к тому, что любые случайные зависимости исходного кода от драйверов JDB C будут отмечены как ошибки компиляции. Это также помешает вашей среде IDE делать неправильные предложения для операторов import. (Я предполагаю, что именно так фальшивый импорт попал в вашу базу кода.)

  3. Если ваш код (все еще) использует Class.forName для загрузки драйвера JDB C, измените вместо этого использовать java.sql.DriverManager; см. javado c. Таким образом, вы не будете поражены другим изменением имени класса MySQL драйвера.

1 - Ваш код Java не должен должен зависеть от MySQL -specifi c API. Насколько мне известно, классы реализации MySQL отражают стандартные API-интерфейсы JDB C, поэтому вы ничего не получите, используя их напрямую. Это не относится ко всем поставщикам.

3 голосов
/ 04 августа 2020

Попробуйте заменить его на:

import java.sql.PreparedStatement;

Использование com.mysql.jdbc.PreparedStatement указано c в mysql, и его не следует импортировать напрямую.

Так что, если вам не нужно MySQL specifici c features, всегда лучше использовать интерфейс java.sql.PreparedStatement, который не зависит от базы данных. См. Также this .

...