Не найден подходящий драйвер (SQLite)
Я надеюсь, что кто-то может помочь мне. Я работаю над простым приложением, которое подключается к базе данных SQLite. Ниже приведен мой код:
try {
Connection con = DriverManager.getConnection("jdbc:sqlite:myDB.sqlite");
PreparedStatement pstm = con.prepareStatement("insert into hell(username,pssword) " +
"values ('"+tfUname.getText()+"','"+tfUpass.getText()+"')");
pstm.close();
con.close();
JOptionPane.showMessageDialog(null,"Congrats, you have been registered succesfully");
RegisterWindow rw = new RegisterWindow();
rw.setVisible(false);
pack();
dispose();
} catch(SQLException ex) {
setTitle(ex.toString());
}
Это просто окно для загрузки имени пользователя и пароля в базу данных. Проблема в том, что при нажатии на кнопку появляется следующее исключение:
"java.sql.SQLException: No suitable driver found for jdbc:sqlite:CLoginJava2myDB.sqlite"
(Я нашел пример о том, как подключиться к базе данных SQLite в Java, пример, который я нашел работает хорошо)
эта программа Я делаю это в window builder (eclipse). Я использую тот же драйвер, что и в Примере, который я нашел. Я не знаю, должен ли я использовать другого водителя. На самом деле, я пробовал с разными драйверами, но это сообщение все равно появляется.
6 ответов
в пути к классам отсутствуют jar(ы), содержащие классы sqlite и драйвер. Вам нужно что-то вроде sqlite-jdbc-3.7.2.jar или ваша применимая версия.
Если вы уверены, что jar есть, попробуйте добавить эту строку кода перед созданием соединения:
Class.forName("org.sqlite.JDBC");
У меня такая же проблема. Я использовал maven и добавил зависимость:
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.15.1
</version>
</dependency>
Он может быть скомпилирован, и я получил:
не найден подходящий драйвер для jdbc:sqlite:xx.db
Я проверил путь к классам, и я был уверен, что sqlite-jdbc-3.15.1.Джар был там. Я думаю, что по какой-то причине класс не был загружен, я не знаю, почему. поэтому я добавил
класса.forName ("org.базы данных SQLite.JDBC");
в начале моего кода. Он работал!
и , Я удаляю строку выше. Он все еще работает! Я очистил проект и перестроил его, больше никакого класса.forName() необходим!!! Я до сих пор не знаю, почему. Но проблема решена. Думаю, класс.forName () может использоваться для диагностики, если необходимый класс находится в пути к классам.
есть что-то большее, чем просто класс.forName.
в случае, если вы сделали и то ниже: - Добавлена библиотека SQLite jar в папку lib под вашим проектом, ссылка на него в пути сборки проекта. - Добавлен Класс.forName ("org.базы данных SQLite.В JDBC") заявление. И сообщение об ошибке" нет драйвера костюма " все еще появляется, его может быть вызвано вашим путем к базе данных. Если вы используете Windows: Вместо:
DriverManager.getConnection("D:\db\my-db.sqlite").
вы должны использовать:
DriverManager.getConnection("jdbc:sqlite:D:\db\my-db.sqlite").
" jdbc:sqlite: "будет сделать трюк.
Если вы используете Linux, просто измените символ разделителя: DriverManager.метод getconnection("JDBC в:данных SQLite:/ваш/somepath/мой-дБ.данных SQLite").
строка " класс.forName ("org.базы данных SQLite.JDBC"); " работает, потому что он создает экземпляр JDBC, который запускает статический блок класса JDBC:
static {
try {
DriverManager.registerDriver(new JDBC());
}
catch (SQLException e) {
e.printStackTrace();
}
}
вместо добавления класса.forname (), упомянутый выше, вы должны напрямую использовать эту строку, которая имеет тот же эффект и которая более элегантна (потому что вы не создаете экземпляр JDBC бесплатно):
DriverManager.registerDriver(new JDBC());
Если вы используете Maven и хотите создать исполняемый jar, вы можете решить импортировать содержимое jar sqlite в свой собственный jar:
<plugins>
<!-- any other plugins -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
<addClasspath>true</addClasspath>
<mainClass>MyPackage.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
вам не нужно будет добавлять определенный путь к классам или неявное использование, как предложено в других ответах.
я столкнулся с аналогичными проблемами, используя простую конфигурацию gradle следующим образом
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.0'
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.2.0'
compile group: 'org.xerial', name: 'sqlite-jdbc', version: '3.23.1'
}
jar {
manifest {
attributes 'Main-Class': 'rewards.simulator.MainSimulator'
}
}
позже я обнаружил, что Gradle build создавал jar, который не включал никаких внешних зависимостей. Следующая конфигурация должна использоваться для включения всех ваших зависимых библиотек в результирующий файл jar вместе с исходными файлами для создания fat-jar:
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.0'
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.2.0'
compile group: 'org.xerial', name: 'sqlite-jdbc', version: '3.23.1'
}
jar {
manifest {
attributes 'Main-Class': 'rewards.simulator.MainSimulator'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}