iT邦幫忙

0

在 Spring boot 開發中使用 H2 Database

  • 分享至 

  • xImage
  •  

H2

在開始之前, 先簡單介紹一下 H2 是一個輕量型的資料庫, 預設是採用記憶體的方式做資料儲存, 速度非常快, 整體的 jar 檔大約 2.5MB 左右。支援標準的 SQL 語法規範, 與 JDBC API 接口。在 Spring boot (2.7.4) 的官方文檔 中也有一些簡單的描述與介紹。

Why H2

整體來說, 輕量快速反應, 滿符合敏捷精神的, 大團隊或小團隊都有適合他使用的情境.

  1. 在專案草創階段, 常常會修改 DB Scheam, 三不五時就要 alter column 或是 drop column, 若公司組織規模稍大, 還需要提交給 DBA 去執行這些指令, 有較多的溝通成本。
  2. H2 可以在本地快速啟動, 可以透過 spring.jpa.hibernate.ddl-auto: update 的特性, 自動更新 schema。
  3. 若團隊採用共用開發資料庫, 在一些測試案例或操作的時候, 資料可能會互相污染, 雖然 docker 可以在本地快速建構資料庫, 但就需要再額外安裝 docker。
  4. 支援瀏覽器的 Console 介面, 基本上也不需要特別安裝 Database GUI 透過 spring.h2.console.eanbled: true 就能在瀏覽器做一些 table 的查詢。
    https://ithelp.ithome.com.tw/upload/images/20221017/20092258zc8KYlEOyK.png

Spring boot

這邊推薦使用 Spring boot initializr 來初始化專案。
https://ithelp.ithome.com.tw/upload/images/20221017/20092258Qe8B9oYwGc.png

專案的 pom.xml 裡面的套件依賴描述大概會長這樣子。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
  <groupId>com.h2database</groupId>
  <artifactId>h2</artifactId>
  <scope>runtime</scope>
</dependency>

專案的 application.properies 我通常習慣改為 application.yml 比較符合我的閱讀習慣, 細部說明就寫在註解裡面了。

spring:
  # spring datasource configuration 的配置
  datasource:
    driver-class-name: org.h2.Driver
    username: 'sa'
    password:
    url: 'jdbc:h2:mem:my_app'  # H2 的 JDBC URL, mem 表示使用記憶體, my_app 是資料庫的名稱
  h2:
    console:
      enabled: true  # 設定要啟用 H2 的 console 可以在瀏覽器上面查詢 table
      path: '/h2' # 瀏覽器 console 的 URL 路徑
  jpa:
    generate-ddl: false
    open-in-view: false
    hibernate:
      ddl-auto: update  # 當 spring boot entity 有修改時, 會自動修改 DB scheam

JPA Entity Sample

來建立一個簡單的 JPA Entity 吧

/**
 * 這邊的 @Getter 與 @Setter 是 lombok 的功能, 不採用 @Data 在底下說明
 */
@Getter
@Setter
@Entity
public class ProductEntity implements Serializable {

  @Id
  @GeneratedValue
  private Long id;

  @Column(nullable = false)
  private String name;

  @Column(nullable = false)
  private BigDecimal price;
}

JPA Entity 不應該用 lobmok 的 @Data

主要是 @Data 包含了 @EqualsAndHashCode@ToString 這個功能, 分別會去實作 Java Class 的 equals, hashCode, toString 方法。

@Override 
public boolean equals(Object o) {...}

@Override 
public int hashCode() {...}

@Override 
public String toString() {...}

這會有什麼影響呢? 可以思考一下, JPA 的 Entity 本身就有 @Id field 可以做 equals 的比較了, 真的還需要去覆寫 equals(Object o) 這個方法嗎?

其二, 當資料庫有關聯時, 比如說 @OneToMany 時, lombok 因為會自動掃描所有 fields 去產生 hashCode()toString() 而破壞了 lazy loadding 機制, 這不就失去 lazy loadding 的用意了嗎?故 非常不建議 在 Entity 使用 lombok 的 @Data

最後, 打開瀏覽器, 登入 http://localhost:8080/h2 就能看到以下畫面
https://ithelp.ithome.com.tw/upload/images/20221017/200922586pM8gUW4zr.jpg


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言