Java和SQLite

Java和SQLite

Java and SQLite

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

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


在使用SQLite和Java搜索信息时找到了您的问题。只是以为我要添加我的答案,该答案也已发布在我的博客上。

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

我找到了SQLite的Java JDBC驱动程序。只需将JAR文件添加到您的类路径中,然后导入java.sql。*

他的测试应用程序将创建一个数据库文件,发送一些SQL命令以创建一个表,在表中存储一些数据,然后将其读回并显示在控制台上。它将在项目的根目录中创建test.db文件。您可以使用java -cp .:sqlitejdbc-v056.jar Test运行此示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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();
    }
  }

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库,并回退到其他OS上的纯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库。


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


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有什么不同?

The original Zentus's SQLite JDBC driver
http://www.zentus.com/sqlitejdbc/ itself is an excellent utility for
using SQLite databases from Java language, and our SQLiteJDBC library
also relies on its implementation. However, its pure-java version,
which totally translates c/c++ codes of SQLite into Java, is
significantly slower compared to its native version, which uses SQLite
binaries compiled for each OS (win, mac, linux).

To use the native version of sqlite-jdbc, user had to set a path to
the native codes (dll, jnilib, so files, which are JNDI C programs) by
using command-line arguments, e.g., -Djava.library.path=(path to the
dll, jnilib, etc.), or -Dorg.sqlite.lib.path, etc. This process was
error-prone and bothersome to tell every user to set these variables.
Our SQLiteJDBC library completely does away these inconveniences.

Another difference is that we are keeping this SQLiteJDBC libray
up-to-date to the newest version of SQLite engine, because we are one
of the hottest users of this library. For example, SQLite JDBC is a
core component of UTGB (University of Tokyo Genome Browser) Toolkit,
which is our utility to create personalized genome browsers.

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


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


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

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 :)


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

1
2
3
4
# git clone https://github.com/crawshaw/sqlitejdbc.git sqlitejdbc
...
# cd sqlitejdbc
# make

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


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

1
2
3
javac -classpath .;sqlitejdbc-v056.jar Text.java

java -classpath .;sqlitejdbc-v056.jar Text

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


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


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

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

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


推荐阅读