jdbc 4.0+支持spi自动加载驱动,无需class.forname();jdbc 4.0前需手动调用class.forname()或drivermanager.registerdriver()注册驱动。

在较老版本的 Java(JDBC 4.0 之前)中,需要显式调用 Class.forName() 或 DriverManager.registerDriver() 来加载并注册数据库驱动;但从 JDBC 4.0(对应 Java 6)开始,DriverManager 会自动发现并加载 classpath 中符合 SPI 规范的驱动类,因此绝大多数情况下无需手动注册。
自动加载(推荐,JDBC 4.0+)
只要驱动 JAR 包(如 mysql-connector-java-8.x.x.jar 或 postgresql-42.x.x.jar)在 classpath 中,且驱动实现了 java.sql.Driver 并在 META-INF/services/java.sql.Driver 文件中声明了实现类,DriverManager 就会在首次调用 getConnection() 时自动加载它。
- 确保驱动 JAR 已正确添加到项目依赖(Maven/Gradle)或 classpath
- 直接使用
DriverManager.getConnection(url, user, password)即可 - 例如 MySQL 8+:
jdbc:mysql://localhost:3306/test?serverTimezone=UTC
手动注册驱动(兼容旧环境或特殊场景)
如果运行在旧版 JDK(如 Java 5),或需动态切换驱动、验证驱动可用性等,可手动注册:
- 使用
Class.forName("com.mysql.cj.jdbc.Driver")—— 触发静态代码块注册(MySQL 8+ 推荐写法) - 或显式调用
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver())(不推荐,易重复注册) - 注意:MySQL 5.x 使用
com.mysql.jdbc.Driver,8.x 起改用com.mysql.cj.jdbc.Driver
检查驱动是否已注册
可通过以下方式确认驱动是否被 DriverManager 管理:
-
DriverManager.getDrivers()返回已注册驱动的 Enumeration -
DriverManager.getDriver(url)尝试匹配 URL 对应的已注册驱动(若未注册会抛SQLException) - 常见错误
No suitable driver found通常意味着驱动未加载或 URL 格式不匹配
注意事项与常见问题
避免重复注册导致资源浪费或异常;不要混用新旧驱动类名;URL 参数要与驱动版本匹配(如 MySQL 8+ 必须加 serverTimezone 或 useSSL=false 等)。
现代应用更推荐使用连接池(如 HikariCP、Druid)替代直连 DriverManager,它们内部也基于自动加载机制,并提供连接复用、监控等能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











