解决 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

关于 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

在学java的时候,尝试着用 java 连接下 mysql,代码是这样的

import java.io.*;
import java.util.*;
import java.sql.*;

public class Read {
    public static void main(String[] args) {
        Connection con = null;
        Statement stmt = null;
        String jdbc_driver = "com.mysql.jdbc.Driver";
        String db_url = "jdbc:mysql://localhost:3306/todoList?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT&useSSL=false";
        String userName = "root";
        String pwd = "123456";
        try {

            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(db_url, userName, pwd);
            stmt = con.createStatement();
            String sql = "SELECT * FROM duty";
            ResultSet rs = stmt.executeQuery(sql);

            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("content");
                System.out.println(id + "-" + name);
            }
            rs.close();
            stmt.close();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}  

代码我是在命令行运行的:

javac -encoding utf-8 -cp c:/lib/mysql-connector-java-5.1.39-bin.jar  Read.java

之后出现错误: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver ,显而易见这个错误提示未找到 jdbc的类,说明 jar包并没有加载到该 demo 中。讲道理 -cp 指定加载类的路径,应该是没问题的,之后我尝试着把动态加载类 Class.forName()语句去掉,在该java文件加上 import com.mysql.jdbc.Driver ,编译后提示 No suitable driver found for jdbc,也就是没用找到合适的 链接句柄,实在搞不懂,在此记录一下。后来我针对 Class.forName() 未找到类开始寻找解决方案,百度后找到解决方案

  1. 将 jdbc 依赖的包 ( 在此是mysql-connector-java-5.1.39-bin.jar )放入 java/jre/lib/ext 目录下

后来在上实验课的时候,我试了试确实可以,然后百度查了下 该目录是啥子,查到该目录是 jvm 执行环境依赖包的文件夹,java 在加载类的时候 有三个目录,具体看下链接 https://zhidao.baidu.com/question/305177070853679604.html 。但是当时测试的时候确实没有了 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver ,但是出现关于 ssl 的警告,就是链接协议的问题,警告如下

	Wed Oct 11 22:20:41 CST 2017 WARN: Establishing SSL connection 
	without server's identity verification is not recommended. According 
	to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must 
	be established by default if explicit option isn't set. For compliance 
	with existing applications not using SSL the verifyServerCertificate 
	property is set to 'false'. You need either to explicitly disable SSL by 
	setting useSSL=false, or set useSSL=true and provide truststore for server 
	certificate verification.

然后去百度,原因是版本较新的mysql 在链接的时候默认要求使用 ssl, 所以在此设置连接路径为

String db_url = “jdbc:mysql://localhost:3306/todoList?useSSL=false”

之后设置完之后,出来了结果,是乱码,之后又百度,设置连接路径为

String db_url = “jdbc:mysql://localhost:3306/todoList?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT&useSSL=false”

然后就好了,应该还是 mysql 版本的问题,另外请注意对于 高版本的 mysql ,需要相应版本的 jdbc-connector,
而且此时引入的类库是 Class.forName(“com.mysql.cj.jdbc.Driver”);在实验室的mysql 是 8.0版本,刚开始引入的是com.mysql.jdbc.Driver,后来百度修改了之后 命令行运行

javac -encoding utf-8 Read.java
java Read

然后一切ok。本来以为万事大吉,之后回到宿舍,赶紧把自己电脑上的问题解决,谁知道照本宣科的按照实验室搜索到的东西来,在我把 jdbc-connector 扩展包放入 java/jre/lib/ext 下的时候,我发现我的 jre/lib下 压根没用ext 这个文件,无奈我创建个呗,然后一切照常,命令行运行

javac -encoding utf-8 Read.java
java Read

结果提示:

exists, extensions mechanism no longer supported; Use -classpath instead. . .

很无奈,继续百度,找到发现,对于版本较高的 jdk 来说 已经移除了 jre/lib/ext 文件目录,之后我删除刚才创建的 ext 文件夹,然后又回到了 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 这个错误,之后换了个思路,然后换了个思路,不就是没用加载这个类吗,之后我就修改了环境变量中的系统变量 ClassPath,我先把 jdbc 的扩展包放入到了 java/jdk/lib 目录下, 然后在系统变量 ClassPath 后面加上了 %JAVA_HOME%\lib\ jdbc 的包名, 然后一路确认… 然后重启电脑,重启后立马打开 命令行 cmd ,输入

javac -encoding utf-8 Read.java
java Read

然后就OK了,折腾了好几天,还是自己基础不扎实啊。

你可能感兴趣的:(java)