我尝试制作一个简单的 Java 程序并连接到 SQLite 数据库以进行学习。但无论我怎么努力,我都无法成功。我总是得到
No suitabe driver found for jdbc:sqlite:database.db
。但它应该如此简单。我已经尝试过来自 Maven 存储库的大量驱动程序。
我已经阅读并理解了这个理论:JDBC API 处理与 JDBC 管理器的通信,而 JDBC 驱动程序处理与数据库的通信。我还了解到,当我运行编译的类文件时,必须向包含数据库驱动程序的 .jar 文件添加类路径。 如此处所解释的示例。
一些教程声称需要使用
Class.forName()
注册驱动程序,但是 Oracle 文档 说:
应用程序不再需要使用 Class.forName()] 显式加载 JDBC 驱动程序
此外,我遵循的 SQLite 教程在运行之前从未注册驱动程序
DriverManager.getConnection(url);
示例 sqlitetutorial.net
在我的目录中
E:\Project
我有这些文件:
DataBase.java
DataBase.class
database.db
sqlite-jdbc-3.44.1.0.jar
当我运行编译后的类文件时,我在终端窗口(Powershell)中使用
java -cp ".;sqlite-jdbc-3.44.1.0.jar" DataBase
这是我的代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DataBase {
public static void connect() {
Connection conn = null;
try {
String url = "jdbc:sqlite:database.db";
conn = DriverManager.getConnection(url);
System.out.println("Connection is established");
conn.close();
System.out.println("Connection closed.");
} catch (SQLException e) {
System.out.println(e.getMessage());
}
} // End method connect
public static void main(String[] args) {
connect();
} // End of main method
} // End of class
如果我能得到任何帮助来推动我前进,我将不胜感激。
我想这与找不到 .jar 文件有关,但我已经尝试了一切可能的方法:将 .jar 文件的副本放在不同目录中的各个位置,重命名它以使其更简单,在添加类路径时添加多个目录等等。我不知道可能会丢失什么。
另外,当我尝试在 VSCode 中执行相同操作时,通过在“引用的库”下添加 .jar 文件,它仍然不起作用。
问题在于 SQLite JDBC 驱动程序还需要
slf4j-api-1.7.36.jar
,如其 GitHub 存储库上的自述文件中所述:
下载 sqlite-jdbc-3.44.1.0.jar,然后将此 jar 文件附加到您的类路径中。
下载 slf4j-api-1.7.36.jar 然后将此 jar 文件附加到您的类路径中。
从代码中打开 SQLite 数据库连接。 (见下面的例子)
使用示例
假设
和sqlite-jdbc-3.44.1.0.jar
是 放在当前目录下。slf4j-api-1.7.36.jar
> javac Sample.java > java -classpath ".;sqlite-jdbc-3.44.1.0.jar;slf4j-api-1.7.36.jar" Sample # in Windows
换句话说,您还需要将
slf4j-api-1.7.36.jar
放入该目录并使用:
java -cp ".;sqlite-jdbc-3.44.1.0.jar;slf4j-api-1.7.36.jar" DataBase
如果您在应用程序中明确添加了
Class.forName("org.sqlite.JDBC")
,您将能够诊断这一点,因为没有 slf4-api-1.7.36.jar
会导致(我将 Class.forName
添加到 main
):
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at org.sqlite.JDBC.<clinit>(JDBC.java:26)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:375)
at DataBase.main(DataBase.java:23)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
... 4 more
因此,虽然不再需要显式加载驱动程序,但它可以提供额外的故障排除信息。