Java 生态圈中的嵌入式数据库,哪家强?
USER、PASSWORD 主要用于客户端登录使用。
2.3、单元测试应用
下面,我们使用 JDBC 编写一个测试类,来测试一下 derby 是否可以正常使用。
public class DerbyTest {
/**
以嵌入式(本地)连接方式连接数据库
*/
private static final
String JDBC_URL = "jdbc:derby:derbyDB;create=true";
private static final String DRIVER_CLASS = "org.apache.derby.jdbc.EmbeddedDriver";
private static final String USER = "root";
private static final String PASSWORD = "root";
public static void main(String[] args) throws Exception {
//与数据库建立连接
Class.forName(DRIVER_CLASS);
Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
Statement statement = conn.createStatement();
//删除表
statement.execute("DROP TABLE USER_INF");
//创建表
statement.execute("CREATE TABLE USER_INF(id VARCHAR(50) PRIMARY KEY, name VARCHAR(50) NOT NULL, sex VARCHAR(50) NOT NULL)");
//插入数据
statement.executeUpdate("INSERT INTO USER_INF VALUES('1', '程咬金', '男') ");
statement.executeUpdate("INSERT INTO USER_INF VALUES('2', '孙尚香', '女') ");
statement.executeUpdate("INSERT INTO USER_INF VALUES('3', '猴子', '男') ");
//查询数据
ResultSet resultSet = statement.executeQuery("select * from USER_INF");
while (resultSet.next()) {
System.out.println(resultSet.getInt("id") + ", " + resultSet.getString("name") + ", " + resultSet.getString("sex"));
}
//关闭连接
statement.close();
conn.close();
}
}
输出结果:
1, 程咬金, 男
2, 孙尚香, 女
3, 猴子, 男
当程序运行完之后,会在当前项目根目录生成一个 derbyDB 文件夹,里面会存放一些持久化的数据,当下次再连接 derbyDB 数据库名称时,可以查询出之前插入的历史数据,这个特性可以防止数据丢失!

值得注意的是:derby 对很多 mysql 的关键字并不支持,同时 derby 不支持插入空值。
在之后的版本中,derby 还可以作为一个数据库服务器,通过 jar 启动单独部署在一台服务器上,在连接地址上加上 IP 和端口号,例如 jdbc://derby://localhost:1527/derbyDB。
如果想使用可视化客户端工具来访问和管理 derby,可以使用 SQuirreL SQL Client 客户端,下载地址http://www.squirrelsql.org/#installation。
在目前绝大多数的关于嵌入式数据库应用中,derby 的出场次数还是较少。
三、SQLite
SQLite 是 D.RichardHipp 用一个小型的 C 库开发的一种强有力的嵌入式关系数据库,虽然功能较 Berkeley DB(商业数据库)稍显逊色,但它简单易学、速度较快,同时提供了丰富的数据库接口,提供了对 SQL92 的大多数支持:支持多表和索引、事务、视图、触发和一系列的用户接口及驱动。
SQLite 不仅支持 Windows/Linux/Unix 等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java 等,还有 ODBC 接口,比起 Mysql、PostgreSQL 这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快,全部源码大致 3 万行 C 代码,文件大约 350KB,支持数据库大小至 2TB!
几乎常年占据嵌入式数据库的第一位!
3.1、SQLite 安装
3.1.1、windows 安装
1.访问 SQLite 下载页面https://www.sqlite.org/download.html。
2.下载 sqlite-tools-win32-.zip 和 sqlite-dll-win32-.zip 压缩文件。
3.创建文件夹 C:\sqlite,并在此文件夹下解压上面两个压缩文件,将得到 sqlite3.def、sqlite3.dll 和 sqlite3.exe 文件。
4.添加 C:\sqlite 到 PATH 环境变量。
最后在命令提示符下,输入 sqlite3 命令,显示如下结果表示安装成功!
C:>sqlite3
SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
3.1.2、linux 安装
目前,几乎所有版本的 Linux 操作系统都附带 SQLite。所以,只需要在命令行输入输入 sqlite3,即可检查出机器上是否已经安装了 SQLite!
$ sqlite3
SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
如果没有看到上面的结果,安装也很简单!
1.访问 SQLite 下载页面https://www.sqlite.org/download.html。
2.下载 sqlite-autoconf-*.tar.gz 并上传到 linux 服务器。
3.执行安装操作
例如,安装步骤示例:
$ tar xvzf sqlite-autoconf-3071502.tar.gz
$ cd sqlite-autoconf-3071502
$ ./configure --prefix=/usr/local
$ make
$ make install
3.1.3、mac 安装
mac 安装操作与 linux 类似。
3.2、项目引入
sqlite 也可以直接通过 maven 在 pom.xml 中依赖库文件,即可进行开发!
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.7.2</version>
</dependency>
3.3、环境配置
String DRIVER_CLASS = "org.sqlite.JDBC";
String JDBC_URL = "jdbc:sqlite:sqliteDB.db";
String USER = "root";
String PASSWORD = "root";
说明:
org.sqlite.JDBC 表示使用 sqlite 嵌入式数据库模式。
JDBC_URL 中的 sqliteDB 表示创建一个名为 sqliteDB 的临时数据库,如果没有会自动创建。
USER、PASSWORD 主要用于客户端登录使用。
3.4、单元测试应用
下面,来测试一下 sqlite 是否可以正常使用。
public class SQLiteTest {
/**
以嵌入式(本地)连接方式连接数据库
*/
private static final String JDBC_URL = "jdbc:sqlite:sqliteDB.db";
private static final String DRIVER_CLASS = "org.sqlite.JDBC";
private static final String USER = "root";
private static final String PASSWORD = "root";
public static void main(String[] args) throws Exception {
//与数据库建立连接
Class.forName(DRIVER_CLASS);
Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
Statement statement = conn.createStatement();
//删除表
statement.execute("DROP TABLE IF EXISTS USER_INF");
//创建表
statement.execute("CREATE TABLE USER_INF(id VARCHAR(50) PRIMARY KEY, name VARCHAR(50) NOT NULL, sex VARCHAR(50) NOT NULL)");
//插入数据
statement.executeUpdate("INSERT INTO USER_INF VALUES('1', '程咬金', '男') ");
statement.executeUpdate("INSERT INTO USER_INF VALUES('2', '孙尚香', '女') ");
statement.executeUpdate("INSERT INTO USER_INF VALUES('3', '猴子', '男') ");
//查询数据
ResultSet resultSet = statement.executeQuery("select * from USER_INF");
while (resultSet.next()) {
System.out.println(resultSet.getInt("id") + ", " + resultSet.getString("name") + ", " + resultSet.getString("sex"));
}
//关闭连接
statement.close();
conn.close();
}
}
输出结果:
1, 程咬金, 男
2, 孙尚香, 女
3, 猴子, 男
当程序运行完之后,也会在当前项目的根目录下生成上文自定义的一个名为 sqliteDB 的文件。

