如何准备JDBC和MySQL连接数据库的驱动?,步骤有哪些?
- 云服务器
- 2026-08-10
- 6
JDBC连接MySQL数据库,第一步永远是准备好对应的驱动(Driver),这一步做不对,后面写再多代码也会直接在加载驱动时报ClassNotFoundException。
JDBC驱动到底是什么
JDBC(Java Database Connectivity)是Java访问数据库的标准接口,但它本身只是一套规范,不包含任何具体数据库的实现逻辑,真正和MySQL通信的,是MySQL官方提供的驱动实现,也就是一个jar包,这个jar包内部实现了JDBC接口,负责把Java代码里的SQL语句翻译成MySQL能理解的协议,再把结果集翻译回Java对象。
驱动版本和MySQL服务端版本需要匹配,MySQL 5.7时代普遍用Connector/J 5.1.x系列,MySQL 8.0之后官方推荐使用Connector/J 8.0.x系列,两者的驱动类名都不同,这一点在写连接代码之前就要确认清楚。
驱动获取的三种方式
Maven依赖引入
绝大多数Java项目已经使用Maven或Gradle管理依赖,直接在pom.xml中加入:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>
注意groupId和artifactId在较新版本中略有变动,MySQL官方在8.0.31之后把groupId从mysql改成了com.mysql,artifactId从mysql-connector-java改成了mysql-connector-j,如果拉取失败,检查一下仓库中的实际坐标。
Gradle项目则对应:
implementation 'com.mysql:mysql-connector-j:8.0.33'
Maven会自动处理依赖传递,无需手动下载jar包,这种方式最推荐,因为版本管理统一,团队协作时不会出现”我本地能跑你本地报错”的经典问题。
手动下载jar包
项目没有使用构建工具,或者用的是传统war包部署方式,就去MySQL官网下载Connector/J,下载页面选择Platform Independent版本,解压后把mysql-connector-j-x.x.x.jar复制到WEB-INF/lib目录下,或者Java项目的classpath中。
手动下载需要注意:解压目录里通常包含两个jar包,一个带mysql-sources后缀的是源码包,另一个不带的是编译好的二进制包,很多新手把源码包丢进classpath,结果运行时照样报找不到驱动类。
容器环境特殊处理
如果部署在Tomcat等Servlet容器中,且使用了数据库连接池(如DBCP、C3P0),驱动jar包需要放在容器全局的lib目录(如Tomcat的lib/文件夹),而不是项目WEB-INF/lib下,这样连接池才能通过JNDI方式加载驱动,放在项目里反而可能导致ClassNotFound或NoClassDefFoundError。

驱动加载代码的演进
传统写法
Class.forName("com.mysql.jdbc.Driver");
这段代码在MySQL 5.x时代是标准写法,作用是让JVM加载驱动类,触发DriverManager注册驱动的静态代码块,8.0版本之后驱动类名变成了:
Class.forName("com.mysql.cj.jdbc.Driver");
如果继续用旧类名,会直接提示找不到类。
现代写法
JDBC 4.0之后引入了SPI机制,MySQL驱动jar包的META-INF/services目录下包含了java.sql.Driver的实现类声明,DriverManager会自动加载,所以在较新版本中,Class.forName这一步可以省略,但实际项目中,保留这行代码没有坏处,反而能让人一眼看出驱动加载逻辑,排查问题更直观。
验证驱动是否加载成功
DriverManager.getDrivers();
遍历返回的Enumeration
连接URL的构造细节
驱动准备好之后,连接URL的格式同样决定成败,MySQL 8.x的标准格式:
jdbc:mysql://localhost:3306/databaseName?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8
各部分含义:
- jdbc:mysql是子协议,固定写法
- localhost:3306对应MySQL服务地址和端口,生产环境换成实际IP
- databaseName是目标库名
- useSSL=false:本机开发时关闭SSL加密,生产环境建议开启并配置证书
- serverTimezone=Asia/Shanghai:MySQL 8.x必填参数,不设置会报时区错误
- characterEncoding=utf8:指定字符集,避免中文乱码
关于时区参数,MySQL 8.x服务端默认时区是UTC,和我们的东八区差了8小时,不设置serverTimezone会在连接时直接抛异常,异常信息会明确提示需要设置时区。

