Java和SQLite

336

我被单文件数据库提供的整洁吸引。有哪些驱动程序/连接库可用于使用Java连接和使用SQLite。

我发现了一个包装库http://www.ch-werner.de/javasqlite,但是否还有其他更重要的项目可用?

9个回答

250

我在使用SQLite和Java搜索信息时发现了你的问题。我想添加我的答案,我也在我的博客上发布了。

我已经编写Java程序一段时间了。我也知道SQLite,但从未使用过...好吧,我已经通过其他应用程序使用它,但从未在我编写的应用程序中使用过。所以这个星期我需要它来完成一个项目,使用起来非常简单!

我找到了一个Java JDBC驱动程序,可以用于SQLite。只需将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技术讲座:http://www.youtube.com/watch?v=NWHfY_lvKIQ)说了些胡话。这只是一个重新包装。 - Nikolaos
26
请注意,Crawshaw项目似乎已经停滞不前,但是已在此处进行了分支和更新:http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC - lapo
8
zentus.com似乎出现了问题,在这里找到了镜像站; ftp://priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/about.htm - Daniel Magnusson
3
谢谢@DanielMagnusson,你是一个救命恩人。顺便说一下,如果有人仍在寻找sqliteJDBC驱动程序,可以访问ftp://priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/sqlitejdbc-v056.jar,因为about.htm链接的页面不正确。 - javatarz
2
Maven 依赖项:http://mvnrepository.com/artifact/org.xerial/sqlite-jdbc - Carl Bosch
我们需要在其他使用该应用程序的计算机上安装sqlite-jdbc吗? - Asif Mushtaq

196

这篇文章列出了一些更多的SQLite包装器:


7
我为这个列表添加的是sqlite4java - http://code.google.com/p/sqlite4java - 这是一个包装器(不使用JDBC);预编译适用于Windows、Mac和Linux。它易于使用,并强制执行一些协定来帮助开发者避免误用SQLite。 - sereda
7
sqlite4java 看起来很有趣,但是他们还有一个很好的比较各种包装器的页面:http://code.google.com/p/sqlite4java/wiki/ComparisonToOtherWrappers - Scott Bennett-McLeish
1
@kdt 我发现 Zentus 驱动程序的问题是它似乎根本不支持 BLOB。 - Martijn
12
@Martijn,http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC 是 zentus 驱动程序的一个分支版本,支持 BLOB(网站上有一个简短的教程)。 - johnharris85
17
抱歉,您访问的网页 http://www.zentus.com/sqlitejdbc 无法找到(404错误)。 - m0skit0
显示剩余4条评论

31

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


3
是的,HSQL是一个非常好的选择,我在几个客户端应用程序中广泛使用它并取得了良好的效果。然而,在这种情况下,我确实想使用SQLite。 - Scott Bennett-McLeish

19

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

我建议使用Xerial的分支代替Crawshaw的sqlite封装。我已经成功地将sqlitejdbc-v056.jar替换为Xerials的sqlite-jdbc-3.7.2.jar文件。

Bernie的回答中相同的语法,并且速度更快,使用了最新的sqlite库。

与Zentus的SQLite JDBC有何不同?

原始的Zentus SQLite JDBC驱动程序http://www.zentus.com/sqlitejdbc/本身是一个非常好用的工具,可以从Java语言中使用SQLite数据库,而我们的SQLiteJDBC库也依赖于其实现。然而,它的纯Java版本完全将SQLite的c/c++代码转换为Java,与其使用为每个操作系统编译的SQLite二进制文件的本机版本相比,速度显着较慢。

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

另一个区别是,我们将这个SQLiteJDBC库保持最新的SQLite引擎版本,因为我们是这个库的最热门用户之一。例如,SQLite JDBC是一个...

UTGB(东京大学基因组浏览器)工具包的核心组件,是我们用来创建个性化基因组浏览器的实用程序。

编辑:通常更新时,代码中可能会出现一些隐蔽的问题(我也遇到过)。测试、测试、再测试!


1
sqlite-jdbc 项目非常棒,但请注意它是 Apache 许可证。因此,无论您的代码是 FOSS 还是专有软件,如果使用它,都必须进行归属声明。 - dotancohen

16

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


4
看起来很有前途,但似乎还没有提供SQL查询功能,这对我来说是个致命缺陷。 - Scott Bennett-McLeish
仍不支持SQL查询,而是一个较低级别的API。 - Basel Shishani
仍然非常适用于只需要生成 SQLite 文件的应用程序,即不需要 SQL 查询数据的情况。 - The Alchemist

3

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

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

注意:Makefile需要curl二进制文件来下载sqlite库/依赖项。

3

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

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

java -classpath .;sqlitejdbc-v056.jar Text

请注意"."和分隔符";"(在Windows中为";",在Linux中为":")。

2

示例代码会在Tomcat中导致内存泄漏(在卸载Web应用程序后,类加载器仍然保留在内存中),最终会导致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系统中,冒号:不能作为类路径分隔符。所以总的来说,.:xxx.jar;是没有意义的。你还需要指定Test类的包名。 - eckes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接