P10 · 缺 MySQL 驱动 jar:ClassNotFoundException: com.mysql.cj.jdbc.Driver

P10 · 缺 MySQL 驱动 jar:ClassNotFoundException: com.mysql.cj.jdbc.Driver

场景还原:你兴冲冲地在项目里写了第一段 JDBC 连接代码,运行------啪:

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver

翻译:"你要加载的 MySQL 驱动类,我翻遍了整个 classpath 都找不到。" 说白了:项目里根本没引入 MySQL 的驱动 jar 包。

一、问题现象

复制代码
开始连接数据库,先加载驱动 ...
>>>> 加载驱动失败:找不到这个类!多半是没导入 mysql-connector jar
java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:423)
	at MissingJarDemo.main(MissingJarDemo.java:8)

二、出错代码

java 复制代码
public class MissingJarDemo {
    public static void main(String[] args) {
        try {
            // MySQL 8 的驱动类全名
            Class.forName("com.mysql.cj.jdbc.Driver");   // ← 找不到这个类
            System.out.println("驱动加载成功,可以继续连接了");
        } catch (ClassNotFoundException e) {
            System.out.println(">>>> 加载驱动失败:找不到这个类!多半是没导入 mysql-connector jar");
            e.printStackTrace();
        }
    }
}

三、为什么会这样

Java 连接 MySQL 不是"天生就会"的------JDBC 只是个接口规范 (java.sql 包),真正干活的是驱动实现 :MySQL 官方提供的 mysql-connector-java(现在叫 mysql-connector-j)jar 包。

Class.forName("com.mysql.cj.jdbc.Driver") 的意思是"把驱动类加载进 JVM"。这个类住在驱动 jar 里,只有把 jar 加进项目的 classpath(依赖路径),JVM 才能找到它 。没加 jar → 找不到类 → ClassNotFoundException。

顺带说明:MySQL 8 之后的驱动类名是 com.mysql.cj.jdbc.Driver;MySQL 5.x 时代的老驱动类名是 com.mysql.jdbc.Driver。类名写错(比如 8 的驱动用 5 的类名)也会报找不到------这种情况详见下一篇 P11。

四、怎么解决

方案一(最常用):用 Maven/Gradle 加依赖,一行搞定,自动下载:

xml 复制代码
<!-- pom.xml -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.0.33</version>   <!-- 和你的 MySQL 服务端大版本匹配,8.x 就选 8.x -->
</dependency>
groovy 复制代码
// build.gradle
implementation 'com.mysql:mysql-connector-j:8.0.33'

方案二:手动下载 jar 放 lib 目录(不用构建工具的老项目):

  1. 去 Maven 中央仓库下载 mysql-connector-j-8.0.33.jar;
  2. 放进项目的 lib/ 目录;
  3. 编译运行都带上它:
bash 复制代码
javac -encoding UTF-8 -cp lib/mysql-connector-j-8.0.33.jar YourClass.java
java  -cp .:lib/mysql-connector-j-8.0.33.jar YourClass

方案三:确认依赖真的"进来了"(IDEA 里依赖加了对不对):

  • Maven 项目:右侧 Maven 面板点刷新(Reload),看 External Libraries 里有没有 mysql-connector-j-x.x.x.jar;
  • Gradle 项目同理刷新一下;
  • 命令行排查:mvn dependency:tree | grep mysql 看依赖是否解析成功。

五、防坑总结

  • 连 MySQL 前先确认驱动 jar 已在依赖里(ClassNotFoundException 几乎都是没引 jar);
  • MySQL 8+ 用 com.mysql.cj.jdbc.Driver + mysql-connector-j 8.x;别拿 5.x 的类名硬凑;
  • jar 版本和 MySQL 服务端版本大版本一致(8 对 8、5.7 对 5.x),见下一篇;
  • IDEA 加依赖后记得刷新 Maven/Gradle,External Libraries 里肉眼可见才算数;
  • 从零搭 JDBC 建议直接用连接池(HikariCP 等),驱动依赖会自动带好。

下一篇:P11 · MySQL 驱动版本过旧,连不上 MySQL 8(待发布)

相关推荐
小羊没烦恼!3 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里3 天前
java中的继承和多态的区别
java
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕3 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖3 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时3 天前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang3 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi3 天前
mysql 查询所有表名并授权
java
ProcessOn官方账号3 天前
java函数式编程--入门基础
java·编程·函数式编程