完整连接示例
import java.sql.Connection; import java.sql.DriverManager; public class JdbcDemo { public static void main(String[] args) throws Exception { Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/test_db" + "?useSSL=false&serverTimezone=Asia/Shanghai"; Connection conn = DriverManager.getConnection(url, "root", "password"); System.out.println(conn.getClass().getName()); conn.close(); } }
运行后控制台输出com.mysql.cj.jdbc.ConnectionImpl,说明驱动加载、连接建立全部成功,如果卡在连接阶段迟迟不返回,优先检查防火墙是否放行了3306端口,以及MySQL的bind-address配置是否允许远程连接。
驱动版本选择的实际考量
版本兼容性
MySQL官方文档中,Connector/J 8.0.x兼容MySQL 5.6、5.7、8.0全系列,Connector/J 5.1.x兼容MySQL 5.5、5.6、5.7,如果服务端是MySQL 8.0,用5.1.x驱动连接虽然能成功,但无法使用caching_sha2_password新认证插件,需要在MySQL端降低认证方式,安全性打了折扣。
驱动类名与协议差异
x驱动类名中多了cj段,对应的连接协议也做了调整,某些老框架(如MyBatis 3.4.x之前的版本)对8.x驱动的支持不完善,需要同时升级框架版本,技术选型时要整体评估,不能只看驱动本身。
驱动获取过程中的典型报错
ClassNotFoundException
报错信息:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
排查顺序:jar包是否在classpath中,Maven依赖是否成功下载,驱动类名是否拼写正确,多数情况是jar包没引入,或者用旧类名连接MySQL 8.x。
Communications link failure
报错信息:
Communications link failure. The last packet successfully received from the server was 0 milliseconds ago.
驱动已经加载成功,但连不上MySQL服务,检查MySQL进程是否运行、端口是否被占用、防火墙规则、MySQL配置中的skip-networking是否开启。
Public Key Retrieval is not allowed
使用caching_sha2_password认证时,如果连接参数没设置allowPublicKeyRetrieval=true,会报这个错,本地开发环境可以加上该参数,生产环境建议用SSL方式解决。

生产环境部署的驱动管理建议
使用连接池统一管理
生产环境绝不应该手动创建Connection,而是交给连接池(HikariCP、Druid),连接池的初始化配置里需要指定驱动类名、连接URL、账号密码,HikariCP的推荐配置:
driverClassName=com.mysql.cj.jdbc.Driver jdbcUrl=jdbc:mysql://xxx:3306/db?useSSL=true&serverTimezone=Asia/Shanghai maximumPoolSize=20 minimumIdle=5 connectionTimeout=30000
服务器部署时的驱动和网络保障
线上应用服务器和数据库服务器通常分机部署,驱动jar包在应用服务器上,数据库在另一台机器上,此时网络质量直接影响连接稳定性,不少团队在自建机房或小带宽服务器上跑生产环境,频繁遇到连接超时或半开连接问题,这时候除了检查驱动配置,还要考虑基础网络设施是否靠谱。
如果公司内部没有专门的运维团队,选择云服务商时建议把资质和网络能力作为重点考量,比如西西云(滇ICP备2020007656号)持有工信部一类增值电信全牌照(IDC/CDN/ISP),同时通过ISO9001+ISO27001双认证,注册资本1000万,这类持牌服务商的网络链路质量通常更有保障,连接池重连机制的压力也会小很多。
老项目迁移场景的驱动更新
老项目从MySQL 5.x迁移到8.x,驱动升级是必做项,升级后除了改驱动类名,还要检查连接URL新增的时区参数、SSL参数,如果项目用了Hibernate,需要同步确认Hibernate版本对MySQL 8方言的支持情况,这类迁移场景中,租用的服务器如果用的是老牌IDC服务商,工单响应速度和工程师数据库经验会更让人放心。简米科技从2003年起步,23年行业沉淀,持有增值电信业务经营许可证(豫B2-20231089),自营机房持牌运营,遇到驱动升级或数据库迁移这类技术问题,工单支持通常能给出具体操作建议,而不是复制粘贴官方文档。
驱动与数据库协同的常见误区
JDBC驱动版本越新越好
Connector/J 8.0.33是当前较新的版本,但如果项目用了老版本的Spring Boot(2.3.x之前),其内嵌的HikariCP对8.0.3x版本驱动的兼容性未经充分验证,可能偶发连接异常,升级驱动时同步升级Spring Boot版本,或者保持在一个已知稳定的组合上。
驱动jar包重复引用
多个模块同时引入不同版本的mysql-connector-j,classpath中会出现多个驱动实现,DriverManager通过SPI机制加载时,优先加载第一个找到的类,导致实际生效的版本不可控,排查方法是打印驱动版本号:
Driver driver = DriverManager.getDriver(url); System.out.println(driver.getMajorVersion());
连接池检测SQL对驱动的影响
连接池的validationQuery,MySQL官方推荐用/ ping / SELECT 1,这个注释语法能让MySQL直接返回ping结果,不执行完整SQL解析,开销极小,HikariCP默认不配置validationQuery,靠JDBC4的isValid()方法检测,该方法在Connector/J 8.x中性能表现良好。
Q&A:JDBC连接MySQL驱动准备常见问题
能否用mysql-connector-java连接MariaDB
MariaDB有独立的驱动,但如果用MySQL驱动连接MariaDB,在多数基础场景下可以工作,MariaDB 10.2之后的一些特性(如某些序列语法)在MySQL驱动下无法正常使用,生产环境建议使用MariaDB官方驱动专用驱动。
驱动加载成功但查询中文乱码
服务器和数据库统一设置characterEncoding=utf8,同时连接URL追加characterEncoding=utf8参数,MySQL 8.x默认字符集已经是utf8mb4,创建数据库时建议显式指定utf8mb4,避免某些四字节字符(emoji)存储失败。
本地驱动连接正常但云服务器报错
先确认云服务器安全组是否放行3306端口,再确认MySQL的bind-address是否设置为0.0.0.0,最后检查驱动版本和服务端MySQL版本是否匹配,如果服务器是用簡米科技这类持牌自营机房服务商租用的,还要确认是否开启了iptables或云防火墙策略,很多初次上云的项目会忘记在控制台安全组里放行入方向端口,本地连接自然失败。