334

我被单个文件数据库提供的整洁所吸引。有什么驱动程序/连接器库可以将 SQLite 与 Java 连接和使用。

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

4

9 回答 9

248

我在使用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();
    }
  }
于 2009-02-27T00:49:07.993 回答
196

wiki列出了更多包装器:

  • Java 包装器(围绕 SWIG 接口):http ://tk-software.home.comcast.net/
  • 使用 SQLite 的 JDBC 驱动程序的好教程。(它至少有效!)http://www.ci.uchicago.edu/wiki/bin/view/VDS/VDSDevelopment/UsingSQLite
  • 跨平台 JDBC 驱动程序,在 Windows、Linux、OS X 上使用嵌入式原生 SQLite 库,并在其他操作系统上回退到纯 Java 实现:https ://github.com/xerial/sqlite-jdbc (以前称为zentus
  • 另一个 Java - SWIG 包装器。它仅适用于 Win32。http://rodolfo_3.tripod.com/index.html
  • sqlite-java-shell:使用 NestedVM 构建的 sqlite3 命令行 shell 的 100% 纯 Java 端口。(这不是 JDBC 驱动程序)。
  • Mysaifu JVM 的 SQLite JDBC 驱动程序:Mysaifu JVM 的 SQLite JDBC 驱动程序和 Windows (x86) 和 Linux (i386/PowerPC) 的 SQLite JNI 库。
于 2008-09-03T06:17:50.007 回答
31

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

于 2009-02-27T12:13:36.163 回答
19

David Crawshaw 项目(sqlitejdbc-v056.jar)似乎过时了,最后一次更新是 2009 年 6 月 20 日, 来源在这里

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

使用与伯尼的答案相同的语法,并且速度更快,并且使用最新的 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,用户必须使用命令行参数设置本地代码(dll、jnilib、so 文件,它们是 JNDI C 程序)的路径,例如,-Djava.library.path= (dll、jnilib 等的路径)或 -Dorg.sqlite.lib.path 等。这个过程很容易出错,而且告诉每个用户设置这些变量很麻烦。我们的 SQLiteJDBC 库完全消除了这些不便。

另一个不同之处是我们将这个 SQLiteJDBC 库保持在最新版本的 SQLite 引擎上,因为我们是这个库最热门的用户之一。例如,SQLite JDBC 是 UTGB(东京大学基因组浏览器)工具包的核心组件,它是我们创建个性化基因组浏览器的实用工具。

编辑:像往常一样,当你更新一些东西时,你的代码中一些不起眼的地方会出现问题(发生在我身上)。测试测试测试=)

于 2012-09-05T09:24:30.890 回答
16

有一个新项目SQLJet,它是 SQLite 的纯 Java 实现。它还不支持所有的 SQLite 特性,但对于一些使用 SQLite 数据库的 Java 项目来说可能是一个很好的选择。

于 2009-08-10T23:48:12.457 回答
3

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

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

java -classpath .;sqlitejdbc-v056.jar Text

请注意“。” 和单独的“;”(win,linux是“:”)

于 2012-02-24T07:10:27.650 回答
3

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

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

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

于 2012-11-07T16:10:32.810 回答
2

示例代码导致 Tomcat 中的内存泄漏(在取消部署 webapp 后,类加载器仍保留在内存中),这将导致outofmemory最终。解决方法是使用sqlite-jdbc-3.7.8.jar;这是一个快照,所以它还没有出现在 Maven 中。

于 2012-01-10T00:59:50.690 回答
0

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

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

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

于 2012-01-28T15:35:40.187 回答