1. 概述
IBM Db2 是一款雲原生、關係型數據庫系統,同時還支持半結構化數據,例如 JSON 和 XML。 它旨在處理大量數據,並具有低延遲。
在本教程中,我們將使用 docker-compose.yml 文件在 Docker 容器內設置 Db2 社區版數據庫服務器。然後,我們將使用其 JDBC 驅動程序在 Spring Boot 應用程序中連接到它。
2. Db2 數據庫
Db2 數據庫以高效處理大量數據和高吞吐量而聞名。它能夠處理結構化和半結構化數據,使其在不同數據模型中用途廣泛。它適用於微服務和單體應用程序。
此外,數據庫系統需要訂閲才能訪問其全部功能。 但是,社區版(Community Edition)可用,但其最大存儲空間為 16 GiB,最多支持四個 CPU 核心。 此版本非常適合測試目的或資源需求有限的小型應用程序。
3. 部署準備
為了開始,我們先為 Spring Boot 應用設置依賴項,並在 Docker 容器內配置 Db2 數據庫服務器。
3.1. Maven 依賴
讓我們通過向 <em>pom.xml</em> 添加以下 Maven 依賴來啓動一個 Spring Boot 應用:spring-boot-starter-web 和 spring-boot-starter-data-jpa。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.4.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>3.4.3</version>
</dependency>
spring-boot-starter-web 依賴項允許我們創建 Web 應用程序,包括 RESTful API 和 MVC 應用程序。
spring-boot-starter-data-jpa 提供了一個對象關係映射 (ORM) 工具,通過抽象原生查詢來簡化數據庫交互,除非明確定義。
此外,讓我們添加 com.ibm.db2 依賴項到 pom.xml 中:
<dependency>
<groupId>com.ibm.db2</groupId>
<artifactId>jcc</artifactId>
<version>12.1.0.0</version>
</dependency>
com.ibm.db2 依賴項提供 Db2 JDBC 驅動程序,使我們能夠建立與 Db2 數據庫服務器的連接。
3.2. Db2 Docker Compose 文件
此外,我們將在項目根目錄下定義一個 docker-compose.yml 文件,以便在 Docker 容器內運行數據庫服務器:
services:
db2:
image: icr.io/db2_community/db2
container_name: db2server
hostname: db2server
privileged: true
restart: unless-stopped
ports:
- "50000:50000"
environment:
LICENSE: accept
DB2INST1_PASSWORD: mypassword
DBNAME: testdb
BLU: "false"
ENABLE_ORACLE_COMPATIBILITY: "false"
UPDATEAVAIL: "NO"
TO_CREATE_SAMPLEDB: "false"
volumes:
- db2_data:/database
healthcheck:
test: ["CMD", "su", "-", "db2inst1", "-c", "db2 connect to testdb || exit 1"]
interval: 30s
retries: 5
start_period: 60s
timeout: 10s
volumes:
db2_data:
driver: local
上述配置拉取最新的 Db2 社區鏡像。同時,它創建了一個用户、設置了密碼並初始化了一個數據庫。在此配置中,用户名是 db2inst1, 密碼是 mypassword, 數據庫名稱是 testdb。
接下來,讓我們運行 docker compose up 命令來啓動數據庫服務器。
4. 在 application.properties 文件中定義連接憑據
現在數據庫服務器已啓動,我們將在 application.properties 文件中定義連接詳細信息:
spring.datasource.url=jdbc:db2://localhost:50000/testdb
spring.datasource.username=db2inst1
spring.datasource.password=mypassword
spring.datasource.driver-class-name=com.ibm.db2.jcc.DB2Driver
spring.jpa.database-platform=org.hibernate.dialect.DB2Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true這裏,我們定義了數據庫 URL,其中包含主機、端口和我們連接的數據庫名稱。此外,URL 以 jdbc:db2, 結尾,這表示一個 JDBC 子協議,表明連接到 Db2 數據庫。
接下來,我們指定用户名和密碼,配置位於 docker-compose.yml 文件中。
重要的是,設置 spring.datasource.driver-class-name 屬性,確保 Spring Boot 加載正確的 Db2 JDBC 驅動程序。
5. 確認連接
接下來,我們將通過將一個記錄持久化到 testdb 來確認與數據庫的連接。
5.1. 實體類
首先,讓我們創建一個名為 Article 的實體類:
@Entity
public class Article {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String body;
private String author;
// standard constructor, getters and setters
}實體類映射到數據庫表及其列。
接下來,讓我們定義一個倉庫來處理數據庫操作:
public interface ArticleRepository extends JpaRepository<Article, Long> {
}現在,我們可以通過將倉庫注入到我們的控制器中,將實體持久化到數據庫中。
5.2. 控制器類
此外,讓我們創建一個控制器類:
@RestController
public class ArticleController {
private final ArticleRepository articleRepository ;
public ArticleController(ArticleRepository articleRepository) {
this.articleRepository = articleRepository;
}
}在上述代碼中,我們使用構造器注入將倉庫注入到控制器類中。這使得我們可以執行各種數據庫操作,例如保存和檢索文章。
接下來,讓我們實現一個 POST 端點以插入記錄:
@PostMapping("/create-article")
private ResponseEntity<Article> createArticle(@RequestBody Article article, UriComponentsBuilder ucb) {
Article newArticle = new Article();
newArticle.setAuthor(article.getAuthor());
newArticle.setBody(article.getBody());
newArticle.setTitle(article.getTitle());
Article savedArticle = articleRepository.save(newArticle);
URI location = ucb.path("/articles/{id}").buildAndExpand(savedArticle.getId()).toUri();
return ResponseEntity.created(location).body(savedArticle);
}在上述代碼中,我們創建了一個端點,該端點接受一個 Article 對象作為請求體,並將其保存到數據庫中。 此外,我們還返回 HTTP 201 (已創建) 狀態碼。
5.3. 集成測試
最後,我們使用 RestTemplate 類編寫一個集成測試,以驗證 POST 請求的行為。
首先,讓我們創建一個集成測試類:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class ArticleApplicationIntegrationTest {
}接下來,讓我們注入 RestTemplate 實例:
@Autowired
TestRestTemplate restTemplate;然後,我們來編寫一個測試方法,用於發送 POST 請求並驗證響應:
@Test
void givenNewArticleObject_whenMakingAPostRequest_thenReturnCreated() {
Article article = new Article();
article.setTitle("Introduction to Java");
article.setAuthor("Baeldung");
article.setBody("Java is a programming language created by James Gosling");
ResponseEntity<Article> createResponse
= restTemplate.postForEntity("/create-article", article, Article.class);
assertThat(createResponse.getStatusCode()).isEqualTo(HttpStatus.CREATED);
URI locationOfNewArticle = createResponse.getHeaders().getLocation();
ResponseEntity<String> getResponse
= restTemplate.getForEntity(locationOfNewArticle, String.class);
assertThat(getResponse.getStatusCode()).isEqualTo(HttpStatus.OK);
}在上述代碼中,我們斷言記錄已成功創建,並通過 檢索該記錄時返回 HTTP 200 響應。
6. 結論
本文介紹瞭如何設置 IBM Db2 數據庫並使用 Db2 驅動程序連接到它,該驅動程序配置在 Spring Boot 應用程序的 application.properties 文件中。 此外,我們通過將記錄持久化到數據庫來測試了連接。