Вопрос по java, jdbc, import, dynamic-loading – Почему JDBC динамически загружается, а не импортируется? [Дубликат]

4

На этот вопрос уже есть ответ:

Почему мы используем Class.forName («oracle.jdbc.driver.OracleDriver») при подключении к базе данных? 7 ответов

В JDBC я вижу только примеры с использованием

Class.forName("com.mysql.jdbc.Driver", true, cl);

и не видел ни одного, использующего

import com.mysql.jdbc.Driver;

Это потому, что мы хотим, чтобы пакет драйвера предоставлялся динамически во время выполнения, поэтому он может быть известен только во время выполнения?

Если у нас есть фиксированный пакет драйверов, известный до выполнения, можно ли пойти вторым путем? Как бы вы сравнили эти два пути?

Благодарность

Можно использовать классы, зависящие от производителя. JDBC API в первую очередь предназначен для обеспечения стандартного способа взаимодействия с базами данных независимым от поставщика и переносимым способом. ernest_k
Ты имеешь в виду использованиеimport com.mysql.jdbc.Driver; означает, что я должен использовать специфичные для vencor классы? Не могуimport com.mysql.jdbc.Driver; использоваться с JDBC API? Tim
Тебе просто не нуженDriver класс напрямую, он не является членом API - просто что-то, что обеспечивает реальные реализации интерфейса. Основной API состоит изDriverManager, Connection, Statement а такжеResultSet. В настоящее время вам не нужно загружатьDriver класс прямо, но используйтеDriverManager#getConnection с правильнымString аргумент. daniu

Ваш Ответ

1   ответ
8

Тогда ты читаешь действительно старые вещи о JDBC. Это уже бесполезно, довольно долго. Этобы необходимо загрузить класс драйвера, чтобы убедиться, что нужный драйвер был загружен и способен обрабатывать соединения с предоставленными URL-адресами базы данных, прежде чем пытаться это сделать.

Абстракции JDBC - это все, что вам нужно для доступа к базе данных, и вам не важно, имеете ли вы дело с драйвером MySQL, драйвером Oracle или чем-то еще. Динамическая загрузка драйвера во время выполнения позволяет удалить файл jar драйвера из пути к классам компиляции и убедиться, что вы полагаетесь только на стандартные классы и интерфейсы JDBC.

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

Class.forName() все еще может быть необходимо, если драйвер не находится на начальном пути к классам. Например, если он упакован в WAR-файл, он находится в пути к классу контекста веб-приложения и должен быть явно загружен. Но опять же, для этих типов приложений следует использоватьjavax.sql.DataSource вместо этого. Mark Rotteveel
1. Официальный учебник JDBC, который отвечает на ваш вопрос, кстати: Docs.oracle.com / JavaSE / учебник / JDBC / Основы / connecting.html. 2. В принципе, вам никогда не нужно загружать и инициализировать класс таким образом. Это был взлом, который больше не используется. JB Nizet
Да, но этот URL может (и часто есть) выводится в некоторый файл свойств. Моя точка зрения такова: вы не должны делать свой код зависимым от конкретного проприетарного класса драйвера, и загрузка класса с использованием отражения для запуска регистрации драйвера была хаком, который был ненужным годами. JB Nizet
Благодарность. (1) Можете ли вы сказать мне, что нового в JDBC? (2) «импорт класса ничего не делает, кроме того, что позволяет вам использовать простое имя класса в вашем коде. Это не эквивалентно загрузке и инициализации класса». Не могли бы вы привести несколько примеров, чтобы показать это, и объяснить, когда мне нужно загрузить и инициализировать класс, а когда нет? Tim
Без использованияClass.forName("com.mysql.jdbc.Driver", ...), воляcom.mysql.jdbc.Driver быть динамически загруженным? Если да, то как? Tim

Похожие вопросы