Heim  >  Artikel  >  JDBC und SQLite – Ich kann nicht den richtigen Treiber finden, egal was ich versuche

JDBC und SQLite – Ich kann nicht den richtigen Treiber finden, egal was ich versuche

王林
王林nach vorne
2024-02-09 10:57:18632Durchsuche

php-Editor Yuzai ist bei der Verwendung von JDBC und SQLite auf ein Problem gestoßen, egal wie sehr er sich bemüht hat, er konnte keinen geeigneten Treiber finden. JDBC ist eine Standardschnittstelle für Java zur Verbindung mit Datenbanken, während SQLite eine leichtgewichtige eingebettete relationale Datenbank-Engine ist. Obwohl JDBC Treiber für verschiedene Datenbanken bereitstellt, gibt es keinen speziell für SQLite entwickelten Treiber. Dies führte dazu, dass der Editor verwirrt war und nicht in der Lage war, eine Verbindung zur SQLite-Datenbank herzustellen und diese normal zu betreiben. Im nächsten Artikel werden wir Möglichkeiten zur Lösung dieses Problems untersuchen.

Frageninhalt

Zu Lernzwecken versuche ich, ein einfaches Java-Programm zu erstellen und eine Verbindung zur SQLite-Datenbank herzustellen. Aber so sehr ich es auch versuchte, es gelang mir nicht. Ich bekomme immer no 适用于 jdbc:sqlite:database.db Fahrer. Aber es sollte so einfach sein. Ich habe viele Treiber aus dem Maven-Repository ausprobiert.

Ich habe die Theorie gelesen und verstanden: Die JDBC-API übernimmt die Kommunikation mit dem JDBC-Manager, während der JDBC-Treiber die Kommunikation mit der Datenbank übernimmt. Ich habe auch gelernt, dass ich beim Ausführen der kompilierten Klassendatei den Klassenpfad zur .jar-Datei hinzufügen muss, die den Datenbanktreiber enthält. Zum Beispiel wie hier erklärt.

Einige Tutorials behaupten, dass class.forname() zum Registrieren des Treibers verwendet werden muss, aber in der Oracle-Dokumentation heißt es:

applications no longer need to explicitly load jdbc drivers using class.forname()]

Außerdem hat das SQLite-Tutorial, dem ich gefolgt bin, den Treiber nie registriert, bevor ich das drivermanager.getconnection(url); Beispiel sqlitetutorial.net

ausgeführt habe

In meinem Verzeichnis e:project habe ich diese Dateien:

database.java
database.class
database.db
sqlite-jdbc-3.44.1.0.jar

Wenn ich die kompilierte Klassendatei ausführe, verwende ich java -cp ".;sqlite-jdbc-3.44.1.0.jar" database

in einem Terminalfenster (Powershell).

Das ist mein Code:

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

Wenn ich Hilfe bekomme, die mich voranbringt, wäre ich sehr dankbar.

Ich schätze, es hat etwas damit zu tun, dass ich die .jar-Datei nicht finden konnte, aber ich habe alles Mögliche versucht: eine Kopie der .jar-Datei irgendwo in einem anderen Verzeichnis ablegen, sie umbenennen, um es einfacher zu machen, und wann Hinzufügen Mehrere Verzeichnisklassenpfade hinzufügen usw. Ich weiß nicht, was fehlen könnte.

Auch wenn ich versuche, dasselbe in vscode zu tun, indem ich die .jar-Datei unter „Referenzierte Bibliotheken“ hinzufüge, funktioniert es immer noch nicht.

Workaround

Das Problem besteht darin, dass auch der SQLite-JDBC-Treiber erforderlich ist slf4j-api-1.7.36.jar, Einzelheiten finden Sie im github-Repository:

Mit anderen Worten, Sie müssen auch slf4j-api-1.7.36.jar in dieses Verzeichnis einfügen und Folgendes verwenden:

java -cp ".;sqlite-jdbc-3.44.1.0.jar;slf4j-api-1.7.36.jar" database

Auf meiner Maschine würde es funktionieren:

d:\temp> java -cp ".;sqlite-jdbc-3.44.1.0.jar;slf4j-api-1.7.36.jar" database
slf4j: failed to load class "org.slf4j.impl.staticloggerbinder".
slf4j: defaulting to no-operation (nop) logger implementation
slf4j: see http://www.slf4j.org/codes.html#staticloggerbinder for further details.
connection is established
connection closed.

Wenn Sie class.forname("org.sqlite.jdbc") 明确添加到您的应用程序中,您将能够诊断此问题,因为如果没有 slf4-api-1.7.36.jar 则会导致中(我将 class.forname 添加到 main haben):

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

Obwohl das explizite Laden des Treibers nicht mehr erforderlich ist, kann er zusätzliche Informationen zur Fehlerbehebung liefern.

Das obige ist der detaillierte Inhalt vonJDBC und SQLite – Ich kann nicht den richtigen Treiber finden, egal was ich versuche. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen