Java и SQLite [закрыто]

333

Меня привлекает аккуратность, которую обеспечивает одна файловая база данных. Какая библиотека драйверов / соединителей предназначена для подключения и использования SQLite с Java.

Я обнаружил библиотеку обертки, http://www.ch-werner.de/javasqlite , но есть ли другие более известные проекты, доступные?

Скотт Беннетт-Маклиш
источник
10
Мне нравится, что вопрос с сотнями откликов и ответами с сотнями откровений закрыт как "не по теме". Это немного стыдно, лол
Эндрю Костер

Ответы:

196

В вики перечислены еще несколько обёрток:

  • Оболочка Java (вокруг интерфейса SWIG): http://tk-software.home.comcast.net/
  • Хороший учебник для использования драйвера JDBC для SQLite. (это работает по крайней мере!) http://www.ci.uchicago.edu/wiki/bin/view/VDS/VDSDevelopment/UsingSQLite
  • Кроссплатформенный драйвер JDBC, который использует встроенные собственные библиотеки SQLite в Windows, Linux, OS X и использует чистую реализацию Java в других ОС: https://github.com/xerial/sqlite-jdbc (ранее zentus )
  • Еще одна Java - SWIG обертка. Работает только на Win32. http://rodolfo_3.tripod.com/index.html
  • sqlite-java-shell: 100% чистый Java-порт оболочки командной строки sqlite3, созданной с помощью NestedVM. (Это не драйвер JDBC).
  • Драйвер SQLite JDBC для Mysaifu JVM: Драйвер SQLite JDBC для Mysaifu JVM и библиотеки SQLite JNI для Windows (x86) и Linux (i386 / PowerPC).
Питер Хоффманн
источник
7
Мое дополнение к этому списку - sqlite4java - code.google.com/p/sqlite4java - это оболочка (без JDBC); предварительно скомпилирован для Windows, Mac, Linux. Он прост в использовании и обеспечивает соблюдение некоторых контрактов, чтобы помочь разработчику избежать использования SQLite.
Середа
7
sqlite4java выглядит интересно, но у них также есть отличное сравнение различных оболочек: code.google.com/p/sqlite4java/wiki/ComparisonToOtherWrappers
Скотт Беннетт-Маклиш
1
@kdt проблема, которую я обнаружил с драйвером zentus, заключается в том, что он, похоже, вообще не поддерживает BLOB
Martijn
12
@Martijn xerial.org/trac/Xerial/wiki/SQLiteJDBC - это вилка драйвера zentus и поддерживает BLOB (на их сайте есть краткая информация).
johnharris85
17
zentus.com/sqlitejdbc -> 404
m0skit0
247

Я нашел ваш вопрос при поиске информации с SQLite и Java. Просто подумал, что добавлю свой ответ, который я также разместил в своем блоге .

Я уже давно пишу на Java. Я также знал о SQLite, но никогда не использовал его… Ну, я использовал его через другие приложения, но никогда в приложении, которое я кодировал. Так что я нуждался в этом для проекта на этой неделе, и он настолько прост в использовании!

Я нашел драйвер Java JDBC для SQLite. Просто добавьте JAR-файл в ваш classpath и импортируйте java.sql. *

Его тестовое приложение создаст файл базы данных, отправит несколько команд SQL для создания таблицы, сохранит некоторые данные в таблице, прочитает их и отобразит на консоли. Он создаст файл test.db в корневом каталоге проекта. Вы можете запустить этот пример с java -cp .:sqlitejdbc-v056.jar Test.

package com.rungeek.sqlite;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class Test {
    public static void main(String[] args) throws Exception {
        Class.forName("org.sqlite.JDBC");
        Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");
        Statement stat = conn.createStatement();
        stat.executeUpdate("drop table if exists people;");
        stat.executeUpdate("create table people (name, occupation);");
        PreparedStatement prep = conn.prepareStatement(
            "insert into people values (?, ?);");

        prep.setString(1, "Gandhi");
        prep.setString(2, "politics");
        prep.addBatch();
        prep.setString(1, "Turing");
        prep.setString(2, "computers");
        prep.addBatch();
        prep.setString(1, "Wittgenstein");
        prep.setString(2, "smartypants");
        prep.addBatch();

        conn.setAutoCommit(false);
        prep.executeBatch();
        conn.setAutoCommit(true);

        ResultSet rs = stat.executeQuery("select * from people;");
        while (rs.next()) {
            System.out.println("name = " + rs.getString("name"));
            System.out.println("job = " + rs.getString("occupation"));
        }
        rs.close();
        conn.close();
    }
  }
Берни Перес
источник
1
Вот почему я думаю, что Джоэл говорил бычьи слова (технический доклад Google: youtube.com/watch?v=NWHfY_lvKIQ ), когда говорил, что дизайн stackoverflow.com лучше из-за того, что все «старые» посты болтаются в Интернете. Это просто перефразировка.
Николаос
26
Также обратите внимание, что проект Crawshaw, кажется, находится в состоянии перерыва, но был разветвлен и обновлен здесь: xerial.org/trac/Xerial/wiki/SQLiteJDBC
lapo
8
zentus.com кажется сломанным, найденное зеркало здесь; priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/about.htm
Даниэль Магнуссон
3
Спасибо @DanielMagnusson, ты спасатель жизни. Что касается темы, любой, кто все еще ищет драйвер sqliteJDBC, может перейти на priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/…, так как ссылка на ссылку about.htm неверна.
javatarz
2
Зависимость maven: mvnrepository.com/artifact/org.xerial/sqlite-jdbc
Карл Бош
30