每次操作名为 sqliteDB 的数据库时候,数据会持久化到 sqliteDB 文件中,从而防止数据丢失。
如果想使用可视化客户端工具来访问和管理 sqliteDB,可以使用 navicat 来连接,选择生成的 sqliteDB 文件,输入相应的账号、密码,便可进行管理维护!


四、H2
h2 是一款纯 java 编写的另一款嵌入式数据库,它本身只是一个类库,即只有一个 jar 文件,可以直接嵌入到应用项目中,同时还提供了非常友好的基于 web 的数据库管理界面。
网上有很多开发者拿它与 derby 做对比,称它与 mysql 数据库兼容性强,口碑较好。
具体是否真的如此,在后文我们会进行相应的性能测试,下面一起来看看在开发中如何使用。
4.1、项目引入
既然 h2 是纯 java 编写,可以直接通过 maven 在 pom.xml 中依赖库文件,即可进行开发!
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
<scope>runtime</scope>
</dependency>
4.2、环境配置
String DRIVER_CLASS = "org.h2.Driver";
String JDBC_URL = "jdbc:h2:mem:h2DB";
String USER = "root";
String PASSWORD = "root";
说明:
org.h2.Driver 表示使用 h2 嵌入式数据库模式。
JDBC_URL 中的 h2DB 表示创建一个名为 h2DB 的临时数据库。
USER、PASSWORD 主要用于客户端登录使用。
4.3、单元测试应用
下面,来测试一下 h2 是否可以正常使用。
public class H2Test {
/**
以嵌入式(本地)连接方式连接 H2 数据库
*/
private static final String JDBC_URL = "jdbc:h2:mem:h2DB";
private static final String DRIVER_CLASS = "org.h2.Driver";
private static final String USER = "root";
private static final String PASSWORD = "root";
public static void main(String[] args) throws Exception {
//与数据库建立连接
Class.forName(DRIVER_CLASS);
Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
Statement statement = conn.createStatement();
//删除表
statement.execute("DROP TABLE IF EXISTS USER_INF");
//创建表
statement.execute("CREATE TABLE USER_INF(id VARCHAR(50) PRIMARY KEY, name VARCHAR(50) NOT NULL, sex VARCHAR(50) NOT NULL)");
//插入数据
statement.executeUpdate("INSERT INTO USER_INF VALUES('1', '程咬金', '男') ");
statement.executeUpdate("INSERT INTO USER_INF VALUES('2', '孙尚香', '女') ");
statement.executeUpdate("INSERT INTO USER_INF VALUES('3', '猴子', '男') ");
//查询数据
ResultSet resultSet = statement.executeQuery("select * from USER_INF");
while (resultSet.next()) {
System.out.println(resultSet.getInt("id") + ", " + resultSet.getString("name") + ", " + resultSet.getString("sex"));
}
//关闭连接
statement.close();
conn.close();
}
}
输出结果:
1, 程咬金, 男
2, 孙尚香, 女
3, 猴子, 男
评论