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.lcktestdb.logtestdb.propertiestestdb.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 上找到。


原始标题:Integrating Spring Boot with HSQLDB