Java et SQLite [fermé]

333

Je suis attiré par la netteté qu'offre une base de données à fichier unique. Quelle bibliothèque de pilotes / connecteurs existe pour se connecter et utiliser SQLite avec Java.

J'ai découvert une bibliothèque d'encapsuleurs, http://www.ch-werner.de/javasqlite , mais y a-t-il d'autres projets plus importants disponibles?

Scott Bennett-McLeish
la source
10
J'adore le fait qu'une question contenant des centaines de votes positifs et des réponses contenant des centaines de votes positifs soient fermées comme "hors sujet". C'est un peu gênant, lol
Andrew Koster

Réponses:

196

Le wiki répertorie quelques autres wrappers:

Peter Hoffmann
la source
7
Mon ajout à cette liste est sqlite4java - code.google.com/p/sqlite4java - c'est un wrapper (pas JDBC); précompilé pour Windows, Mac, Linux. Il est simple à utiliser et applique certains contrats pour aider le développeur à éviter toute utilisation abusive de SQLite.
sereda
7
sqlite4java semble intéressant, mais ils ont également une grande comparaison des différents wrappers disponibles: code.google.com/p/sqlite4java/wiki/ComparisonToOtherWrappers
Scott Bennett-McLeish
1
@kdt le problème que j'ai trouvé avec le pilote zentus est qu'il ne semble pas du tout prendre en charge les BLOB
Martijn
12
@Martijn xerial.org/trac/Xerial/wiki/SQLiteJDBC est un fork du pilote de zentus et prend en charge BLOB (il y a un court tut sur leur site).
johnharris85
17
zentus.com/sqlitejdbc -> 404
m0skit0
247

J'ai trouvé votre question lors de la recherche d'informations avec SQLite et Java. Je pensais juste ajouter ma réponse que j'ai également publiée sur mon blog .

Je code en Java depuis un moment maintenant. Je connais également SQLite mais je ne l'ai jamais utilisé… Eh bien, je l'ai utilisé via d'autres applications mais jamais dans une application que j'ai codée. J'en avais donc besoin pour un projet cette semaine et c'est tellement simple d'utilisation!

J'ai trouvé un pilote Java JDBC pour SQLite. Ajoutez simplement le fichier JAR à votre chemin de classe et importez java.sql. *

Son application de test créera un fichier de base de données, enverra quelques commandes SQL pour créer une table, stockera des données dans la table, la relira et affichera sur la console. Il créera le fichier test.db dans le répertoire racine du projet. Vous pouvez exécuter cet exemple avec 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
la source
1
C'est pourquoi je pense que Joel parlait de taureau (Google tech talk: youtube.com/watch?v=NWHfY_lvKIQ ) en disant que le design de stackoverflow.com est meilleur à cause de tous les "anciens" messages qui traînent sur Internet. C'est juste un remaniement.
Nikolaos
26
Notez également que le projet Crawshaw semble en pause, mais a été bifurqué et mis à jour ici: xerial.org/trac/Xerial/wiki/SQLiteJDBC
lapo
8
zentus.com semble cassé, miroir trouvé ici; priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/about.htm
Daniel Magnusson
3
Merci @DanielMagnusson, vous êtes un épargnant de vie. Sur le sujet, toute personne recherchant toujours le pilote sqliteJDBC peut accéder à priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/… car le lien vers lequel les liens about.htm sont incorrects.
javatarz
2
Dépendance maven
Carl Bosch
30

Je comprends que vous avez posé des questions spécifiques sur SQLite, mais peut-être que la base de données HSQL serait mieux adaptée à Java. Il est écrit en Java lui-même, s'exécute dans la JVM, prend en charge les tables en mémoire, etc. et toutes ses fonctionnalités le rendent très utilisable pour le prototypage et les tests unitaires.

javashlook
la source
3
Oui, HSQL est un très bon choix et je l'ai utilisé assez largement dans quelques applications clientes pour un bon effet. Dans ce cas cependant, je voulais en effet utiliser SQLite.
Scott Bennett-McLeish
18

Le projet de David Crawshaw (sqlitejdbc-v056.jar) semble obsolète et la dernière mise à jour date du 20 juin 2009, source ici

Je recommanderais la fourche Xerials du wrapper sqlite Crawshaw. J'ai remplacé sqlitejdbc-v056.jar par le fichier Xerials sqlite-jdbc-3.7.2.jar sans aucun problème.

Utilise la même syntaxe que dans la réponse de Bernie et est beaucoup plus rapide et avec la dernière bibliothèque sqlite.

Qu'est-ce qui est différent du SQLite JDBC de Zentus?

