1. 概述
Spring Boot 使您能夠輕鬆地與不同的數據庫系統進行交互,而無需手動管理依賴項的麻煩。
更具體地説,Spring Data JPA starter 提供所有用於與多個 DataSource 實現的無縫集成的功能。
在本教程中, 我們將學習如何將 Spring Boot 與 HSQLDB 集成。
2. Maven 依賴項
為了演示如何輕鬆地將 Spring Boot 與 HSQLDB 集成,我們將創建一個簡單的 JPA 存儲庫層,該層使用內存中的 HSQLDB 數據庫對客户實體執行 CRUD 操作.
以下是我們將用於啓動示例存儲庫層的 Spring Boot 啓動器:
<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 將嘗試自動配置一個 DataSource 類型的 Bean 和一個通過 HikariCP 實現的 JDBC 連接池。
因此,如果我們沒有在 pom.xml 文件中指定一個有效的 DataSource 依賴,則構建將會失敗。
此外,請務必檢查 Maven Central 上最新版本的 spring-boot-starter-data-jpa。
3. 連接到 HSQLDB 數據庫
為了練習我們的演示倉庫層,我們將使用內存數據庫。但是,也可以使用基於文件的數據庫進行操作。我們將在此下文的各個部分探索這些方法。
3.1. 運行外部HSQLDB服務器
讓我們看看如何運行外部HSQLDB服務器並創建基於文件的數據庫。安裝HSQLDB和運行服務器非常簡單。
以下是應該遵循的步驟:
- 首先,我們將下載HSQLDB並將其解壓縮到文件夾中
- 由於HSQLDB沒有提供默認數據庫,我們將創建一個名為“testdb”的數據庫,僅供示例使用
- 我們將啓動命令提示符並導航到HSQLDB的“data”文件夾
- 在“data”文件夾中,我們將運行以下命令:
java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --database.0 file.testdb --dbname0.testdbCREATE TABLE customers (
id INT NOT NULL,
name VARCHAR (45),
email VARCHAR (45),
PRIMARY KEY (ID)
);
只需幾個簡單的步驟,我們已經創建了一個基於文件的HSQLDB數據庫,其中包含一個客户表。
3.2. application.properties 文件
如果我們要連接到 Spring Boot 之前的基於文件的數據存儲庫,以下是在 <em application.properties</em> 文件中應包含的設置:
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 參數。當使用內存數據庫時,我們需要指定此參數,以便 JPA 實現(即 Hibernate)在應用程序運行時不會關閉數據庫。
4. 客户實體
配置數據庫連接設置後,接下來我們需要定義我們的 客户 實體:
@Entity
@Table(name = "customers")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
private String email;
// standard constructors / setters / getters / toString
}
5. 倉庫
此外,我們需要實現一個薄的持久化層,這允許我們在我們的 JPA 實體上擁有基本的 CRUD 功能。
我們可以通過簡單地擴展 CrudRepository 接口來實現這個層:
@Repository
public interface CustomerRepository extends CrudRepository<Customer, Long> {}6. 測試 客户存儲庫
最後,我們應該確保 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 存儲庫層時,使用基於文件或內存數據庫。