Java和SQLite [关闭]


333

我对单个文件数据库提供的简洁性感到着迷。可以使用哪些驱动程序/连接器库来连接SQLite并将其与Java一起使用。

我发现了一个包装器库http://www.ch-werner.de/javasqlite,但是还有其他更出色的项目吗?


9
我喜欢一个问题,该问题具有数百个支持票,而答案具有数百个支持票,被封闭为“离题”。有点尴尬,哈哈
Andrew Koster

Answers:


196

维基列出了更多的包装:


7
我除了这份名单是sqlite4java - code.google.com/p/sqlite4java -这是一个包装(无JDBC); 已针对Windows,Mac,Linux预编译。它使用简单,并强制执行一些合同,以帮助开发人员避免滥用SQLite。
sereda 2010年

7
sqlite4java看起来很有趣,但是它们也可以很好地比较各种包装器:code.google.com/p/sqlite4java/wiki/ComparisonToOtherWrappers
Scott Bennett-McLeish 2010年

1
@kdt我在zentus驱动程序中发现的问题是它似乎根本不支持BLOB
Martijn

12
@Martijn xerial.org/trac/Xerial/wiki/SQLiteJDBC是zentus驱动程序的分支,并支持BLOB(其站点上有简短内容)。
johnharris85 2011年


247

在使用SQLite和Java 搜索信息时找到了您的问题。只是想我要补充我的回答,我也贴在我的博客

我已经用Java编码了一段时间了。我也了解SQLite,但从未使用过……好吧,我已经在其他应用程序中使用过它,但从未在我编写的应用程序中使用过。因此,本周我需要一个项目来使用它,它是如此简单!

我找到了SQLite的Java JDBC驱动程序。只需将JAR文件添加到您的类路径并导入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
这就是为什么我认为Joel 在说stackoverflow.com的设计更好,因为互联网上流传着所有“老字号”,所以在谈论牛市(Google技术演讲:youtube.com/watch?v=NWHfY_lvKIQ)。这只是一个重新定义。
Nikolaos

26
另请注意,Crawshaw项目似乎在中断时出现,但在此处进行了分叉和更新:xerial.org/trac/Xerial/wiki/SQLiteJDBC
lapo

8
zentus.com似乎坏了,在这里找到了镜子;priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/about.htm
Daniel Magnusson

3
谢谢@DanielMagnusson,您是救生员。在该主题上时,任何仍在寻找sqliteJDBC驱动程序的人都可以进入priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/…,因为about.htm链接所指向的链接不正确。
javatarz 2012年


30

据了解,您是专门询问有关SQLite的,但是HSQL数据库可能更适合Java。它是用Java本身编写的,可以在JVM中运行,支持内存中的表等,所有这些功能使其非常适用于原型设计和单元测试。


3
是的,HSQL是一个很好的选择,为了达到良好的效果,我已经在几个客户端应用程序中广泛使用了它。但是在这种情况下,我确实确实想使用SQLite。
Scott Bennett-McLeish

18

David Crawshaw项目(sqlitejdbc-v056.jar)似乎已过时,最新更新为2009年6月20日, 来源此处

我会推荐Crawshaw sqlite包装程序的Xerials分支。我用Xerials sqlite-jdbc-3.7.2.jar文件替换了sqlitejdbc-v056.jar,没有任何问题。

使用与Bernie的答案相同的语法,并且使用最新的sqlite库要快得多。

与Zentus的SQLite JDBC有什么不同?

最初的Zentus的SQLite JDBC驱动程序 http://www.zentus.com/sqlitejdbc/本身是使用Java语言的SQLite数据库的出色工具,我们的SQLiteJDBC库也依赖于它的实现。但是,其纯Java版本(将SQLite的c / c ++代码完全转换为Java)比其本机版本(使用为每个操作系统(win,mac,linux)编译的SQLite二进制文件)慢得多。

要使用sqlite-jdbc的本机版本,用户必须使用命令行参数(例如-Djava.library.path =)设置本机代码(dll,jnilib,so文件,它们是JNDI C程序)的路径。 (dll,jnilib等的路径)或-Dorg.sqlite.lib.path等。此过程容易出错,并且麻烦告诉每个用户设置这些变量。我们的SQLiteJDBC库完全消除了这些不便之处。

另一个不同之处在于,由于我们是该库的最热门用户之一,因此我们使该SQLiteJDBC libray保持最新,直到SQLite引擎的最新版本。例如,SQLite JDBC是UTGB(东京大学基因组浏览器)工具包的核心组件,该工具包是我们用于创建个性化基因组浏览器的实用程序。

编辑:像往常一样,当您更新某些内容时,在您的代码中某些晦涩的地方会出现问题(发生在我身上)。测试测试测试=)


1
sqlite-jdbc项目很棒,但是请注意它是Apache许可的。因此,无论您使用的代码是FOSS还是专有代码,都必须使用归因。
dotancohen 2015年

16

有一个新项目SQLJet,它是SQLite的纯Java实现。它尚不支持所有SQLite功能,但是对于某些与SQLite数据库一起使用的Java项目而言,它可能是一个很好的选择。


4
看起来很有希望,但是它似乎还不提供SQL查询功能,这对我来说是一个交易突破。
Scott Bennett-McLeish

仍然不支持SQL查询,而是较低级别的API。
巴塞尔Shishani 2013年

对于仅需要生成 SQLite文件(即不需要SQL查询数据)的应用程序仍然非常有用。
炼金术士

5

伯尼的帖子非常有帮助。无法投票(没有足够的声誉:()。但这很有帮助。只是重申一下!

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

在这里,您可以找到最新的SQLite JDBC jar。只需将jar添加到您的类路径中就可以了!:)您可以运行Bernie的示例代码来测试一切是否正常。

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

在这里,您可以找到有关SQLite的SQL语法的帮助。欢呼SQLite :)


3

编译和运行代码时,应设置类路径选项值。就像下面这样:

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

java -classpath .;sqlitejdbc-v056.jar Text

请注意“。” 和备用的“;”(赢,Linux是“:”)


3

sqlitejdbc代码可以使用git从https://github.com/crawshaw/sqlitejdbc下载。

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

注意:Makefile需要curl二进制文件才能下载sqlite库/ deps。


2

该示例代码导致Tomcat中的内存泄漏(在取消部署webapp之后,类加载器仍保留在内存中),这将outofmemory最终导致问题。解决的方法是使用sqlite-jdbc-3.7.8.jar ; 这是快照,因此尚未出现在Maven中。


0

错别字: java -cp .:sqlitejdbc-v056.jar Test

应该: java -cp .:sqlitejdbc-v056.jar; Test

注意“ .jar”后的分号,希望对人们有所帮助,可能会引起很多麻烦


关心详细吗?在* nix上;会将Java与Test命令分开(因此会产生错误)。在Windows上,:不能用作cp分隔符。因此,总的来说,这.:xxx.jar;没有任何意义。并且您还需要为Test类指定包名称。
eckes 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.