【发布时间】:2010-09-07 15:51:36
【问题描述】:
我被单一文件数据库提供的整洁所吸引。有什么驱动程序/连接器库可以将 SQLite 与 Java 连接和使用。
我发现了一个包装库 http://www.ch-werner.de/javasqlite,但还有其他更出色的项目吗?
【问题讨论】:
我被单一文件数据库提供的整洁所吸引。有什么驱动程序/连接器库可以将 SQLite 与 Java 连接和使用。
我发现了一个包装库 http://www.ch-werner.de/javasqlite,但还有其他更出色的项目吗?
【问题讨论】:
wiki 列出了更多包装器:
【讨论】:
我在使用 SQLite 和 Java 搜索信息时发现了您的问题。只是想我会添加我的答案,我也发布在我的blog。
我用 Java 编码已经有一段时间了。我也知道 SQLite,但从未使用过它……好吧,我已经通过其他 applications 使用过它,但从未在我编写的应用程序中使用过它。所以这周我需要它来做一个项目,而且使用起来非常简单!
我找到了一个用于 SQLite 的 Java JDBC 驱动程序。只需将 JAR file 添加到您的类路径并导入 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();
}
}
【讨论】:
我了解您专门询问了 SQLite,但也许 HSQL database 更适合 Java。它是用 Java 本身编写的,在 JVM 中运行,支持内存表等,所有这些特性使它非常适用于原型设计和单元测试。
【讨论】:
有一个新项目SQLJet 是 SQLite 的纯 Java 实现。它还不支持所有 SQLite 功能,但对于一些使用 SQLite 数据库的 Java 项目来说可能是一个很好的选择。
【讨论】:
示例代码导致 Tomcat 中的内存泄漏(取消部署 webapp 后,类加载器仍保留在内存中),最终将导致 outofmemory。解决方法是使用sqlite-jdbc-3.7.8.jar;这是一个快照,所以它还没有出现在 maven 中。
【讨论】:
错字:java -cp .:sqlitejdbc-v056.jar Test
应该是:java -cp .:sqlitejdbc-v056.jar; Test
注意“.jar”后面的分号,希望对大家有所帮助,可能会造成很多麻烦
【讨论】:
.:xxx.jar; 没有意义。而且你还需要指定Test类的包名。
当您编译和运行代码时,您应该设置类路径选项值。 就像下面这样:
javac -classpath .;sqlitejdbc-v056.jar Text.java
java -classpath .;sqlitejdbc-v056.jar Text
请注意“。”和单独的“;”(win,linux是“:”)
【讨论】:
David Crawshaw 项目(sqlitejdbc-v056.jar) 似乎已过时,最后一次更新是 2009 年 6 月 20 日,source here
我会推荐 Crawshaw sqlite 包装器的 Xerials fork。我用 Xerials sqlite-jdbc-3.7.2.jar 文件替换了 sqlitejdbc-v056.jar 没有任何问题。
使用与Bernie's answer 相同的语法,并且速度更快,并且使用最新的 sqlite 库。
与 Zentus 的 SQLite JDBC 有什么不同?
原始 Zentus 的 SQLite JDBC 驱动程序 http://www.zentus.com/sqlitejdbc/ 本身就是一个很好的实用程序 使用来自 Java 语言的 SQLite 数据库和我们的 SQLiteJDBC 库 也依赖于它的实现。但是,它的纯 java 版本, 将 SQLite 的 c/c++ 代码完全翻译成 Java,是 与使用 SQLite 的本机版本相比,速度要慢得多 为每个操作系统(win、mac、linux)编译的二进制文件。
要使用原生版本的 sqlite-jdbc,用户必须设置一个路径 本机代码(dll、jnilib、so 文件,它们是 JNDI C 程序)由 使用命令行参数,例如 -Djava.library.path=(path to the dll、jnilib 等),或 -Dorg.sqlite.lib.path 等。这个过程是 告诉每个用户设置这些变量容易出错且麻烦。 我们的 SQLiteJDBC 库完全消除了这些不便。
另一个区别是我们保留了这个 SQLiteJDBC 库 更新到最新版本的 SQLite 引擎,因为我们是其中之一 这个图书馆最热门的用户。例如,SQLite JDBC 是一个 UTGB(东京大学基因组浏览器)工具包的核心组件, 这是我们创建个性化基因组浏览器的实用程序。
EDIT :像往常一样,当您更新某些内容时,您的代码中某些不起眼的地方会出现问题(发生在我身上)。测试测试测试=)
【讨论】:
sqlite-jdbc 项目很棒,但请注意它是Apache licensed。因此,如果您使用它,无论您的代码是 FOSS 还是专有代码,都必须注明出处。
sqlitejdbc 代码可以使用 git 从https://github.com/crawshaw/sqlitejdbc 下载。
# git clone https://github.com/crawshaw/sqlitejdbc.git sqlitejdbc
...
# cd sqlitejdbc
# make
注意:Makefile 需要 curl 二进制文件才能下载 sqlite 库/deps。
【讨论】: