Зачем в JDBC подключать драйвер базы данных?

Ответ

JDBC (Java Database Connectivity) — это стандартный API, а не реализация. Чтобы приложение могло работать с конкретной СУБД (MySQL, PostgreSQL и т.д.), ему нужна реализация этого API — драйвер. Драйвер регистрируется в DriverManager и выполняет всю низкоуровневую работу.

Что делает драйвер в контексте JDBC:

  • Регистрация: Сообщает DriverManager, что доступно соединение с определенным типом БД (по URL, например, jdbc:mysql://).
  • Создание соединения: При вызове DriverManager.getConnection() подходящий драйвер устанавливает физическое сетевое соединение.
  • Адаптация: Преобразует стандартные JDBC-интерфейсы (Connection, PreparedStatement) в специфичные для СУБД команды и протоколы.

Современный подход (JDBC 4.0+): Драйверы, соответствующие спецификации JDBC 4.0 и выше, регистрируются автоматически через механизм SPI (Service Provider Interface). Достаточно добавить JAR-файл драйвера в classpath (например, через Maven/Gradle зависимость). Явный вызов Class.forName() больше не требуется.

Ответ 18+ 🔞

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

Представь себе, что JDBC — это как стандартный разъём для зарядки, типа USB-C. Сам по себе разъём — это просто дырка с контактами, API, если угодно. А вот чтобы твой конкретный телефон (это наше приложение) зарядился от конкретной зарядки (это наша СУБД — MySQL, Postgres, оракл ёбаный), нужен провод — он же драйвер. Без провода — нихуя не зарядится, только в розетку смотреть будешь.

И вот этот самый провод-драйвер делает три главных дела, запоминай:

  1. Регистрация, или "Я тут, ёпта!". Когда ты кладёшь его JAR-файл в classpath, он такой: "Эй, DriverManager, я тут! Я умею работать с MySQL! Если увидишь URL типа jdbc:mysql://... — это ко мне, мудакам!". Раньше для этого надо было орать Class.forName("com.mysql.cj.jdbc.Driver"), но это было в каменном веке.

  2. Создание соединения, или "Соединяю провода!". Когда твой код вызывает DriverManager.getConnection(), нужный драйвер вылезает и говорит: "О, это моя тема!". И дальше он сам, по-тихому, устанавливает это самое сетевое соединение с реальной базой — открывает сокеты, авторизуется, всю эту низкоуровневую муть делает.

  3. Адаптация, или "Переводчик с языка долбоёбов на язык СУБД". Ты в коде пишешь на стандартном JDBC: "Эй, PreparedStatement, выполни этот запрос!". Драйбер берёт эту твою высокоуровневую хуйню и переводит её в конкретные, часто бинарные, команды, которые понимает именно эта база данных. Он — тот самый переводчик между универсальным JDBC-интерфейсом и диким диалектом конкретной СУБД.

А теперь про современность, чтобы не выглядеть как мамонт:

Если ты используешь драйвер для JDBC 4.0 и выше (а щас уже 2020-е на дворе, Карл!), то ничего явно регистрировать не надо. Серьёзно, забудь про Class.forName(). Просто добавь зависимость в pom.xml (Maven) или build.gradle — и всё. Механизм SPI (Service Provider Interface) в JVM сам найдёт драйвер в classpath и скажет DriverManager-у: "Расслабься, чувак, я всё устроил".

Вот и вся магия. Не API работает с базой, а драйвер, который реализует этот API. Как провод в розетку, ёпта. Без провода — просто интерфейс в воздухе торчит, бесполезный.