Java i SQLite [zamknięte]

333

Przyciąga mnie schludność, jaką zapewnia baza danych z jednym plikiem. Jaka biblioteka sterowników / konektorów jest dostępna do łączenia i używania SQLite z Javą.

Odkryłem bibliotekę opakowań, http://www.ch-werner.de/javasqlite , ale czy są dostępne inne bardziej znaczące projekty?

Scott Bennett-McLeish
źródło
10
Podoba mi się, że pytanie z setkami głosów pozytywnych i odpowiedzi, które mają setki głosów pozytywnych, jest zamknięte jako „nie na temat”. To trochę zawstydzające, lol
Andrew Koster

Odpowiedzi:

196

Na Wiki wymienia kilka owijarki:

Peter Hoffmann
źródło
7
Mój dodatek do tej listy to sqlite4java - code.google.com/p/sqlite4java - jest to opakowanie (bez JDBC); prekompilowane dla Windows, Mac, Linux. Jest prosty w użyciu i wymusza niektóre umowy, aby pomóc deweloperowi uniknąć niewłaściwego używania SQLite.
sereda
7
sqlite4java wygląda interesująco, ale mają też świetne porównanie różnych dostępnych tam opakowań: code.google.com/p/sqlite4java/wiki/ComparisonToOtherWrappers
Scott Bennett-McLeish
1
@kdt Problem, który znalazłem ze sterownikiem zentus polega na tym, że wydaje się on w ogóle nie obsługiwać BLOBów
Martijn
12
@Martijn xerial.org/trac/Xerial/wiki/SQLiteJDBC jest rozwidleniem sterownika zentus i obsługuje BLOB (na ich stronie jest krótki tut).
johnharris85
17
zentus.com/sqlitejdbc -> 404
m0skit0
247

Znalazłem twoje pytanie podczas wyszukiwania informacji za pomocą SQLite i Java. Pomyślałem, że dodam swoją odpowiedź, którą również zamieściłem na swoim blogu .

Od jakiegoś czasu koduję w Javie. Wiem także o SQLite, ale nigdy go nie użyłem… Cóż, użyłem go w innych aplikacjach, ale nigdy w aplikacji, którą kodowałem. Potrzebowałem go więc do projektu w tym tygodniu i to takie proste!

Znalazłem sterownik JDBC Java dla SQLite. Wystarczy dodać plik JAR do ścieżki klasy i zaimportować plik java.sql. *

Jego aplikacja testowa utworzy plik bazy danych, wyśle ​​niektóre polecenia SQL, aby utworzyć tabelę, zapisze niektóre dane w tabeli i odczyta je z powrotem i wyświetli na konsoli. Spowoduje to utworzenie pliku test.db w katalogu głównym projektu. Możesz uruchomić ten przykład za pomocą 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();
    }
  }
Bernie Perez
źródło
1
Właśnie dlatego myślę, że Joel mówił bykiem (dyskusja techniczna Google: youtube.com/watch?v=NWHfY_lvKIQ ), mówiąc, że projekt stackoverflow.com jest lepszy ze względu na wszystkie „stare” posty wiszące w Internecie. To tylko powtórka.
Nikolaos
26
Zauważ również, że projekt Crawshaw wydaje się być w zawieszeniu, ale został rozwidlony i zaktualizowany tutaj: xerial.org/trac/Xerial/wiki/SQLiteJDBC
lapo
8
zentus.com wydaje się zepsuty, znalazłem tutaj lustro; priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/about.htm
Daniel Magnusson
3
Dzięki @DanielMagnusson, ratujesz życie. W tym temacie każdy, kto nadal szuka sterownika sqliteJDBC, może przejść do priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/..., ponieważ łącze do linku about.htm jest nieprawidłowe.
javatarz
2
zależność od maven: mvnrepository.com/artifact/org.xerial/sqlite-jdbc
Carl Bosch
30

Rozumiem, że pytałeś konkretnie o SQLite, ale może baza danych HSQL lepiej pasowałaby do Javy. Jest napisany w samej Javie, działa w JVM, obsługuje tabele w pamięci itp., A wszystkie te funkcje sprawiają, że jest całkiem użyteczny do prototypowania i testowania jednostkowego.

javashlook
źródło
3
Tak, HSQL to bardzo dobry wybór i korzystałem z niego dość szeroko w kilku aplikacjach klienckich, aby uzyskać dobry efekt. Jednak w tym przypadku rzeczywiście chciałem użyć SQLite.
Scott Bennett-McLeish
18

Projekt Davida Crawshawa (sqlitejdbc-v056.jar) wydaje się nieaktualny, a ostatnia aktualizacja to 20 czerwca 2009 r. Źródło tutaj

Polecam Xerials widelec z Crawshaw SQLite owijki. Bez problemu zastąpiłem plik sqlitejdbc-v056.jar plikiem Xerials sqlite-jdbc-3.7.2.jar.

Używa tej samej składni, co w odpowiedzi Berniego, i jest znacznie szybszy i ma najnowszą bibliotekę sqlite.

