Что именно делает класс Class.forName( "com.mysql.jdbc.Driver" ). newInstance();

При подключении к базе данных MySQL я выполняю следующие шаги

Connection con = null;
Resultset rs = null;
Statement st = null;
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/database","root","passwp");

На самом деле я хотел знать, что делает оператор Class.forName("com.mysql.jdbc.Driver").newInstance();.

Althogh этот класс не находится в mysql.jar. Где он присутствует?

Ответ 1

Класс Class находится в пакете java.lang, поэтому он распространяется с помощью java и автоматически импортируется в каждый класс.

Что делает метод forName(), просто возвращает объект Class для параметра, загруженного загрузчиком классов. Затем метод newInstance() возвращает новый экземпляр класса.

Итак, что происходит, вы звоните Class.forName(...) он возвращает com.mysql.jdbc.Driver.class. Затем вы вызываете newInstance() в этот класс, который возвращает экземпляр класса без каких-либо параметров, поэтому он в основном вызывает new com.mysql.jdbc.Driver();.

Ответ 2

Инициализирует класс "com.mysql.jdbc.Driver", если он найден в пути к классам, это означает, что драйвер зарегистрирован в диспетчере драйверов JDBC, поскольку процесс регистрации находится внутри статического инициализатора класса драйвера...

Существует другой подход, который вы можете использовать для регистрации драйвера: использовать статический метод DriverManager.registerDriver().

Ответ 3

Он создаст новый экземпляр класса com.mysql.jdbc.Driver и, следовательно, вызовет статическую инициализацию, которая будет регистрировать драйвер с помощью DriverManager, чтобы вы могли создавать соединения mysql на основе URL-адреса, который вы используете во второй строке.

Класс должен быть в mysql.jar.

Ответ 4

Цитата из Спецификация JDBC, глава 9, раздел 2:

Драйверы JDBC должны реализовывать интерфейс драйвера, а реализация должна содержать статический инициализатор, который будет вызываться когда драйвер загружен. Этот инициализатор регистрирует новый экземпляр сам по себе с DriverManager.

И пример кода предоставляется для AcmeJdbcDriver следующим образом:

public class AcmeJdbcDriver implements java.sql.Driver {
    static {
        java.sql.DriverManager.registerDriver(newAcmeJdbcDriver());
    }
}

И когда вы вызываете Class.forName(String className), согласно документации API, происходит следующее:

Вызов forName ( "X" ) вызывает инициализацию класса с именем X.

где инициализация включает код в статическом блоке, который должен быть выполнен.

Итак, вы инициализируете класс драйвера, и, в свою очередь, класс регистрируется с помощью java.sql.DriverManager по спецификации JDBC.

Обратите внимание, что это больше не нужно. Подробности можно найти здесь.

Методы DriverManager getConnection и getDrivers были расширен для поддержки поставщика услуг Java Standard Edition механизм. Драйверы JDBC 4.0 должны включать файл META-INF/услуги/java.sql.Driver. Этот файл содержит имя Драйвер JDBC для java.sql.Driver. Например, чтобы загрузить класс my.sql.Driver, файл META-INF/services/java.sql.Driver будет содержать запись:

my.sql.Driver

Приложениям больше не нужно явно загружать драйверы JDBC, используя Class.forName().

Ответ 5

Создает новый экземпляр класса com.mysql.jdbc.Driver и регистрирует драйвер.

Итак, тогда вы вызываете Class.forName( "com.mysql.jdbc.Driver" ) без "newInstance()", он возвращает класс com.mysql.jdbc.Driver и регистрирует только драйвер