必须换驱动、改类名、补全连接参数——三者缺一不可:MySQL 8.0+ 已彻底移除 com.mysql.jdbc.Driver,须改用 mysql-connector-j 8.3.0+ 和 com.mysql.cj.jdbc.Driver;连接URL需显式指定 serverTimezone、characterEncoding、useSSL、allowPublicKeyRetrieval 及预编译缓存参数,否则虽能连上但查询失败或数据异常。

必须换驱动、改类名、补全连接参数——三者缺一不可,否则不是连不上,就是连上后查不出数据。
com.mysql.jdbc.Driver 报 ClassNotFoundException 怎么办
这不是 classpath 没加对,是这个类在 mysql-connector-java-8.x.jar 里根本不存在了。MySQL 8.0+ 彻底删除了旧包结构,只保留 com.mysql.cj.jdbc.Driver。
- 删掉所有
mysql-connector-java-5.1.x.jar(或任何 5.x/6.x 版本) - Maven 依赖换成:
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.3.0</version></dependency>(注意:8.3.0+ 推荐用mysql-connector-j而非mysql-connector-java) - 代码里
Class.forName("com.mysql.jdbc.Driver")直接删掉——新驱动通过 SPI 自动注册,手动加载反而触发警告 - 配置文件中
driver-class-name: com.mysql.jdbc.Driver全部替换成com.mysql.cj.jdbc.Driver
连接成功但 executeQuery() 卡住或返回空结果
这是最隐蔽的坑:应用能启动、DataSource 创建成功、Connection 对象拿到手,但第一次执行 SQL 就失败。根源是 MySQL 8.0 驱动默认强制校验时区和字符集,而旧连接串只写了 ?useSSL=false 这类参数。
-
serverTimezone必须显式指定,不能留空或写UTC就完事;推荐Asia/Shanghai,避免业务时间逻辑错乱 -
characterEncoding=utf8必须加上:虽然 MySQL 8.0 默认用utf8mb4,但不声明会导致某些中文字段被截断,报Incorrect string value -
useSSL=false在开发环境必须加;生产环境应配证书并设为true,否则连接可能被拒绝 -
allowPublicKeyRetrieval=true是 8.0.4+ 强制要求,否则 RSA 密钥交换阶段直接卡死 - 完整 URL 示例:
jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true(XML/properties 中&要转义为&)
MyBatis 分页或 IN 查询失效、报权限错误
这不是 SQL 写错了,是预编译语句缓存行为变了。老驱动默认开启 cachePrepStmts=true,新驱动不显式配置缓存大小时会降级为禁用,导致 ORM 动态 SQL 回退成普通语句执行,触发权限限制或语法不兼容。
- 必须在连接串里补全三项:
&cachePrepStmts=true&prepStmtCacheSize=250&prepStmtCacheSqlLimit=2048 - HikariCP 用户注意:这些参数必须塞进
spring.datasource.url字符串里,不能写在hikari.connection-init-sql或其他地方 - Tomcat JDBC Pool 示例:
connectionProperties="cachePrepStmts=true;prepStmtCacheSize=250;prepStmtCacheSqlLimit=2048" - DBCP2 用户注意:
connectionFactory或connectionInitSqls不影响驱动层参数,仍需写进 URL
Authentication plugin 'caching_sha2_password' cannot be loaded
这是握手阶段失败的典型提示,说明客户端驱动版本太低(如用了 8.0.27 以下),或服务端用户认证插件与驱动不匹配。优先升级驱动,而非降级数据库。
- 确认驱动版本 ≥
8.0.28,且类名是com.mysql.cj.jdbc.Driver - 如果仍报错,检查 MySQL 用户是否用了
caching_sha2_password:运行SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user'; - 临时修复(仅限开发环境):
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES; - 生产环境不建议用
allowPublicKeyRetrieval=true替代认证适配,它本质是绕过安全校验
最容易被忽略的是:连接池健康检测用的 validationQuery 如果只写 SELECT 1,可能绕过时区/字符集校验,让问题延迟暴露到业务查询时才爆发。



















