Java y SQLite [cerrado]

333

Me atrae la pulcritud que proporciona una base de datos de un solo archivo. Qué biblioteca de controladores / conectores hay para conectar y usar SQLite con Java.

He descubierto una biblioteca de contenedor, http://www.ch-werner.de/javasqlite , pero ¿hay otros proyectos más destacados disponibles?

Scott Bennett-McLeish
fuente
10
Me encanta que una pregunta con cientos de votos a favor, y respuestas que tienen cientos de votos a favor, esté cerrada como "fuera de tema". Es un poco embarazoso, jajaja
Andrew Koster

Respuestas:

196

La wiki enumera algunos envoltorios más:

Peter Hoffmann
fuente
77
Mi adición a esta lista es sqlite4java - code.google.com/p/sqlite4java - es un contenedor (sin JDBC); precompilado para Windows, Mac, Linux. Es simple de usar y aplica algunos contratos para ayudar al desarrollador a evitar el uso indebido de SQLite.
sereda
77
sqlite4java parece interesante, pero también tienen una gran comparación de los diversos envoltorios disponibles: code.google.com/p/sqlite4java/wiki/ComparisonToOtherWrappers
Scott Bennett-McLeish
1
@kdt, el problema que encontré con el controlador zentus es que no parece admitir BLOB en absoluto
Martijn
12
@Martijn xerial.org/trac/Xerial/wiki/SQLiteJDBC es una bifurcación del controlador de zentus y admite BLOB (hay un breve resumen en su sitio).
johnharris85
17
zentus.com/sqlitejdbc -> 404
m0skit0
247

Encontré su pregunta mientras buscaba información con SQLite y Java. Solo pensé en agregar mi respuesta, que también publiqué en mi blog .

Llevo un tiempo codificando en Java. También he conocido SQLite pero nunca lo usé ... Bueno, lo he usado a través de otras aplicaciones pero nunca en una aplicación que codifiqué. ¡Así que lo necesitaba para un proyecto esta semana y es tan simple de usar!

Encontré un controlador JDBC de Java para SQLite. Simplemente agregue el archivo JAR a su classpath e importe java.sql. *

Su aplicación de prueba creará un archivo de base de datos, enviará algunos comandos SQL para crear una tabla, almacenará algunos datos en la tabla y los leerá y mostrará en la consola. Se va a crear el test.db archivo en el directorio raíz del proyecto. Puede ejecutar este ejemplo con 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 Pérez
fuente
1
Es por eso que creo que Joel estaba hablando toro (Google tech talk: youtube.com/watch?v=NWHfY_lvKIQ ) al decir que el diseño de stackoverflow.com es mejor debido a todas las publicaciones "antiguas" que hay en Internet. Es solo una repetición.
Nikolaos
26
Observe también que el proyecto Crawshaw parece estar en pausa, pero se bifurcó y actualizó aquí: xerial.org/trac/Xerial/wiki/SQLiteJDBC
lapo
8
zentus.com parece roto, encontrado espejo aquí; priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/about.htm
Daniel Magnusson
3
Gracias @DanielMagnusson, eres un salvavidas. Mientras se trata el tema, cualquiera que siga buscando el controlador sqliteJDBC puede ir a priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/… ya que el enlace al que se vincula about.htm es incorrecto.
javatarz
2
dependencia de maven: mvnrepository.com/artifact/org.xerial/sqlite-jdbc
Carl Bosch
30

Entiendo que preguntaste específicamente sobre SQLite, pero tal vez la base de datos HSQL encajaría mejor con Java. Está escrito en Java, se ejecuta en la JVM, admite tablas en memoria, etc. y todas esas características lo hacen bastante útil para la creación de prototipos y pruebas unitarias.

javashlook
fuente
3
Sí, HSQL es una muy buena opción y la he usado ampliamente en un par de aplicaciones cliente para obtener buenos resultados. Sin embargo, en este caso, sí quería usar SQLite.
Scott Bennett-McLeish el
18

El proyecto David Crawshaw (sqlitejdbc-v056.jar) parece desactualizado y la última actualización fue el 20 de junio de 2009, fuente aquí

Se lo recomiendo Xerials tenedor del envoltorio Crawshaw SQLite. Reemplacé sqlitejdbc-v056.jar con el archivo Xerials sqlite-jdbc-3.7.2.jar sin ningún problema.

Utiliza la misma sintaxis que en la respuesta de Bernie y es mucho más rápido y con la última biblioteca sqlite.