Czym różni się od SQLite JDBC Zentus?

Oryginalny sterownik SQLite JDBC Zentus http://www.zentus.com/sqlitejdbc/ sam w sobie jest doskonałym narzędziem do korzystania z baz danych SQLite z języka Java, a nasza biblioteka SQLiteJDBC również polega na jego implementacji. Jednak jego wersja czysto java, która całkowicie tłumaczy kody c / c ++ SQLite na Javę, jest znacznie wolniejsza w porównaniu z wersją natywną, która używa plików binarnych SQLite skompilowanych dla każdego systemu operacyjnego (win, mac, linux).

Aby użyć natywnej wersji sqlite-jdbc, użytkownik musiał ustawić ścieżkę do kodów natywnych (dll, jnilib, więc pliki, które są programami JNDI C), używając argumentów wiersza poleceń, np. -Djava.library.path = (ścieżka do biblioteki dll, jnilib itp.) lub -Dorg.sqlite.lib.path itp. Ten proces był podatny na błędy i kłopotliwy, aby każdy użytkownik mógł ustawić te zmienne. Nasza biblioteka SQLiteJDBC całkowicie eliminuje te niedogodności.

Kolejna różnica polega na tym, że aktualizujemy bibliotekę SQLiteJDBC do najnowszej wersji silnika SQLite, ponieważ jesteśmy jednym z najgorętszych użytkowników tej biblioteki. Na przykład SQLite JDBC jest podstawowym składnikiem UTGB (University of Tokyo Genome Browser) Toolkit, który jest naszym narzędziem do tworzenia spersonalizowanych przeglądarek genomów.

EDYCJA : Jak zwykle, gdy coś zaktualizujesz, pojawią się problemy w niewyraźnym miejscu w twoim kodzie (zdarzyło mi się). Test test test =)

Daniel Magnusson
źródło
1
sqlite-jdbcProjekt jest świetny, ale należy pamiętać, że jest to Apache License . W związku z tym musisz podać atrybucję, jeśli go używasz, bez względu na to, czy kod ma kod FOSS, czy zastrzeżony.
dotancohen,
16

Pojawił się nowy projekt SQLJet, który jest czystą implementacją języka SQLite w Javie. Nie obsługuje jeszcze wszystkich funkcji SQLite, ale może być bardzo dobrą opcją dla niektórych projektów Java, które działają z bazami danych SQLite.


źródło
4
Wygląda obiecująco, ale wydaje się, że nie oferuje jeszcze możliwości zapytania SQL, co jest dla mnie rodzajem przełomu.
Scott Bennett-McLeish
Nadal nie obsługuje zapytań SQL, a raczej interfejs API niższego poziomu.
Basel Shishani,
Nadal bardzo przydatne dla aplikacji, w których wystarczy wygenerować pliki SQLite, tzn. Nie potrzebują SQL do zapytania danych.
Alchemik
5

Post Berniego jest bardzo pomocny. Nie można głosować (nie mam wystarczającej reputacji :(). Ale to bardzo pomogło. Powtarzam!

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

Tutaj możesz znaleźć najnowszy słoik SQLD JDBC. Po prostu dodaj słoik do swojej ścieżki klas i gotowe! :) Możesz uruchomić przykładowy kod Berniego, aby sprawdzić, czy wszystko jest w porządku.

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

Tutaj znajdziesz pomoc dotyczącą składni SQL dla SQLite. Pozdrawiam SQLite :)

Srinivas
źródło
3

Podczas kompilowania i uruchamiania kodu należy ustawić wartość opcji ścieżki klasy. Podobnie jak poniżej:

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

java -classpath .;sqlitejdbc-v056.jar Text

Proszę zwrócić uwagę na „.” i rzadkie „;” (wygrana, linux to „:”)

aboutstudy
źródło
3

kod sqlitejdbc można pobrać za pomocą git ze strony https://github.com/crawshaw/sqlitejdbc .

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

Uwaga: Makefile wymaga curl binary do pobierania bibliotek / depl sqlite.

Morbo
źródło
2

Przykładowy kod prowadzi do wycieku pamięci w Tomcat (po odinstalowaniu aplikacji internetowej moduł ładujący nadal pozostaje w pamięci), co w outofmemorykońcu spowoduje . Sposobem na jego rozwiązanie jest użycie narzędzia sqlite-jdbc-3.7.8.jar ; to migawka, więc nie pojawia się jeszcze dla maven.

ślimak
źródło
0

Literówka: java -cp .:sqlitejdbc-v056.jar Test

Powinien być: java -cp .:sqlitejdbc-v056.jar; Test

zauważ średnik po „.jar”. Mam nadzieję, że to pomaga ludziom, może powodować wiele problemów

Eddie
źródło
Możesz rozwinąć temat? Na * nix; oddzieli java od polecenia Test (i dlatego stworzy błąd). W systemie Windows: nie będzie działać jako separator cp. Więc w sumie .:xxx.jar;nie ma sensu. Musisz także podać nazwę pakietu dla klasy Test.
eckes