聊到MySQL JDBC连接数据库,这应该是Java后端开发里最绕不开的基础操作了。我见过不少刚入行的朋友,上来就Spring Boot + MyBatis,框架用得很溜,但真到了现场排查问题,一问JDBC底层原理就卡壳。更别提那些一天到晚报No suitable driver、Communications link failure的诡异问题,光在搜索引擎里翻答案就能耗掉一下午。这篇教程我就把自己这些年实操MySQL JDBC连接的经验完整梳理一遍,从驱动选择到五步连接法,从高频报错到连接池实战,每一段都是能直接落地的干货。
先说清楚这篇内容适合谁:刚学Java Web、第一次用IDEA写JDBC连接MySQL的新手;以及用框架久了想回头补底层知识的进阶开发者。如果你是老手,也可以直接跳到第3节看报错排查,那里我整理了不少平时文档里不写、但线上一定会踩的坑。
1. JDBC是什么,为什么绕不开它
1.1 从一段最简单的流程说起
JDBC的全称是Java Database Connectivity,翻译过来就是Java数据库连接规范。注意“规范”这两个字,它本质上是一套接口定义,由Sun公司(现在是Oracle)制定,然后让各家数据库厂商自己去实现。MySQL厂商提供的实现类打包成一个jar包,就是我们在项目里引入的mysql-connector-java。
这套机制跟USB接口很像:USB定义了一套插口规范,鼠标厂商、键盘厂商、U盘厂商都按这个规范去生产自己的设备。你的电脑不需要知道插进来的具体是哪个牌子的鼠标,只要它符合USB规范就能用。JDBC也一样,你的Java代码里写的都是java.sql.Connection、java.sql.Statement这些接口,真正干活的是MySQL驱动里的实现类,但你的业务代码根本不用关心这一点。
所以一套JDBC代码,理论上换个数据库驱动jar包就能连接不同的数据库——这也是为什么市面上会有那么多数据库中间件,本质上都是在JDBC之上做封装。理解了这层设计,你后面看MyBatis、Hibernate的源码就会觉得豁然开朗。
1.2 版本与驱动选择:这里最容易埋雷
很多新人第一步就在选驱动上栽跟头。你去Maven中央仓库搜mysql-connector-java,会看到一堆版本号,5.1.x、8.0.x,最新甚至直接改了坐标叫com.mysql:mysql-connector-j。到底该用哪个?
我的建议很直接:只要你的MySQL是5.7以上,统一用8.0.x系列。因为从MySQL 8.0开始,mysql-connector-java的驱动类从com.mysql.jdbc.Driver改成了com.mysql.cj.jdbc.Driver,URL也要加上时区参数,一堆老教程里的写法直接作废。如果你还在用5.x驱动连8.0数据库,大概率会撞上Public Key Retrieval is not allowed这个报错。
推荐配置可以参照这张表:
| 场景 | MySQL版本 | 驱动坐标 | 驱动类 | 连接URL前缀 |
|---|---|---|---|---|
| 老项目维护 | 5.6/5.7 | mysql:mysql-connector-java:5.1.49 |
com.mysql.jdbc.Driver |
jdbc:mysql:// |
| 新项目开发 | 5.7/8.0+ | com.mysql:mysql-connector-java:8.0.33 |
com.mysql.cj.jdbc.Driver |
jdbc:mysql:// |
| Spring Boot 2.7+ | 8.0+ | 由mysql-connector-j管理版本 |
同上 | 同上 |
一个通行判断标准:连接URL里如果看到useSSL=false这种参数,多半是5.x时代的旧写法。8.x驱动的标准URL长这样:
text复制jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
这句话里的每个参数都是有意义的,后面我会逐个解释,先记住一点:字符编码用utf8不要用utf-8,中间有横杠MySQL不认;时区参数serverTimezone在8.x版本里是必填项,不写就会报时区错误。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 实操:手写JDBC的五步连接法
2.1 从零搭建一个测试工程
先别急着上框架,我们用最纯粹的Java来感受一下JDBC连接MySQL的完整链路。用IDEA新建一个Maven项目,然后在pom.xml里加上依赖:
xml复制<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
这里注意,8.0.31版本之后官方把groupId从mysql改成了com.mysql,如果你在旧教程里看到mysql:mysql-connector-java这种写法也能用,但新项目建议直接用com.mysql:mysql-connector-j,这才是现在的官方坐标。
数据库这边先准备好一张测试表,这一步也可以直接测试连接成功后再通过JDBC代码建表,省得来回切工具。直接打开数据库创建一个测试库:
sql复制CREATE DATABASE IF NOT EXISTS test_db DEFAULT CHARACTER SET utf8mb4;
USE test_db;
CREATE TABLE IF NOT EXISTS t_user (
id INT PRIMARY KEY AUTO_INCREMENT,
