一、问题说明
在加载驱动时,使用Class.forName("com.mysql.cj.jdbc.Driver")
动态加载驱动类时,报了异常。分析肯定是驱动类没有导入好,也就是jar包导入的有问题。
1.1 问题截图和代码
package cn.edu.ucas.hyk.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* @Author: hyk
* @Date: 2020/8/1
* @version: 1.0
*/
public class JDBCUtils {
static String jdbcName = "com.mysql.cj.jdbc.Driver";
static String dbUrl = "jdbc:mysql://localhost:3306/db_test?useSSL=false&serverTimezone=UTC";
static String dbUserName = "root";
static String dbPassword = "123456";
public static Connection getConnection(){
try {
Class.forName(jdbcName);
return DriverManager.getConnection(dbUrl,dbUserName,dbPassword);
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
} catch (SQLException throwables) {
throwables.printStackTrace();
return null;
}
}
}
package cn.edu.ucas.hyk.jdbc;
import java.sql.*;
/**
* @Author: hyk
* @Date: 2020/7/31
* @version: 1.0
*/
public class MyJDBC {
private static ResultSet rs;
private static Connection conn;
private static PreparedStatement ps;
public static void main(String[] args) {
conn = JDBCUtils.getConnection();
try {
ps = conn.prepareStatement("SELECT * FROM pet WHERE name = ?");
ps.setString(1,"Fluffy");
rs = ps.executeQuery();
while (rs.next()){
System.out.println(rs.getString(1));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
二、解决方案
先给出解决方法:参考解决方案中,方式二的截图
通过
File -> Project Structure -> Module -> Dependencies -> +
方式添加依赖并不凑效,依然报ClassNotFound异常。
凑效的解决方式是右键你的Module -> 新建libs文件夹 -> 将驱动jar包拷过来 -> 右键libs文件夹 -> Add As Library
。
通过这里便可以解决问题,接下来的部分旨在记录解决和分析错误的思路,以及体会java源文件的编译执行过程。
2.1 控制台手动编译
为了验证问题,控制台手动编译来作为对比。先说明编译任务,我要编译的是两个文件,JDBCUtils.java
和MyJDBC.java
两个文件。
2.1.1 javac *.java
这里是在idea的项目路径下进行编译的,注意.java源文件位置。因为Class.forName("com.mysq.jdbc.Driver")
是动态加载的,所以毫无疑问,javac命令可以完成。
2.1.2 java cn.edu.ucas.hyk.jdbc.MyJDBC
注意这里的路径!!!执行java
命令是需要结合包名的问题的,还有java
命令是要到classpath
环境变量下寻找.class文件,我这里配置了.\
代表当前路径。
毫无疑问,因为手动编译时并不知道jdbc.Driver
驱动的存在,必然会报错。
2.2 使用Idea进行编译
使用Idea进行编译时,我按照网上总结的方法出现了问题,至今仍没有发现原因。方式一有问题,方式二成功。
2.2.1 方式一
网上惯有导入jdbc驱动的方式。但是我这里导入后仍然会报ClassNotFound的错误。看着下面熟悉的异常错误,跟控制台的java
命令手动编译如此雷同,说明这种方式并没有导入成功,至少在虚拟机执行时,意识不到Driver
类的存在。但这种方式又是网上满天飞的jdbc驱动导入方式,可能这种方式本身没问题,而是我哪里出了错误,先待定吧,解决了再来更改。
2.2.2 方式二
这种方式简单粗暴,也正是这种方式在我的Idea中有效。