java - 运行 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)
解决方案
驱动程序类名称已更改为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官方链接。
推荐阅读
- python - 尝试使用 TKINTER 和 MYSQL 登录时出错
- mysql - 我需要将时间戳从 mysql (2019-08-16T10:36:03.562908+00:00) 转换为 06-08-2019
- python-3.x - 使用 win32com 库会带来隐私问题吗?
- c++ - 编译失败从 C++ 调用 Cocoa 函数
- c# - 通过列表
从“WebInterfaceProject”中的控制器到“DataLibraryProject”中的处理器方法 - python - 使用依赖条件过滤 DataFrame 中的行
- powershell - 如何在powershell中为herestring/heredoc设置编码?
- mysql - 如何避免多个程序写入同一个数据库的无效数据?
- javascript - 使用 React Hooks 引用 DOM 元素
- r - 将季度数据分解为 R 中的每日数据保持值?