Le pilote JDBC SQLite d'origine de Zentus http://www.zentus.com/sqlitejdbc/ lui-même est un excellent utilitaire pour utiliser des bases de données SQLite à partir du langage Java, et notre bibliothèque SQLiteJDBC s'appuie également sur sa mise en œuvre. Cependant, sa version pure-java, qui traduit totalement les codes c / c ++ de SQLite en Java, est nettement plus lente que sa version native, qui utilise des binaires SQLite compilés pour chaque OS (win, mac, linux).

Pour utiliser la version native de sqlite-jdbc, l'utilisateur devait définir un chemin d'accès aux codes natifs (dll, jnilib, so files, qui sont des programmes JNDI C) en utilisant des arguments de ligne de commande, par exemple, -Djava.library.path = (chemin d'accès à la dll, jnilib, etc.), ou -Dorg.sqlite.lib.path, etc. Ce processus était sujet à erreur et gênant pour dire à chaque utilisateur de définir ces variables. Notre bibliothèque SQLiteJDBC élimine complètement ces inconvénients.

Une autre différence est que nous gardons ce libray SQLiteJDBC à jour avec la dernière version du moteur SQLite, car nous sommes l'un des utilisateurs les plus en vogue de cette bibliothèque. Par exemple, SQLite JDBC est un composant central de la boîte à outils UTGB (University of Tokyo Genome Browser), qui est notre utilitaire pour créer des navigateurs de génome personnalisés.

EDIT : Comme d'habitude lorsque vous mettez à jour quelque chose, il y aura des problèmes dans un endroit obscur de votre code (ce qui m'est arrivé). Test test test =)

Daniel Magnusson
la source
1
Le sqlite-jdbcprojet est génial, mais sachez qu'il est sous licence Apache . Par conséquent, vous devez attribuer si vous l'utilisez, que votre code soit FOSS ou propriétaire.
dotancohen
16

Il y a un nouveau projet SQLJet qui est une implémentation Java pure de SQLite. Il ne prend pas encore en charge toutes les fonctionnalités SQLite, mais peut être une très bonne option pour certains des projets Java qui fonctionnent avec les bases de données SQLite.


la source
4
Cela semble prometteur, mais il semble qu'il n'offre pas encore de capacité de requête SQL, une sorte de rupture pour moi.
Scott Bennett-McLeish
Ne prend toujours pas en charge les requêtes SQL, mais plutôt une API de niveau inférieur.
Basel Shishani
Toujours très utile pour les applications où vous avez seulement besoin de générer des fichiers SQLite, c'est-à-dire, n'avez pas besoin de SQL pour interroger les données.
L'Alchimiste le
5

Le message de Bernie est très utile. Impossible de voter (pas assez de réputation :(). Mais cela a beaucoup aidé. Juste pour réitérer!

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

Vous trouverez ici le dernier pot JDBC SQLite. Ajoutez simplement le pot dans votre chemin de classe et vous avez terminé! :) Vous pouvez exécuter l'exemple de code de Bernie pour tester si tout va bien.

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

Vous trouverez ici de l'aide sur la syntaxe SQL pour SQLite. Bravo à SQLite :)

Srinivas
la source
3

Lorsque vous compilez et exécutez le code, vous devez définir la valeur des options de chemin de classe. Tout comme ce qui suit:

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

java -classpath .;sqlitejdbc-v056.jar Text

Veuillez faire attention à "." et le sparate ";" (win, le linux est ":")

à propos de l'étude
la source
3

Le code sqlitejdbc peut être téléchargé à l'aide de git depuis https://github.com/crawshaw/sqlitejdbc .

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

Remarque: Makefile nécessite un binaire curl pour télécharger les bibliothèques / dépôts sqlite.

Morbo
la source
2

L'exemple de code conduit à une fuite de mémoire dans Tomcat (après le retrait du déploiement de la webapp, le chargeur de classe reste en mémoire), ce qui entraînera outofmemoryéventuellement un . La façon de le résoudre est d'utiliser le sqlite-jdbc-3.7.8.jar ; c'est un instantané, donc il n'apparaît pas encore pour maven.

escargot
la source
0

Faute de frappe: java -cp .:sqlitejdbc-v056.jar Test

devrait être: java -cp .:sqlitejdbc-v056.jar; Test

remarquez le point-virgule après ".jar" j'espère que cela aide les gens, pourrait causer beaucoup de tracas

Eddie
la source
Envie d'élaborer? Sur * nix le; séparera le java de la commande Test (et donc créera une erreur). Sous Windows, le: ne fonctionnera pas comme un séparateur cp. Donc, dans l'ensemble, cela .:xxx.jar;n'a pas de sens. Et vous devez également spécifier le nom du package pour la classe Test.
vérifie le