首页 > 解决方案 > 运行 jdbc 程序时线程“主”java.sql.SQLException 中的异常?

问题描述

我最近开始学习 JDBC 并编写了一个程序来在 MySQL 数据库中创建表,但运气不好,我遇到了一些错误,或者可能是我无法自己解决的异常。我只是一个初学者,所以请帮我解决这个问题。

下面是我写的程序:

package first;
import java.sql.*;
public class Firstclass {

    public static void main(String[] args) throws Exception 
    {
        // TODO Auto-generated method stub
        String driver="com.mysql.jdbc.Driver";
        String JDBC_URL=" jdbc:mysql://localhost:3306/demodatabase";
        String user_name="root";
        String password="toor";
        String sqlquery="create table employee(eno number,ename varchar2(10),esal number(10,2),addr varchar2(10))";
        Class.forName(driver);
        Connection con=DriverManager.getConnection(JDBC_URL,user_name,password);
        Statement st=con.createStatement();
        st.executeUpdate(sqlquery);
        System.out.println("Table created Successfully");
        con.close();
    }

}

我正在开发 Eclipse IDE。我安装了 oracle java 14.0.1。

以下是我得到的错误/异常:

loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
Exception in thread "main" java.sql.SQLException: No suitable driver found for  jdbc:mysql://localhost:3306/demodatabase
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
    at first.Firstclass.main(Firstclass.java:14)

标签: javamysqljdbc

解决方案


驱动程序类名称已更改为com.mysql.cj.jdbc.Driver您正在使用的版本。由于您在没有 maven 或 gradle 的情况下使用纯 java 进行尝试,因此您将必须提供您使用的所有依赖 jar 才能自己工作。检查以下内容:

  • 要使您的连接器版本mysql-connector-java-8.0.20.jar 正常工作,java 版本需要是 java8。
  • 如果您是从源代码构建的,请验证协议缓冲区和简单日志记录外观 API 是否位于类路径中。

您可能还需要在您的系统上安装以下第三方库以使 Connector/J 8.0 工作:Protocol Buffers(使用 X DevAPI 所需)\ Simple Logging Facade API(使用默认实现提供的日志记录功能所需org.slf4j.Logger.Slf4JLogger by Connector/J) 。从源代码构建 Connector/J 需要这些和其他第三方库(有关所需库的更多信息,请参阅 章节)。

此外,在 MySql 文档中,他们建议我们像这样调用 newInstance() (文档对此没有适当的解释):

public class LoadDriver {
    public static void main(String[] args) {
        try {
            // The newInstance() call is a work around for some
            // broken Java implementations

            Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
        } catch (Exception ex) {
            // handle the error
        }
    }
}

官方文档链接

此外,从 java 6 开始,我们不需要提供Class.forName()加载驱动程序,因为 java SPI(服务提供者接口)机制应该自动检测适当的驱动程序。即使您像旧方式一样提供它,它仍然可以完美运行。

DriverManager 方法 getConnection 和 getDrivers 已得到增强,以支持 Java 标准版服务提供者机制。

Java官方链接


推荐阅读