Rumah  >  Artikel  >  JDBC dan SQLite - Saya tidak dapat mencari pemandu yang betul tidak kira apa yang saya cuba

JDBC dan SQLite - Saya tidak dapat mencari pemandu yang betul tidak kira apa yang saya cuba

王林
王林ke hadapan
2024-02-09 10:57:18571semak imbas

editor php Yuzai menghadapi masalah apabila menggunakan JDBC dan SQLite Tidak kira betapa kerasnya dia mencuba, dia tidak dapat mencari pemandu yang sesuai. JDBC ialah antara muka standard untuk Java untuk menyambung ke pangkalan data, manakala SQLite ialah enjin pangkalan data hubungan tertanam ringan. Walau bagaimanapun, walaupun JDBC menyediakan pemacu untuk pelbagai pangkalan data, tiada pemacu yang direka khusus untuk SQLite. Ini menjadikan editor keliru dan tidak dapat menyambung dan mengendalikan pangkalan data SQLite secara normal. Dalam artikel seterusnya, kami akan meneroka cara untuk menyelesaikan masalah ini.

Kandungan soalan

Untuk tujuan pembelajaran, saya cuba membuat program java yang mudah dan menyambung ke pangkalan data sqlite. Tetapi tidak kira bagaimana saya mencuba, saya tidak berjaya. Saya sentiasa mendapat no 适用于 jdbc:sqlite:database.db pemandu. Tetapi ia sepatutnya begitu mudah. Saya telah mencuba banyak pemandu dari repositori maven.

Saya telah membaca dan memahami teori: jdbc api mengendalikan komunikasi dengan pengurus jdbc, manakala pemandu jdbc mengendalikan komunikasi dengan pangkalan data. Saya juga mengetahui bahawa apabila saya menjalankan fail kelas yang disusun, saya perlu menambah classpath pada fail .jar yang mengandungi pemacu pangkalan data. Sebagai contoh, seperti yang dijelaskan di sini.

Sesetengah tutorial mendakwa perlu menggunakan class.forname() untuk mendaftarkan pemandu, tetapi dokumentasi oracle mengatakan:

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

Juga, tutorial sqlite yang saya ikuti tidak pernah mendaftarkan pemandu sebelum menjalankan drivermanager.getconnection(url); contoh sqlitetutorial.net

Dalam direktori saya e:project Saya mempunyai fail ini:

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

Apabila saya menjalankan fail kelas yang disusun, saya menggunakan java -cp ".;sqlite-jdbc-3.44.1.0.jar" database

dalam tetingkap terminal (powershell)

Ini kod saya:

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

Jika saya boleh mendapatkan sebarang bantuan untuk mendorong saya ke hadapan, saya akan sangat berterima kasih.

Saya rasa ia ada kaitan dengan tidak dapat mencari fail .jar, tetapi saya telah mencuba segala yang mungkin: meletakkan salinan fail .jar di mana-mana sahaja dalam direktori yang berbeza, menamakannya semula untuk menjadikannya lebih mudah dan apabila menambah Tambah berbilang laluan kelas direktori, dsb. Saya tidak tahu apa yang mungkin hilang.

Selain itu, apabila saya cuba melakukan perkara yang sama dalam vscode, dengan menambahkan fail .jar di bawah "Perpustakaan Dirujuk", ia masih tidak berfungsi.

Penyelesaian

Masalahnya ialah pemacu jdbc sqlite juga diperlukan slf4j-api-1.7.36.jar, lihat repositori githubnya untuk butiran:

Dalam erti kata lain, anda juga perlu meletakkan slf4j-api-1.7.36.jar ke dalam direktori tersebut dan menggunakan:

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

Pada mesin saya ini akan menjadikannya berfungsi:

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.

Jika anda ada 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

Jadi semasa memuatkan pemandu secara eksplisit tidak lagi diperlukan, ia boleh memberikan maklumat penyelesaian masalah tambahan.

Atas ialah kandungan terperinci JDBC dan SQLite - Saya tidak dapat mencari pemandu yang betul tidak kira apa yang saya cuba. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam