Hypersonic 教程
什么是 Hypersonic?
Hypersonic (通常简称为 HSQLDB) 是一个 100% 纯 Java 编写的开源关系型数据库管理系统,它的主要特点包括:

- 轻量级: 整个数据库核心非常小,启动速度快,内存占用低。
- 纯 Java: 可以在任何安装了 Java 虚拟机的平台上运行,具有良好的跨平台性。
- 内存数据库: 数据默认存储在内存中,读写速度极快,但也可以配置为将数据持久化到磁盘文件。
- 兼容性好: 兼容 JDBC 3.0 标准,并提供对 SQL 标准的良好支持。
- 嵌入式模式: 可以作为嵌入式数据库直接集成到你的 Java 应用程序中,无需单独安装和启动数据库服务。
由于其这些特性,Hypersonic 常被用作:
- 单元测试: 在测试中快速创建和销毁数据库,而无需依赖外部数据库服务。
- 快速原型开发: 在项目初期快速搭建一个可用的数据库环境。
- 桌面应用: 为桌面软件(如 Java Swing, JavaFX 应用)提供一个内置的数据存储方案。
环境准备
在开始之前,你需要确保你的开发环境已经准备好:
- Java Development Kit (JDK): Hypersonic 是用 Java 写的,你需要安装 JDK 8 或更高版本。
- IDE: 一个好的集成开发环境,如 IntelliJ IDEA、Eclipse 或 VS Code,可以让你更方便地编写和运行代码。
- Hypersonic 驱动: 你需要下载 Hypersonic 的 JDBC 驱动程序(JAR 文件),你可以从其官方网站或 Maven 仓库获取。
通过 Maven 添加依赖 (推荐)
如果你使用 Maven 来管理项目,这是最简单的方式,在你的 pom.xml 文件中添加以下依赖:

<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.7.2</version> <!-- 请使用最新版本 -->
</dependency>
手动下载 JAR
你也可以从 HSQLDB 官方网站 下载最新版本的 ZIP 压缩包,解压后将 lib/hsqldb.jar 文件添加到你的项目类路径中。
核心概念:数据库模式
Hypersonic 有两种主要的运行模式,理解它们的区别至关重要:
- 内存模式: 数据完全存储在内存中,当数据库连接关闭后,所有数据都会丢失,这种模式速度最快,适合测试。
- 文件模式: 数据存储在磁盘上的文件中(
.script,.data,.log等),即使程序关闭,数据依然保留,下次启动时可以恢复,这种模式适合需要持久化数据的场景。
实战教程:创建数据库、建表、增删改查
我们将通过一个完整的 Java 示例,来学习如何使用 Hypersonic。

