Ответ
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, оракл ёбаный), нужен провод — он же драйвер. Без провода — нихуя не зарядится, только в розетку смотреть будешь.
И вот этот самый провод-драйвер делает три главных дела, запоминай:
-
Регистрация, или "Я тут, ёпта!". Когда ты кладёшь его JAR-файл в classpath, он такой: "Эй,
DriverManager, я тут! Я умею работать с MySQL! Если увидишь URL типаjdbc:mysql://...— это ко мне, мудакам!". Раньше для этого надо было оратьClass.forName("com.mysql.cj.jdbc.Driver"), но это было в каменном веке. -
Создание соединения, или "Соединяю провода!". Когда твой код вызывает
DriverManager.getConnection(), нужный драйвер вылезает и говорит: "О, это моя тема!". И дальше он сам, по-тихому, устанавливает это самое сетевое соединение с реальной базой — открывает сокеты, авторизуется, всю эту низкоуровневую муть делает. -
Адаптация, или "Переводчик с языка долбоёбов на язык СУБД". Ты в коде пишешь на стандартном JDBC: "Эй,
PreparedStatement, выполни этот запрос!". Драйбер берёт эту твою высокоуровневую хуйню и переводит её в конкретные, часто бинарные, команды, которые понимает именно эта база данных. Он — тот самый переводчик между универсальным JDBC-интерфейсом и диким диалектом конкретной СУБД.
А теперь про современность, чтобы не выглядеть как мамонт:
Если ты используешь драйвер для JDBC 4.0 и выше (а щас уже 2020-е на дворе, Карл!), то ничего явно регистрировать не надо. Серьёзно, забудь про Class.forName(). Просто добавь зависимость в pom.xml (Maven) или build.gradle — и всё. Механизм SPI (Service Provider Interface) в JVM сам найдёт драйвер в classpath и скажет DriverManager-у: "Расслабься, чувак, я всё устроил".
Вот и вся магия. Не API работает с базой, а драйвер, который реализует этот API. Как провод в розетку, ёпта. Без провода — просто интерфейс в воздухе торчит, бесполезный.