JDBC 和 SQLite - 无论我如何尝试都找不到合适的驱动程序

问题描述 投票:0回答:1

我尝试制作一个简单的 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 文件,它仍然不起作用。

java sqlite jdbc
1个回答
0
投票

问题在于 SQLite JDBC 驱动程序还需要

slf4j-api-1.7.36.jar
,如其 GitHub 存储库上的自述文件中所述:

  1. 下载 sqlite-jdbc-3.44.1.0.jar,然后将此 jar 文件附加到您的类路径中。

  2. 下载 slf4j-api-1.7.36.jar 然后将此 jar 文件附加到您的类路径中。

  3. 从代码中打开 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

因此,虽然不再需要显式加载驱动程序,但它可以提供额外的故障排除信息。

© www.soinside.com 2019 - 2024. All rights reserved.