1. 写这篇的起因:一个连接异常折腾了我一晚上
如果你正在学Java,或者已经在做JavaWeb项目,大概率会踩到这一步:要用代码去读写MySQL里的数据,绕不开一个叫 mysql-connector-java 的驱动包。这个包本身不大,但就是因为它太常见,反而很少有人把它讲透。前几天一位读者给我发来一段报错,说用 Class.forName("com.mysql.jdbc.Driver") 加载驱动,结果一直抛 ClassNotFoundException,他查了半天,发现网上教程说的类名和自己项目里引的包对不上。这其实不是个例,而是我刚入行时也踩过的坑。
后来我帮他把依赖换成了 com.mysql:mysql-connector-j,把驱动类改成 com.mysql.cj.jdbc.Driver,问题立刻消失。这让我意识到:很多Java初学者甚至工作两三年的开发,对“Java连接MySQL”这件事的理解还停留在“照着网上的代码抄,能跑就行”的程度。一旦遇到版本变化、认证方式调整、时区报错,就会卡住。
所以这篇不是简单贴一段Hello World,而是把你从“会用DriverManager连一次”带到“能解释清楚连接原理、能处理常见报错、能写出工程级连接代码”的程度。内容包括驱动选型、最小连接程序、URL参数解读、踩坑复盘、连接池实践,全部来自我实际开发中验证过的方案。适合Java初学者、刚接触JDBC的学生,以及想系统梳理连接细节的开发者。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. mysql-connector-java的选型:版本、坐标和加载方式
很多人忽略了一个关键事实:mysql-connector-java 这个老坐标已经不再更新了。Oracle官方从8.0.31之后,把驱动坐标改成了 com.mysql:mysql-connector-j。如果你还在用旧坐标,版本停在8.0.30或更早,虽然也能连MySQL,但新特性、安全修复都跟不上了。我第一次发现这个问题,是在一个老项目的pom.xml里看到 mysql:mysql-connector-java:5.1.47,当时觉得能用就行,结果换到MySQL 8.0后,连认证都过不去。
2.1 依赖坐标:Maven和Gradle怎么选
Maven项目直接在pom.xml里加这段:
xml复制<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.4.0</version>
</dependency>
Gradle项目用:
groovy复制implementation 'com.mysql:mysql-connector-j:8.4.0'
注意,8.4.0是当前比较稳的版本。别一看有9.x就无脑升,我记得9.0刚出来时有几个类路径变动,除非你有明确需求,否则生产环境用8.4.0这类长期支持版本更稳。驱动包不像业务代码,没必要追新。
2.2 连接器版本与MySQL版本怎么对应
这是连接失败最常见的隐形原因。我见过有人用5.1.x的驱动去连MySQL 8.0,结果报 Unable to load authentication plugin 'caching_sha2_password'。因为MySQL 5.7之前默认认证插件是 mysql_native_password,MySQL 8.0默认变成了 caching_sha2_password,老驱动不认识新插件,自然连不上。
大致对应关系如下:
| MySQL版本 | 推荐驱动坐标 | 驱动类 |
|---|---|---|
| MySQL 5.6/5.7 | mysql:mysql-connector-java:5.1.49 | com.mysql.jdbc.Driver |
| MySQL 8.0+ | com.mysql:mysql-connector-j:8.0.33+ | com.mysql.cj.jdbc.Driver |
| MySQL 8.0+(长期稳定) | com.mysql:mysql-connector-j:8.4.0 | com.mysql.cj.jdbc.Driver |
这里有个容易混淆的点:旧驱动类 com.mysql.jdbc.Driver 在 mysql-connector-j 的8.x包里已经不存在了,取而代之的是 com.mysql.cj.jdbc.Driver。有些教程还在用老类名,照着写必然报ClassNotFoundException。如果你的项目里同时存在两个驱动jar,还会出现驱动重复注册的问题,后面我会专门说。
2.3 JDK版本对驱动的影响
JDK版本影响的是驱动包编译级别。mysql-connector-j 8.x通常要求JDK 8及以上。如果你还在用JDK 6/7,那只能退回5.1.x系列的驱动。现实中我遇到过一个极端情况:服务器上JDK是1.7,MySQL是5.6,项目用了8.0驱动,启动直接 UnsupportedClassVersionError。最后还是一致性对齐,把驱动降到5.1.49才解决。
所以选驱动版本前,先确认三件事:JDK大版本、MySQL大版本、驱动包版本。三者的兼容