¿Qué es diferente del SQLite JDBC de Zentus?

El controlador JDBC SQLite de Zentus original http://www.zentus.com/sqlitejdbc/ es una excelente utilidad para usar bases de datos SQLite desde el lenguaje Java, y nuestra biblioteca SQLiteJDBC también se basa en su implementación. Sin embargo, su versión de java puro, que traduce totalmente los códigos c / c ++ de SQLite a Java, es significativamente más lenta en comparación con su versión nativa, que utiliza binarios de SQLite compilados para cada sistema operativo (win, mac, linux).

Para usar la versión nativa de sqlite-jdbc, el usuario tenía que establecer una ruta a los códigos nativos (dll, jnilib, archivos, que son programas JNDI C) utilizando argumentos de línea de comandos, por ejemplo, -Djava.library.path = (ruta a la dll, jnilib, etc.), o -Dorg.sqlite.lib.path, etc. Este proceso fue propenso a errores y molesto para decirle a cada usuario que establezca estas variables. Nuestra biblioteca SQLiteJDBC elimina por completo estos inconvenientes.

Otra diferencia es que estamos manteniendo este libite SQLiteJDBC actualizado a la versión más nueva del motor SQLite, porque somos uno de los usuarios más populares de esta biblioteca. Por ejemplo, SQLite JDBC es un componente central de UTGB (University of Tokyo Genome Browser) Toolkit, que es nuestra utilidad para crear navegadores genómicos personalizados.

EDITAR : como de costumbre cuando actualiza algo, habrá problemas en algún lugar oscuro en su código (me pasó a mí). Prueba prueba prueba =)

Daniel Magnusson
fuente
1
El sqlite-jdbcproyecto es excelente, pero tenga en cuenta que tiene licencia de Apache . Por lo tanto, debe atribuirlo si lo usa, ya sea que su código sea FOSS o propietario.
dotancohen
16

Hay un nuevo proyecto SQLJet que es una implementación pura de Java de SQLite. Todavía no es compatible con todas las características de SQLite, pero puede ser una muy buena opción para algunos de los proyectos Java que funcionan con bases de datos SQLite.


fuente
44
Parece prometedor, pero parece que todavía no ofrece una capacidad de consulta SQL, lo que es un factor decisivo para mí.
Scott Bennett-McLeish
Todavía no admite consultas SQL, sino una API de nivel inferior.
Basilea Shishani
Sigue siendo muy útil para aplicaciones donde solo necesita generar archivos SQLite, es decir, no necesita SQL para consultar los datos.
El alquimista
5

La publicación de Bernie es muy útil. No se pudo votar (no tiene suficiente reputación :(). Pero ayudó mucho. ¡Solo para reiterar!

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

Aquí puede encontrar el último jar JDBC de SQLite. ¡Solo agrega el frasco en tu classpath y listo! :) Puedes ejecutar el código de muestra de Bernie para probar si todo está bien.

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

Aquí puede encontrar ayuda sobre la sintaxis SQL para SQLite. Saludos a SQLite :)

Srinivas
fuente
3

Cuando compila y ejecuta el código, debe establecer el valor de las opciones de classpath. Al igual que lo siguiente:

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

java -classpath .;sqlitejdbc-v056.jar Text

Por favor, preste atención a "." y el espaciado ";" (win, el linux es ":")

sobre el estudio
fuente
3

El código sqlitejdbc se puede descargar usando git desde https://github.com/crawshaw/sqlitejdbc .

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

Nota: Makefile requiere curl binary para descargar bibliotecas / deps de sqlite.

Morbo
fuente
2

El código de ejemplo conduce a una pérdida de memoria en Tomcat (después de desplegar la aplicación web, el cargador de clases aún permanece en la memoria), lo que outofmemoryeventualmente causará una falla. La forma de resolverlo es usar sqlite-jdbc-3.7.8.jar ; Es una instantánea, por lo que todavía no aparece para Maven.

caracol
fuente
0

Error de tipografía: java -cp .:sqlitejdbc-v056.jar Test

debiera ser: java -cp .:sqlitejdbc-v056.jar; Test

observe el punto y coma después de ".jar", espero que ayude a las personas, podría causar mucha molestia

Eddie
fuente
¿Cuidado para elaborar? En * nix the; separará el java del comando Prueba (y, por lo tanto, creará un error). En Windows, el: no funcionará como separador de cp. Así que, en general .:xxx.jar;, no tiene sentido. Y también debe especificar el nombre del paquete para la clase Test.
Eckes