Технически это происходит обычно так. Когда вы вызываете
Class.forName("...")
, JVM подгружает этот класс и вызывает статический инициализатор этого класса. В случае с JDBC драйверами они, как правило, там вызывают статический метод
DriverManager.registerDriver(...)
и регистрируют сами себя (
пример для mysql). Регистрация представляет собой просто сохранение во внутреннем статическом списке. Далее, когда вы вызываете
DriverManager.getConnection(jdbcUrl)
, DriverManager по этой
jdbcUrl
ищет подходящий драйвер (дёргая метод
acceptsURL
, который должны реализовывать все драйверы), далее подключается с помощью метода
connect
этого драйвера. Конечно, есть ещё много нюансов, особенно если касаться web приложений.
Чтобы вызывали
Class.forName("...").newInstance()
я не видел, это вроде ничем не отличается от просто
new com.mysql.jdbc.Driver()
.
Собственно, ответ на вопрос: да, конечно нужен. Драйвер реализует общение приложения с базой данных (т.е. передачу SQL запросов в БД и возврат результатов), без него никак. Если вы не видите, что класс драйвера и его настройки прописаны явно, скорее всего где то во внутренностях кода/ресурсов они всё таки есть.