Java 和 SQLite [关闭]

Posted

技术标签:

【中文标题】Java 和 SQLite [关闭]【英文标题】:Java and SQLite [closed] 【发布时间】:2010-09-07 15:51:36 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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 库。

【讨论】:

我对这个列表的补充是 sqlite4java - code.google.com/p/sqlite4java - 它是一个包装器(没有 JDBC);为 Windows、Mac、Linux 预编译。它使用简单,并强制执行一些合同,以帮助开发人员避免滥用 SQLite。 sqlite4java 看起来很有趣,但它们也对各种包装器进行了很好的比较:code.google.com/p/sqlite4java/wiki/ComparisonToOtherWrappers @kdt 我发现 zentus 驱动程序的问题是它似乎根本不支持 BLOB @Martijn xerial.org/trac/Xerial/wiki/SQLiteJDBC 是 zentus 驱动程序的一个分支,支持 BLOB(他们的网站上有一个简短的 tut)。 zentus.com/sqlitejdbc -> 404【参考方案2】:

我在使用 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();
    
  

【讨论】:

这就是为什么我认为 Joel 在说 ***.com 的设计更好,因为互联网上到处都是“旧”帖子时是在说牛话(谷歌技术谈话:youtube.com/watch?v=NWHfY_lvKIQ)。这只是一个重演。 另请注意,Crawshaw 项目似乎处于中断状态,但已在此处分叉和更新:xerial.org/trac/Xerial/wiki/SQLiteJDBC zentus.com 好像坏了,在这里找到镜像; priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/about.htm 谢谢@DanielMagnusson,你是救生员。在这个话题上,任何仍在寻找 sqliteJDBC 驱动程序的人都可以去priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/…,因为 about.htm 链接到的链接不正确。 maven 依赖:mvnrepository.com/artifact/org.xerial/sqlite-jdbc【参考方案3】:

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

【讨论】:

是的 HSQL 是一个非常好的选择,我已经在几个客户端应用程序中广泛使用它以获得良好的效果。然而,在这种情况下,我确实想使用 SQLite。【参考方案4】:

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

【讨论】:

它看起来很有希望,但它似乎还没有提供 SQL 查询功能,对我来说有点破坏交易。 仍然不支持 SQL 查询,而是支持较低级别的 API。 对于只需要生成 SQLite文件的应用程序仍然非常有用,即不需要SQL来查询数据。【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

想详细说明一下?在 *nix 上;会将 java 与 Test 命令分开(因此会产生错误)。在 Windows 上 : 不能用作 cp 分隔符。所以总而言之.:xxx.jar; 没有意义。而且你还需要指定Test类的包名。【参考方案7】:

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

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

java -classpath .;sqlitejdbc-v056.jar Text

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

【讨论】:

【参考方案8】:

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 还是专有代码,都必须注明出处。【参考方案9】:

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

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

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

【讨论】:

以上是关于Java 和 SQLite [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

不和谐 Java JDA |从 SQLite 删除数据/从 SQLite 获取数据 [关闭]

java.lang.IllegalStateException:尝试重新打开一个已经关闭的对象:android.database.sqlite.SQLiteQuery

Android SQLite 示例 [关闭]

SQLite 和共享首选项的优缺点 [关闭]

在开发过程中使用 Django、South 和 Sqlite [关闭]

Android SQLite DB 何时关闭