IntelliJ连接MySQL时遭遇ClassNotFoundException问题求助
解决java.lang.ClassNotFoundException: com.mysql.jdbc.Connection的问题
嘿,我一眼就发现你代码里的关键问题啦!咱们一步步来解决:
1. 核心错误:驱动类名写错了
你在Class.forName()里传入的com.mysql.jdbc.Connection是JDBC连接接口的全类名,不是MySQL驱动类的全类名!
针对你用的MySQL Connector/J 8.0.172(8.0.x版本),正确的驱动类名是:
Class.forName("com.mysql.cj.jdbc.Driver");
另外补充个小知识点:MySQL 8.0之后的驱动已经支持SPI自动加载,所以你甚至可以直接删掉Class.forName()这一行,DriverManager会自动找到并加载驱动类。
2. 再次确认依赖配置(避免踩坑)
虽然你说已经添加了mysql-connector库,但还是建议再检查下:
- 如果是手动添加jar包:打开IntelliJ的
File → Project Structure → Modules → 你的模块 → Dependencies,确认mysql-connector-java-8.0.172.jar在列表中,且没有红叉(表示依赖有效)。 - 如果用Maven/Gradle管理:确保依赖配置正确,比如Maven的依赖块应该是:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.172</version> </dependency>
3. 优化连接URL(避免额外问题)
MySQL 8.0版本建议在连接URL中添加时区参数,否则可能出现时区相关的警告或错误,比如:
String url = "jdbc:mysql://localhost:3306/lsmotor_local_oltp?useSSL=false&serverTimezone=UTC"; localConnection = DriverManager.getConnection(url, user, password);
修正后的完整代码示例
public void copyDatabase(Info info){ Connection localConnection = null; // 建议在方法内声明,避免成员变量泄漏 try{ // MySQL 8.0+ 可省略此行,如需保留请用正确的驱动类名 Class.forName("com.mysql.cj.jdbc.Driver"); localConnection = DriverManager.getConnection( "jdbc:mysql://localhost:3306/lsmotor_local_oltp?useSSL=false&serverTimezone=UTC", user, password ); // TODO: Copy Info into local database } catch(SQLException e){ System.out.println("Problem while trying to connect to local database"); e.printStackTrace(); // 打印堆栈信息,方便排查具体错误(比如密码错、数据库不存在等) } catch(ClassNotFoundException e){ System.out.println("Failed to load MySQL driver"); e.printStackTrace(); } finally { // 务必关闭连接,防止资源泄漏 if(localConnection != null){ try { localConnection.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
内容的提问来源于stack exchange,提问作者Roux Casas




