Maison  >  Article  >  JDBC et SQLite – Je ne trouve pas le bon pilote, peu importe ce que j'essaye

JDBC et SQLite – Je ne trouve pas le bon pilote, peu importe ce que j'essaye

王林
王林avant
2024-02-09 10:57:18567parcourir

L'éditeur php Yuzai a rencontré un problème lors de l'utilisation de JDBC et SQLite. Peu importe ses efforts, il n'a pas pu trouver de pilote approprié. JDBC est une interface standard permettant à Java de se connecter à la base de données, tandis que SQLite est un moteur de base de données relationnelle intégré léger. Cependant, bien que JDBC fournisse des pilotes pour diverses bases de données, il n'existe aucun pilote spécifiquement conçu pour SQLite. Cela a rendu l'éditeur confus et incapable de se connecter et de faire fonctionner la base de données SQLite normalement. Dans le prochain article, nous explorerons les moyens de résoudre ce problème.

Contenu de la question

À des fins d'apprentissage, j'essaie de créer un programme Java simple et de me connecter à la base de données SQLite. Mais malgré tous mes efforts, je n’ai pas réussi. Je reçois toujours des chauffeurs no 适用于 jdbc:sqlite:database.db. Mais cela devrait être si simple. J'ai essayé de nombreux pilotes du référentiel maven.

J'ai lu et compris la théorie : l'API jdbc gère la communication avec le gestionnaire jdbc, tandis que le pilote jdbc gère la communication avec la base de données. J'ai également appris que lorsque j'exécute le fichier de classe compilé, je dois ajouter le chemin de classe au fichier .jar contenant le pilote de base de données. Par exemple, comme expliqué ici.

Certains tutoriels prétendent devoir utiliser class.forname() pour enregistrer le pilote, mais la documentation Oracle dit :

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

De plus, le tutoriel SQLite que j'ai suivi n'a jamais enregistré le pilote avant d'exécuter l'drivermanager.getconnection(url); exemple sqlitetutorial.net

Dans mon répertoire e:project J'ai ces fichiers :

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

Lorsque j'exécute le fichier de classe compilé, j'utilise java -cp ".;sqlite-jdbc-3.44.1.0.jar" database

dans une fenêtre de terminal (PowerShell)

Voici mon 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

Si je peux obtenir de l'aide pour me faire avancer, je serais très reconnaissant.

Je suppose que cela a quelque chose à voir avec le fait de ne pas pouvoir trouver le fichier .jar, mais j'ai tout essayé : mettre une copie du fichier .jar n'importe où dans un répertoire différent, le renommer pour le rendre plus simple, et quand ajout Ajouter plusieurs chemins de classe de répertoire, etc. Je ne sais pas ce qui pourrait manquer.

De plus, lorsque j'essaie de faire la même chose dans vscode, en ajoutant le fichier .jar sous "Bibliothèques référencées", cela ne fonctionne toujours pas.

Solution de contournement

Le problème est que le pilote sqlite jdbc est également requis slf4j-api-1.7.36.jar, consultez son dépôt github pour plus de détails :

En d'autres termes, vous devez également mettre slf4j-api-1.7.36.jar dans ce répertoire et utiliser :

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

Sur ma machine, cela ferait fonctionner :

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.

Si vous avez 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

Ainsi, même si le chargement explicite du pilote n'est plus nécessaire, il peut fournir des informations de dépannage supplémentaires.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer