2016-01-13 2 views
0

В контексте создания подключения к базе данных мы обычно импортируем требуемые пакеты и используем Class.forName() для загрузки классов драйвера классом-загрузчиком вызывающего класса.Class.forName (Driver.class)

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
.... 
.... 
Class.forName("com.mysql.jdbc.Driver"); 
Connection con=DriverManager.getConnection(...); 

Мы не могу просто упасть Class.forName(), как в этом: -

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import com.mysql.jdbc.*; 
.... 
.... 

Connection con=DriverManager.getConnection(...); 

Мой вопрос, когда зависимости класса загружается тем же загрузчик классов, который загрузил зависимый class, тем же механизмом, который используется с классом.forName (className) неявно, почему нужно явно указывать Class.forName(). Просто включите класс драйвера в оператор импорта. Не будет ли загрузочный класс автоматически загружаться, когда он приведет к строке DriverManager.getConnection()? com.mysql.jdbc находится в инструкции import. Или мне нужно добавить строку, как Аль

Class clazz=com.mysq.jdbc.Driver.class 

, чтобы вызвать Class.forName().

ответ

1

Оператор import ничего не делает во время выполнения. Это даже не часть скомпилированного класса. Он просто сообщает компилятору, где искать вещи.

Линия, подобная Class<?> dummy = com.mysql.jdbc.Driver.class, будет работать, но тогда у вас есть зависимость времени компиляции от файла JAR драйвера MySQL (у которого Class.forName нет, но может быть плохой в великой схеме вещей).

+0

Так как же такая строка, как «Класс манекен», помогает в загрузке класса? Вызывается ли вызов класса.forName() неявным образом? Кто звонит? Или строка просто заменяется классом.forName (com.mysql.jdbc.Driver.class), в соответствии с которым это больше не будет временем слияния времени компиляции? – prvn

+0

Если вы обратитесь к классу, он будет загружен. В случае с драйвером JDBC это все, что вам нужно сделать, чтобы зарегистрировать его с помощью диспетчера драйверов. Когда вы ссылаетесь на класс в коде (например, 'new Arraylist ()' или 'com.mysql.jdbc.Driver.class'), JVM автоматически загрузит класс первым (если это еще не сделано). – Thilo

3

Во-первых, загрузка класса драйвера больше не требуется, поскольку Java имеет встроенный механизм загрузки поставщика услуг, который просматривает файлы jar в пути к классам, чтобы найти доступные драйверы.

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

Вы действительно можете загрузить класс без использования отражения, но это означает, что вам нужно иметь драйвер в качестве зависимости от времени компиляции, что часто нежелательно: вы не должны полагаться на классы базы данных из драйвера, но только на стандартных интерфейсах JDBC. Не уверен, что драйвер в компиляции classpath делает это.

+0

"загрузка класса драйвера больше не требуется". Я никогда не видел эту работу.:-(Это работает только в том случае, если файл JAR драйвера находится в системном классеpath (в отличие от чего-то загруженного динамически)? – Thilo

+1

Я так думаю. Я почти никогда не использую DriverManager и всегда просматриваю пул соединений, поэтому я не имеют много конкретного опыта с ним. –

2

Пока ваш водитель JDBC 4.0 соответствует, вам не нужен Class.forName(). Для ознакомления с этим вопросом, пожалуйста, прочтите introduction on DriverManager JavaDoc.

Из-за этого драйвер все еще должен находиться на пути к классам. Что было верно и для Class.forName() (было бы выбрано ClassNotFoundException)