1. 概述
Spring Boot 让我们能轻松地与各种数据库系统集成,而无需手动管理依赖。特别是 Spring Data JPA 的 starter,已经为我们封装了大部分与 DataSource 实现集成所需的逻辑。
在本教程中,我们将学习如何将 Spring Boot 与 HSQLDB 集成。
2. Maven 依赖配置
为了展示 Spring Boot 与 HSQLDB 的集成有多简单,我们将创建一个简单的 JPA 仓库层,使用内存中的 HSQLDB 数据库对客户实体执行 CRUD 操作。
我们将使用以下 Spring Boot starter 来启动我们的示例仓库层:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>3.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.7.1</version>
<scope>runtime</scope>
</dependency>
注意,我们还添加了 HSQLDB 的依赖。如果不添加它,Spring Boot 会尝试通过 HikariCP 自动配置一个 DataSource 和 JDBC 连接池。
因此,如果我们没有在 pom.xml 中指定有效的 DataSource 依赖,项目构建将会失败。
此外,建议检查 Maven Central 上 spring-boot-starter-data-jpa 的最新版本。
3. 连接到 HSQLDB 数据库
为了演示我们的仓库层,我们将使用内存数据库。当然,也可以使用基于文件的数据库。我们将在以下章节中分别介绍这两种方式。
3.1. 启动外部 HSQLDB 服务器
我们来看一下如何启动一个外部 HSQLDB 服务器并创建一个基于文件的数据库。整体步骤如下:
✅ 下载 HSQLDB 并解压到某个目录
✅ 由于 HSQLDB 默认不提供数据库,我们可以创建一个名为 testdb 的数据库用于演示
✅ 打开命令行,进入 HSQLDB 的 data 目录
✅ 在该目录下运行以下命令:
java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --database.0 file.testdb --dbname0.testdb
这个命令会启动 HSQLDB 服务器,并创建数据库,数据库文件将保存在 data 目录下。
✅ 检查 data 目录下是否生成了如下文件:testdb.lck、testdb.log、testdb.properties 和 testdb.script(具体文件数量取决于数据库类型)
数据库创建完成后,我们需要建立连接。
Windows 系统
进入 bin 目录,运行 runManagerSwing.bat 文件,打开 HSQLDB Database Manager,输入以下连接信息:
- Type: HSQL Database Engine
- URL:
jdbc:hsqldb:hsql://localhost/testdb
- User: SA
- Password: 留空
Linux/Unix/Mac 系统
可以通过 NetBeans、Eclipse 或 IntelliJ IDEA 等 IDE,使用相同的连接信息建立数据库连接。
连接成功后,可以执行如下 SQL 脚本创建一个 customers 表:
CREATE TABLE customers (
id INT NOT NULL,
name VARCHAR (45),
email VARCHAR (45),
PRIMARY KEY (ID)
);
这样我们就创建了一个基于文件的 HSQLDB 数据库,并包含一个 customers 表。
3.2. application.properties 配置
如果我们要从 Spring Boot 连接到上述基于文件的数据库,在 application.properties 中应配置如下:
spring.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver
spring.datasource.url=jdbc:hsqldb:hsql://localhost/testdb
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update
如果使用内存数据库,则应使用如下配置:
spring.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver
spring.datasource.url=jdbc:hsqldb:mem:testdb;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create
⚠️ 注意:在内存数据库的 URL 后面加了 DB_CLOSE_DELAY=-1
参数。这是为了 防止 Hibernate 在应用运行时关闭数据库。
4. Customer 实体类
数据库连接配置好后,接下来我们定义 Customer 实体类:
@Entity
@Table(name = "customers")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
private String email;
// 标准构造器 / setter / getter / toString
}
5. Customer 仓库接口
接着,我们实现一个简单的持久层,提供对 Customer 实体的基本 CRUD 操作。
可以通过继承 CrudRepository 接口来实现:
@Repository
public interface CustomerRepository extends CrudRepository<Customer, Long> {}
6. 测试 Customer 仓库
最后,我们通过测试来验证 Spring Boot 是否能成功连接到 HSQLDB。
先测试 findById() 和 findAll() 方法:
@RunWith(SpringRunner.class)
@SpringBootTest
public class CustomerRepositoryTest {
@Autowired
private CustomerRepository customerRepository;
@Test
public void whenFindingCustomerById_thenCorrect() {
customerRepository.save(new Customer("John", "[email protected]"));
assertThat(customerRepository.findById(1L)).isInstanceOf(Optional.class);
}
@Test
public void whenFindingAllCustomers_thenCorrect() {
customerRepository.save(new Customer("John", "[email protected]"));
customerRepository.save(new Customer("Julie", "[email protected]"));
assertThat(customerRepository.findAll()).isInstanceOf(List.class);
}
}
再测试 save() 方法:
@Test
public void whenSavingCustomer_thenCorrect() {
customerRepository.save(new Customer("Bob", "[email protected]"));
Customer customer = customerRepository.findById(1L).orElseGet(()
-> new Customer("john", "[email protected]"));
assertThat(customer.getName()).isEqualTo("Bob");
}
7. 总结
在本文中,我们学习了如何将 Spring Boot 与 HSQLDB 集成,并演示了如何使用基于文件或内存的数据库来开发一个基本的 JPA 仓库层。
一如既往,本文中的所有代码示例都可以在 GitHub 上找到。