mysql jdbc驱动与java版本需匹配:java 8及以下用5.1.x,java 9+须用8.0.23+或8.3.x;类名从com.mysql.jdbc.driver改为com.mysql.cj.jdbc.driver;连接url需加servertimezone和ssl参数;务必用try-with-resources释放资源;localhost与127.0.0.1权限不同;spring boot需显式配置driver-class-name。

MySQL JDBC驱动版本和Java版本不匹配导致ClassNotFound
Java 8及以下用 mysql-connector-java:5.1.x,Java 9+ 必须用 mysql-connector-java:8.0.23+ 或更新的 mysql-connector-j:8.3.x(注意包名从 com.mysql.jdbc.Driver 改为 com.mysql.cj.jdbc.Driver)。常见错误是下载了新版驱动却还在代码里写旧类名,抛出 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 查 Java 版本:
java -version;查 Maven 依赖是否带runtimescope(否则测试时可能找不到驱动) - 确认
pom.xml中引入的是mysql:mysql-connector-java(旧)或mysql:mysql-connector-j(新),别混用 - 连接 URL 加上
?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false,否则 8.0+ 驱动常因时区或 SSL 报错
Connection对象没close或没进try-with-resources导致连接泄漏
本地开发时看不出问题,但跑几次测试后 MySQL 报 Too many connections,本质是 Connection、Statement、ResultSet 没释放。JDBC 规范要求显式 close,且顺序必须是 ResultSet → Statement → Connection。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 永远用 try-with-resources,别手写 finally close;
Connection对象不能复用,每次操作都应新建 + 关闭 - 别在工具类里缓存
Connection实例——那是连接池干的事,本地测试不用池也别自己“省” - 如果用 HikariCP 等连接池,确保
maximumPoolSize设得合理(本地调 5–10 足够),并验证leakDetectionThreshold是否开启
localhost 和 127.0.0.1 在MySQL权限体系里不是一回事
明明账号密码对,jdbc:mysql://localhost:3306/test 连不上,换成 127.0.0.1 就行——这是因为 MySQL 的 user 表里 host 字段区分 localhost(走 socket 文件)和 127.0.0.1(走 TCP),权限记录可能只给了其中一个。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 登录 MySQL 后执行:
SELECT host, user FROM mysql.user;,看目标用户对应的是localhost还是%或127.0.0.1 - 本地开发建议统一用
127.0.0.1,避免 socket 路径、权限、SELinux 等额外干扰 - 如果非要用
localhost,确认 MySQL 配置中skip-networking是关闭状态,且bind-address没锁死为其他 IP
Spring Boot项目里application.yml配错url或driver-class-name启动失败
Spring Boot 自动配置对 JDBC URL 和 driver 类名敏感。写成 jdbc:mysql://... 却没配 spring.datasource.driver-class-name,或配了 com.mysql.jdbc.Driver 但实际用的是 8.x 驱动,都会导致启动报 Failed to configure a DataSource 或 Cannot determine embedded database driver class for database type NONE。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- Spring Boot 2.4+ 默认不再自动推断 driver,必须显式配置:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver - URL 中的
useSSL=false和serverTimezone=GMT%2B8(注意 URL 编码)不能漏,中文乱码、时区错位都是静默坑 - 加
spring.sql.init.mode=always(旧版spring.datasource.initialization-mode=always)可快速验证连接通不通——它会在连上后尝试执行 schema.sql











