SQLite JDBC 是一个用于在 Java 中访问和创建 SQLite 数据库文件的库。
我们的 SQLiteJDBC 库不需要配置,因为主要操作系统(包括 Windows、macOS、Linux 等)的本机库被组装到单个 JAR(Java 存档)文件中。
该项目已维护,但并未积极开发:
我们关注 SQLite 的每个新版本,并将发布相应版本的驱动程序。
将调查错误,并在可能的情况下修复。
新功能由拉取请求驱动。
该项目的当前维护者是 Gotson。
➡️更多使用示例和配置可以在USAGE.md中找到
SQLite JDBC 是一个通过 JDBC API 访问 SQLite 数据库的库。有关 JDBC 的一般用法,请参阅 JDBC 教程或 Oracle JDBC 文档。
下载sqlite-jdbc-3.47.1.0.jar
,然后将此 jar 文件附加到类路径中。
从代码中打开 SQLite 数据库连接。 (见下面的例子)
假设sqlite-jdbc-3.47.1.0.jar
放置在当前目录中。
> javac Sample.java
> java -classpath " .;sqlite-jdbc-3.47.1.0.jar " Sample # in Windows
or
> java -classpath " .:sqlite-jdbc-3.47.1.0.jar " Sample # in macOS or Linux
name = leo
id = 1
name = yui
id = 2
import java . sql . Connection ;
import java . sql . DriverManager ;
import java . sql . ResultSet ;
import java . sql . SQLException ;
import java . sql . Statement ;
public class Sample
{
public static void main ( String [] args )
{
// NOTE: Connection and Statement are AutoCloseable.
// Don't forget to close them both in order to avoid leaks.
try
(
// create a database connection
Connection connection = DriverManager . getConnection ( "jdbc:sqlite:sample.db" );
Statement statement = connection . createStatement ();
)
{
statement . setQueryTimeout ( 30 ); // set timeout to 30 sec.
statement . executeUpdate ( "drop table if exists person" );
statement . executeUpdate ( "create table person (id integer, name string)" );
statement . executeUpdate ( "insert into person values(1, 'leo')" );
statement . executeUpdate ( "insert into person values(2, 'yui')" );
ResultSet rs = statement . executeQuery ( "select * from person" );
while ( rs . next ())
{
// read the result set
System . out . println ( "name = " + rs . getString ( "name" ));
System . out . println ( "id = " + rs . getInt ( "id" ));
}
}
catch ( SQLException e )
{
// if the error message is "out of memory",
// it probably means no database file is found
e . printStackTrace ( System . err );
}
}
}
我们的 SQLite JDBC 驱动程序包(即sqlite-jdbc-3.47.1.0.jar
)包含三种类型的本机 SQLite 库( sqlitejdbc.dll
、 sqlitejdbc.dylib
、 sqlitejdbc.so
),每个库都是针对 Windows、macOS 和 Linux 编译的。当您的程序加载org.sqlite.JDBC
驱动程序时,适当的本机库文件会自动提取到操作系统的临时文件夹中。
从 sqlite-jdbc-3.6.19 开始,本机编译的 SQLite 引擎将用于以下操作系统:
x86 | x86_64 | ARMv5 | ARMv6 | ARMv7 | ARM64 | ppc64 | RISCV64 | |
---|---|---|---|---|---|---|---|---|
视窗 | ✔ | ✔ | ✔ | ✔ | ||||
macOS | ✔ | ✔ | ||||||
Linux(libc) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
Linux(穆斯林) | ✔ | ✔ | ✔ | |||||
Android(API 级别 24+) | ✔ | ✔ | ✔ | ✔ | ||||
自由BSD | ✔ | ✔ | ✔ |
上面未列出的其他操作系统均使用纯java SQLite。 (适用于3.7.15之前的版本)
如果您想使用适用于您的操作系统的本机库,请从头开始构建源代码。
从版本 3.40.1.0 开始,Sqlite JDBC 开箱即用地支持 GraalVM 本机映像。在此之前,已经对某些版本提供了基本支持,但 CI 并未对此进行积极测试。
默认情况下,编译目标的sqlitejdbc
库将包含在本机映像中,并附有所需的 JNI 配置。在运行时,该库将被提取到临时文件夹并从那里加载。但是,为了更快地启动,建议在构建时设置org.sqlite.lib.exportPath
属性。这将在构建时将sqlitejdbc
库导出到指定目录,并且该库不会作为资源包含在内。因此,原生镜像本身会稍微小一些,并且消除了运行时导出库的开销,但您需要确保可以在运行时找到该库。执行此操作的最佳方法是将库放在可执行文件旁边。
native-image -Dorg.sqlite.lib.exportPath= ~ /outDir -H:Path= ~ /outDir -cp foo.jar org.example.Main
这会将sqlitejdbc
共享库和本机映像输出放置在~/outDir
文件夹中。
此示例使用 native-build-tools maven 插件:
< plugin >
< groupId >org.graalvm.buildtools</ groupId >
< artifactId >native-maven-plugin</ artifactId >
< configuration >
< buildArgs >
< buildArg >-Dorg.sqlite.lib.exportPath=${project.build.directory}</ buildArg >
</ buildArgs >
</ configuration >
</ plugin >
这将自动将sqlitejdbc
库放置在项目的/target
文件夹中,创建一个功能执行环境。打包生成的应用程序时,只需将库包含在分发包中即可。
从 Maven Central 或发布页面下载。
< dependencies >
< dependency >
< groupId >org.xerial</ groupId >
< artifactId >sqlite-jdbc</ artifactId >
< version >3.47.1.0</ version >
</ dependency >
</ dependencies >
Sonatype 的快照存储库中提供了开发版本的快照。
Maven Central 资源使用 GPG 进行签名,并且以 .asc 结尾的签名文件可在与其他下载相同的位置获取。
以下密钥当前用于签署版本:
-----开始 PGP 公钥块----- 备注:C1CB A75E C9BD 0BAF 8061 9354 59E0 5CE6 1818 7ED4 评论:Taro L. Saito(对于 GitHub Actions)<[email protected]> xjMEYURVGhYJKwYBBAHARw8BAQdA2Dp4m1Yhtb1g94pQzzL24FuP6b9KXF8lP9Dh hZnynhfNM1Rhcm8gTC4gU2FpdG8gKEZvciBHaXRIdWIgQWN0aW9ucykgPGxlb0B4 ZXJpYWwub3JnPsKUBBMWCgA8FiEEwcunXsm9C6+AYZNUWeBc5hgYftQFAmLkVRoC GwMFCwkIBwIDIGIBBhUKCQgLAgQWAgMBAh4HAheAAAoJEFngXOYYGH7UfPwBAK7x TVRebZeWcAwmGaMUsbg7SgJou8xnkhByObPLUC/4AQDPsZeYmi4KXyXPzmqhCICD Y+ZSJWIDQqitK2ujPDFXA844BGLkVRoSCisGAQQBl1UBBQEBB0Atu9kejBi+6wfO T0a9z/LYEEdNXM/VX6xt1onKToPPdQMBCAfCeAQYFgoAIBYhBMHLp17JvQuvgGGT VFngXOYYGH7UBQJi5FUaAhsMAAoJEFngXOYYGH7UlMABAKyRCazhVyUFg5FOpanm ckBY38CaMGPPLXVyY8Kr6dYFAP9wYLu7nsDZCOXkAgS+et4Pk1WZCggoYUkxsX1o 0KZXBQ== =怀亚斯 -----PGP 公钥块结束-----
项目的版本遵循 jar 中捆绑的 SQLite 库的版本,并带有一个额外的数字来表示项目的增量。
例如,如果 SQLite 版本为3.39.2
,则项目版本将为3.39.2.x
,其中x
从 0 开始,并随着不更改 SQLite 版本的每个版本而递增。
如果SQLite版本更新到3.40.0
,则项目版本将更新到3.40.0.0
。
您可能需要添加shade插件转换器来解决No suitable driver found for jdbc:sqlite:
问题。
< transformer
implementation= " org.apache.maven.plugins.shade.resource.AppendingTransformer " >
< resource >META-INF/services/java.sql.Driver</ resource >
</ transformer >
< dependency >
< groupId >org.xerial</ groupId >
< artifactId >sqlite-jdbc</ artifactId >
< version >3.47.1.0</ version >
</ dependency >
我们一直在寻找:
问题或 PR 的审阅者,您可以查看
贡献者提交PR,可以查看和
请阅读我们的贡献指南。