Что именно делает класс 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 и регистрирует только драйвер