SQLite 作为一个开源的嵌入式数据库产品,具有系统开销小,检索效率高的特性,适用于手机、 PDA 、机顶盒设备等电器,并且作为嵌入式数据库在可下载的消费类应用程序中运行的很好。这篇文章介绍嵌入式数据库产品 SQLite 的技术特点,并着重讨论研究与 Java 语言之间的接口,并以实例说明如何使用 JAVA 开发基于 SQLite 的应用程序。
通常我们采用各种数据库产品来实现对数据的存储、检索等功能,例如, Oracle , SQL Server , MySQL 等 等。这些产品除提供基本的查询,删除,添加等功能外,也提供了很多高级特性,如触发器,存储过程,数据备份恢复,全文检索功能等。但实际上,很多的应用, 仅仅利用到了这些数据库产品的基本特性而已。而且在一些小型应用上,或者某些特殊场合的应用,比如桌面程序,这些数据库产品就明显有一些臃肿。在这些情况 下,嵌入式数据库的优势就特别明显了。
嵌入式数据库无须独立运行的数据库引擎,它是由程序直接调用相应的 API 去实现对数据的存取操作。更直白的讲,嵌入式数据库是一种具备了基本数据库特性的数据文件。嵌入式数据库与其它数据库产品的区别是,前者是程序驱动式 , 而后者是引擎响应式。嵌入式数据库的一个很重要的特点是它们的体积非常小,编译后的产品也不过几十 K 。这不但对桌面程序的数据存储方案是一个很好的选择,也使得它们可以应用到一些移动设备上。同时,很多嵌入式数据库在性能上也优于其它数据库,所以在高性能的应用上也常见嵌入式数据库的身影。
下面介绍的是开放源代码的嵌入式数据库, SQLite 。同时侧重研究如何应用 Java 连接 SQLite 数据库,并开发基于 SQLite 的应用程序。
SQLite 是 D · 理查德 · 希普开发出来的用一个小型 C 库实现的一种强有力的嵌入式关系数据库管理体制。它提供了对 SQL92 的大多数支持 : 支持多表和索引、事务、视图、触发和一系列的用户接口及驱动
SQLite 实现了完备的、可嵌入的、零配置的 SQL 数据库引擎。它的特点包括:
1 、事务处理是原子的、一致的、独立的和持久的( ACID ) , 即使在系统崩溃和掉电以后。
2 、零配置,即不需要设置和管理。
3 、实现了绝大部分的 SQL92 标准。
4 、一个单独的磁盘文件存储一个完整的数据库。
5 、数据库文件在机器之间可自由共享。
6 、支持数据库文件大小至 2TB 。
7 、字符串和 BLOG 的大小只受限于可用存储器容量。
8 、代码量小,即小于 30K 的 C 代码行和小于 250K 的代码空间( gcc 在 i486 上)
9 、对于绝大多数普通操作来说,比流行的 C/S 模式的数据库引擎运行速度快。
10 、 API 简单、易用。
可以看出,基于以上特点, SQLite 非常适合应用于嵌入式移动数据库。 SQLite 的版权允许无任何限制的应用,包括商业性的产品。 SQLite 官方主站上可以下载到编译后的 SQLite 程序。
SQLite 是无数据类型的数据库。虽然在生成表结构的时候,要声明每个域的数据类型,但 SQLite 并不做任何检查。开发人员要靠自己的程序控制输入与读出数据的类型是正确的。这里有一个例外,就是当主键为整型值时,如果要插入一个非整型值时会产生异常。另外,虽然在插入或读出数据的时候是不区分类型的,但在比较的时候,不同数据类型是有区别的。比如:
CREATE TABLE MyTable(a INTEGER, b TEXT);
INSERT INTO MyTable VALUES(0,0);
当执行下面的查询:
SELECT count(*) FROM MyTable WHERE a=='00';
会返回一条记录,因为字段 a 的类型是整型,而数字 00 与 0 是相等的。而执行下面的查询则不会返
回记录:
SELECT count(*) FROM MyTable WHERE b=='00';
因为字段 b 是字符类型,字符 "00" 与 "0" 是不相等的。
SQLite 提供了对 Transaction 的支持。应用 Transaction 即保证了数据的完整性,也会提高运行速度,因为多条语句一起提交给数据库的速度会比一条一条的提交方式更快。
SQLite 库包括一个简单的命令行工具,该工具名称对应 SQLite-3_2_2 版本叫做 sqlite3, 用户使用这个工具可以对一个 SQLite 数据库手工输入和执行 SQL 命令。例如建立一个名叫 wgy 的 SQLite 数据库,并建立一个名叫 user 的表的步骤如下:
Sqlite3 wgy
SQLite version 3.2.1
Enter ".help" for instructions
sqlite> create table user(username varchar(10), password varchar(10));
sqlite> insert into user values('Marry', '111111');
sqlite> insert into tbl1 values('Helen', '222222');
sqlite> select * from user;
Marry|111111
Helen|222222
Sqlite>
用户结束操作只需按 CTRL+C 组合键。注意每条 SQL 命令后要加分号。
用户可能对命令行方式的操作感到不直观,不太容易使用。那么用户可以使用 SQLite Database Browser 软件,这是一个免费的、公用域的、开源的可视化工具,可以用来建立、编辑 SQLite 数据库文件。这就意味着用户可以不必学习复杂的 SQL 命令,而直接使用熟悉的可视化图形界面设计、编辑 SQLite 数据库。用户可从 http://sqlitebrowser.sourceforge.net/ 下载该工具软件。
SQLite 源代码是 C ,而且官方网站上只提供了 C 和 Tcl 语言的接口。为了应用 Java 接口,要采用第三方的接口驱动程序,可在 http://www.ch-werner.de/javasqlite 中找到这个 Java 接口程序。这个接口提供了两种连接 SQLite 的方式:一是直接用 JNI 技术调用 SQLite 的 C 语言接口,这种方式要求开发人员要对 SQLite 本身的 API 也有一定的了解。在第二种方式中,接口程序实现了 Java 标准规范的 JDBC 接口,这样开发人员只要对 JDBC 有了解就可以了。
第三方接口库中的 Java 代码包含 JNI 接口和多个版本的 JDBC 接口程序,可根据你的 JRE 的版本选择相应的 JDBC 程序。 Java 类包加上 Sqlite_jni.dll 文件,组成了 SQLite 的 Java 接口库,在应用 Java 语言调用 JDBC 或 JNI 接口时,都是通过应用 Java 的本地化技术调用 Sqlite_jni.dll 文件,完成对 SQLite 数据库的操作。
下面这段代码演示如何应用 JNI 接口操作 SQLite 。可以看到 Database 类的 exec() 方法是执行 SQL 语句的关键:
Database db = new Database();
try {
// 打开数据库
db.open("c:\\temp\\mydata.slt", 0666);
db.interrupt();
db.busy_timeout(1000);
db.busy_handler(null);
db.exec("create table account (name varchar(10),gale boolean)",result);
db.exec("insert into account values('steve','m')", result);
db.exec("select * from account",result);
Author : YiYun QQ : 33252040 / 99593311
// 关闭数据库
db.close();
} catch (Exception e) {
e.printStackTrace();
}
用户一定要保证在类路径 class_path 中有 “sqlite.jar”, 并且保证在你的 JAVA 库路径 JAVA library path 中有本地库 native library 。用 "SQLite.JDBCDriver" 作为 JDBC 的驱动程序类名。连接 JDBC 的 URL 格式为 jdbc:sqlite:/path 。这里的 path 为指定到 SQLite 数据库文件的路径,例如:
jdbc:sqlite://dirA/dirB/dbfile
jdbc:sqlite://DRIVE:/dirA/dirB/dbfile
jdbc:sqlite://COMPUTERNAME/shareA/dirB/dbfile
参考下面的应用 JDBC 连接 SQLite 的例程:
// 声明 JDBC 驱动程序
Class clz = Class.forName("SQLite.JDBCDriver");
// 连接数据库
Connection conn = DriverManager.getConnection("jdbc:sqlite:/c:/temp/e2.db");
Statement stmt = conn.createStatement();
// 生成 person 表,包含名子和年龄字段
stmt.execute("create table person (name varchar(100),age int)");
// 插入数据
stmt.execute("insert into person values('steve',25)");
// 用 SQL 语句读出数据
result = stmt.executeQuery("select * from person");
while(result.next()){
System.out.println(result.getString(1));
System.out.println(result.getInt(2));
}
运行程序时要在 Java.exe 命令行加入选项 java.library.path 指定到 Sqlite_jni.dll 所在的路径。例如,如果 Sqlite_jni.dll 放在 c:\sqliteNative 路径下面,运行类 com.YiYun.MyClass 的命令行将会是这样: java -Djava.library.path=c:\sqliteNative com.YiYun.MyClass 。
SQLite 已于 2005 年 6 月 13 日 发布了 Version 3.2.2, 该版本不仅修正了许多的 BUG, 而且访问速度更快,产生的代码量更少。而 JAVA 程序又具有简单易学、面向对象、平台无关性、稳定安全等特点。两者结合起来开发的应用程序必然兼具两方面的优势。