Я понимаю, что вы спрашивали конкретно о SQLite, но, возможно, база данных HSQL лучше подойдет для Java. Он написан на самой Java, работает в JVM, поддерживает таблицы в памяти и т. Д., И все эти функции делают его вполне пригодным для прототипирования и модульного тестирования.

javashlook
источник
3
Да, HSQL - очень хороший выбор, и я достаточно широко использовал его в паре клиентских приложений для хорошего эффекта. Однако в этом случае я действительно хотел использовать SQLite.
Скотт Беннетт-Маклиш
18

Проект Дэвида Крошау (sqlitejdbc-v056.jar), кажется, устарел, и последнее обновление было 20 июня 2009, источник здесь

Я бы порекомендовал вилку Xerials из обертки Crawshaw sqlite. Я заменил sqlitejdbc-v056.jar на файл Xerials sqlite-jdbc-3.7.2.jar без каких-либо проблем.

Использует тот же синтаксис, что и в ответе Берни, и намного быстрее и с новейшей библиотекой sqlite.

Чем отличается Zentus от SQLite JDBC?

Исходный драйвер Zentus для SQLite JDBC http://www.zentus.com/sqlitejdbc/ сам по себе является отличной утилитой для использования баз данных SQLite на языке Java, и наша библиотека SQLiteJDBC также опирается на его реализацию. Тем не менее, его чистая Java-версия, которая полностью переводит коды SQLite на C / C ++ в Java, значительно медленнее по сравнению с собственной версией, которая использует двоичные файлы SQLite, скомпилированные для каждой ОС (win, mac, linux).

Чтобы использовать собственную версию sqlite-jdbc, пользователь должен был указать путь к собственным кодам (dll, jnilib, таким образом, файлы, которые являются программами JNDI C), используя аргументы командной строки, например, -Djava.library.path = (путь к dll, jnilib и т. д.) или -Dorg.sqlite.lib.path и т. д. Этот процесс был подвержен ошибкам и мешал каждому пользователю указывать эти переменные. Наша библиотека SQLiteJDBC полностью устраняет эти неудобства.

Другое отличие состоит в том, что мы поддерживаем эту библиотеку SQLiteJDBC самой новой версией движка SQLite, потому что мы являемся одним из самых горячих пользователей этой библиотеки. Например, SQLite JDBC является основным компонентом UTGB (Токийского университета Genome Browser) Toolkit, который является нашей утилитой для создания персонализированных браузеров генома.

РЕДАКТИРОВАТЬ : Как обычно, когда вы обновляете что-то, будут проблемы в каком-то непонятном месте в вашем коде (случилось со мной). Тест Тест Тест =)

Даниэль Магнуссон
источник
1
sqlite-jdbcПроект является большим, но быть в курсе , что это Apache лицензированы . Поэтому вы должны дать атрибуцию, если вы используете ее, будь то код FOSS или проприетарный.
dotancohen
16

Существует новый проект SQLJet, который является чистой реализацией SQLite на Java. Он еще не поддерживает все функции SQLite, но может быть очень хорошим вариантом для некоторых проектов Java, работающих с базами данных SQLite.


источник
4
Это выглядит многообещающе, но похоже, что пока не предлагает возможности SQL-запросов, что-то вроде прерывателя сделки.
Скотт Беннетт-Маклиш
Все еще не поддерживает запросы SQL, скорее, API более низкого уровня.
Базель Шишани
Все еще очень полезно для приложений, где вам нужно только генерировать файлы SQLite, т. Е. Не нужно SQL для запроса данных.
Алхимик
5

Сообщение Берни очень полезно. Не могу проголосовать (не хватает репутации :(). Но это очень помогло. Просто повторить!

http://www.zentus.com/sqlitejdbc/

Здесь вы можете найти последнюю версию jite для SQLite JDBC. Просто добавьте банку в ваш путь к классу, и все готово! :) Вы можете запустить пример кода Берни, чтобы проверить, все ли в порядке.

http://souptonuts.sourceforge.net/readme_sqlite_tutorial.html http://www.sqlite.org/lang.html

Здесь вы можете найти некоторую помощь по синтаксису SQL для SQLite. Ура к SQLite :)

Шринивас
источник
3

Когда вы компилируете и запускаете код, вы должны установить значение параметров classpath. Так же, как следующее:

javac -classpath .;sqlitejdbc-v056.jar Text.java

java -classpath .;sqlitejdbc-v056.jar Text

Пожалуйста, обратите внимание на "." и sparate ";" (победа, linux - ":")

aboutstudy
источник
3

Код sqlitejdbc можно загрузить с помощью git по адресу https://github.com/crawshaw/sqlitejdbc .

# git clone https://github.com/crawshaw/sqlitejdbc.git sqlitejdbc
...
# cd sqlitejdbc
# make

Примечание: Makefile требует двоичного файла curl для загрузки библиотек / deps sqlite.

Morbo
источник
2

Пример кода приводит к утечке памяти в Tomcat (после удаления веб-приложения загрузчик классов все еще остается в памяти), что в outofmemoryконечном итоге приведет к . Чтобы решить эту проблему, используйте sqlite-jdbc-3.7.8.jar ; это снимок, поэтому он еще не появился для maven.

улитка
источник
0

Опечатка: java -cp .:sqlitejdbc-v056.jar Test

должно быть: java -cp .:sqlitejdbc-v056.jar; Test

обратите внимание на точку с запятой после «.jar», я надеюсь, что это помогает людям, может вызвать много хлопот

Эдди
источник
Хотите разработать? На * nix the; отделит Java от команды Test (и, следовательно, создаст ошибку). В Windows: не будет работать как разделитель cp. Так что в целом .:xxx.jar;нет смысла. И вам также нужно указать имя пакета для класса Test.
Eckes