MySQL JDBC 就是 Java 程序通过
mysql-connector-java驱动包,用标准 JDBC API(
java.sql.*)连接和操作 MySQL 数据库的机制——它不是 MySQL 自带的功能,也不是 Java 内置能力,而是靠「驱动 + 规范」协同工作的桥梁。
为什么连不上?先看驱动类和 URL 对不对
MySQL 5.7 和 8.0+ 的驱动类名、JDBC URL 格式、默认行为全都不一样,错一个就抛
ClassNotFoundException或
CommunicationsException: MySQL 5.x(如 5.7):驱动类是
com.mysql.jdbc.Driver,URL 示例:
jdbc:mysql://localhost:3306/testMySQL 8.0+:驱动类必须用
com.mysql.cj.jdbc.Driver,URL 必须加时区和 SSL 参数,否则报错:
jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useSSL=false不写
Class.forName(...)也能连(JDBC 4.0+ 自动服务发现),但显式加载更可控,尤其在旧容器或模块化环境里
Connection 怎么拿?别硬写密码,也别漏关资源
直接用
DriverManager.getConnection()最简单,但生产环境建议用连接池(如 HikariCP);无论哪种方式,都得处理好资源释放: URL 中的
useSSL=false不是可选优化项——MySQL 8.0 默认强制 SSL,不关会连失败
serverTimezone=UTC或
serverTimezone=Asia/Shanghai必须显式指定,否则可能因时区解析失败而卡住或报错 务必用 try-with-resources 包裹
Connection/
Statement/
ResultSet,否则连接泄漏比 SQL 注入还容易出事
try (Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useSSL=false",
"root", "password")) {
System.out.println("Connected: " + conn.isValid(1));
}执行 SQL 别用 Statement 拼字符串
直接拼接用户输入进
Statement是 SQL 注入温床,哪怕只是本地测试也该养成用
PreparedStatement的习惯:
立即学习“Java免费学习笔记(深入)”;
Statement适合写死的 DDL(如
CREATE TABLE)或管理语句 所有带参数的查询/更新/删除,一律走
PreparedStatement:
SELECT * FROM user WHERE id = ?,再用
setLong(1, userId)批量操作优先用
addBatch()+
executeBatch(),比循环 execute 快数倍
最常被忽略的其实是驱动版本和 MySQL 版本的严格对应——
mysql-connector-java:8.0.33连 MySQL 5.6 可能报错,而
5.1.49连 MySQL 8.0 会拒绝握手。查清自己 MySQL 的
SELECT VERSION();输出,再去 Maven 仓库挑匹配的驱动,比调一小时 URL 参数更省时间。