目标: 创建一个 users 表,并实现基本的 CRUD (Create, Read, Update, Delete) 操作。
步骤 1: 创建数据库连接
我们将使用 文件模式,这样数据可以持久化,Hypersonic 会根据你提供的 URL 自动创建或打开数据库。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class HypersonicDemo {
// HSQLDB 数据库 URL
// 格式: jdbc:hsqldb:<mode>/<path_to_database>
// mode: file (文件模式), mem (内存模式)
// path: 数据库文件的路径,可以是相对路径或绝对路径
private static final String DB_URL = "jdbc:hsqldb:file:./mydatabase/mydb";
private static final String USER = "SA"; // 默认超级用户
private static final String PASSWORD = ""; // 默认密码为空
public static void main(String[] args) {
// 确保驱动被加载(现代JVM通常不需要显式加载)
try {
Class.forName("org.hsqldb.jdbc.JDBCDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
return;
}
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASSWORD)) {
System.out.println("成功连接到 Hypersonic 数据库!");
// 步骤 2: 创建表
createTable(conn);
// 步骤 3: 插入数据
insertData(conn);
// 步骤 4: 查询数据
queryData(conn);
// 步骤 5: 更新数据
updateData(conn);
// 步骤 6: 查询更新后的数据
System.out.println("\n--- 更新后的用户列表 ---");
queryData(conn);
// 步骤 7: 删除数据
deleteData(conn);
// 步骤 8: 查询删除后的数据
System.out.println("\n--- 删除后的用户列表 ---");
queryData(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
// ... 其他方法将在下面实现
}
步骤 2: 创建表
使用 CREATE TABLE SQL 语句来创建表,我们使用 Statement 对象来执行。
private static void createTable(Connection conn) throws SQLException {
String sql = "CREATE TABLE users ("
+ "id INT PRIMARY KEY, "
+ "name VARCHAR(50) NOT NULL, "
+ "email VARCHAR(100) UNIQUE"
+ ");";
try (Statement stmt = conn.createStatement()) {
// 执行 SQL 语句
stmt.executeUpdate(sql);
System.out.println("表 'users' 创建成功!");
} catch (SQLException e) {
// 如果表已存在,会抛出异常,这里我们忽略它
if (!e.getMessage().contains("already exists")) {
throw e;
}
System.out.println("表 'users' 已存在。");
}
}
步骤 3: 插入数据
使用 PreparedStatement 来插入数据,这可以防止 SQL 注入,并且性能更好。
private static void insertData(Connection conn) throws SQLException {
String sql = "INSERT INTO users (id, name, email) VALUES (?, ?, ?);";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
// 插入第一条记录
pstmt.setInt(1, 1);
pstmt.setString(2, "Alice");
pstmt.setString(3, "alice@example.com");
pstmt.executeUpdate();
// 插入第二条记录
pstmt.setInt(1, 2);
pstmt.setString(2, "Bob");
pstmt.setString(3, "bob@example.com");
pstmt.executeUpdate();
System.out.println("成功插入两条用户数据。");
}
}
步骤 4: 查询数据
使用 SELECT 语句和 ResultSet 来遍历查询结果。
private static void queryData(Connection conn) throws SQLException {
String sql = "SELECT id, name, email FROM users;";
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
System.out.println("--- 用户列表 ---");
while (rs.next()) {
// 通过列名获取数据,更具可读性
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);
}
}
}
步骤 5: 更新数据
使用 UPDATE 语句和 PreparedStatement。
private static void updateData(Connection conn) throws SQLException {
String sql = "UPDATE users SET email = ? WHERE name = ?;";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, "alice_new@example.com");
pstmt.setString(2, "Alice");
int affectedRows = pstmt.executeUpdate();
System.out.println("\n成功更新了 " + affectedRows + " 条记录。");
}
}
步骤 6: 删除数据
使用 DELETE 语句。
private static void deleteData(Connection conn) throws SQLException {
String sql = "DELETE FROM users WHERE id = ?;";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, 2);
int affectedRows = pstmt.executeUpdate();
System.out.println("\n成功删除了 " + affectedRows + " 条记录。");
}
}
数据库管理工具 (HSQL Manager)
Hypersonic 自带一个非常实用的图形化管理工具 HSQL Manager,可以帮助你方便地管理数据库、执行 SQL 查询等。
如何启动 HSQL Manager:
- 找到你下载的 Hypersonic 压缩包。
- 进入
hsqldb-<version>.zip/hsqldb/lib/目录。 - 在命令行中运行
java -cp hsqldb.jar org.hsqldb.util.DatabaseManagerSwing。
启动后,你会看到一个图形界面:
- Type: 选择
HSQL Database Engine Server。 - URL: 输入你数据库的连接地址,
jdbc:hsqldb:file:./mydatabase/mydb。 - User: 输入用户名
SA。 - Password: 留空。
点击 OK,你就可以连接到你的数据库了,你可以:
- 查看/创建/修改表结构。
- 执行任意 SQL 查询。
- 查看数据库的运行状态。
关闭数据库
在文件模式下,为了确保所有数据都被正确地写入磁盘,最好在程序结束时执行一个 SHUTDOWN 命令,这个命令会关闭数据库,并清理所有临时文件。
// 在你的 main 方法或程序退出前执行
private static void shutdownDatabase(Connection conn) throws SQLException {
Statement stmt = conn.createStatement();
// 执行 SHUTDOWN 命令
stmt.execute("SHUTDOWN");
System.out.println("数据库已正常关闭。");
}
总结与最佳实践
- 何时使用 Hypersonic:
- 开发与测试: 作为单元测试的内存数据库,速度飞快。
- 小型应用: 作为桌面应用或小型 Web 应用的嵌入式数据库。
- 演示环境: 快速搭建一个功能完整的数据库环境进行演示。
- 何时避免使用:
- 高并发生产环境: Hypersonic 的并发处理能力不如 PostgreSQL、MySQL 等专业数据库。
- 海量数据存储: 它的设计初衷不是用于存储 TB 级别的数据。
- 需要复杂功能和高级优化的场景: 专业数据库提供了更丰富的功能和性能调优选项。
通过这份教程,你应该已经掌握了 Hypersonic 的基本使用方法,它是一个简单、强大且灵活的工具,特别适合 Java 开发者快速实现数据存储和操作功能。
