Spring Boot kết nối CSDL H2 với JPA

Bài viết được dịch bởi: Nguyễn Tuấn Sơn - Học viên lớp java 07
Email: tuanson06102k@gmail.com
Bài viết gốc: https://www.baeldung.com/spring-boot-h2-database

1. Tổng quan

Trong bài viết này, chúng ta sẽ tìm hiểu cách kết nối CSDL H2 trong Spring Boot. H2 là cơ sở dữ liệu lưu trữ dữ liệu trên memory.

2. Dependencies

  • Chúng ta sẽ cấu hình H2 và spring-boot-starter-data-jpa trong file pom.xml:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

3. Database Configuration

  • Mặc định, Spring Boot sẽ cấu hình ứng dụng để kết nối với kho lưu trữ trong bộ nhớ với tên người dùng là: sa và mật khẩu trống.
  • Tuy nhiên, chúng ta có thể thay đổi các tham số đó bằng cách thêm các thuộc tính sau vào file application.properties:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
  • Ngoài ra, chúng ta cũng có thể sử dụng YAML để cấu hình cơ sở dữ liệu của dự án bằng cách thêm các thuộc tính vào file application.yaml:
spring:
  datasource:
    url: jdbc:h2:mem:mydb
    username: sa
    password: password
    driverClassName: org.h2.Driver
  jpa:
    spring.jpa.database-platform: org.hibernate.dialect.H2Dialect
  • Theo thiết kế, cơ sở dữ liệu trong bộ nhớ dễ không ổn định và dẫn đến mất dữ liệu sau khi khởi động lại dự án.
  • Chúng ta có thể thay đổi lỗi đó bằng cách sử dụng lưu trữ dựa trong file. Để thực hiện việc này, chúng ta cần cập nhật thuộc tính spring.datasource.url:
    spring.datasource.url=jdbc:h2:file:/data/demo
  • Tương tự, trong application.yaml, chúng ta có thể thêm cùng một thuộc tính để lưu trữ trong file:
spring:
  datasource:
    url: jdbc:h2:file:/data/demo

4. Database Operations

  • Thực hiện CRUD với H2 trong Spring Boot cũng giống như với các cơ sở dữ liệu SQL khác và các hướng dẫn trong loạt bài Spring Persistence đã thực hiện tốt vấn đề này.

4.1. DataSource Initialization

  • Chúng ta có thể sử dụng các lệnh SQL cơ bản để khởi tạo cơ sở dữ liệu. Để chứng minh điều này, hãy thêm file data.sql trong thư mục src/main/resources:
INSERT INTO countries (id, name) VALUES (1, 'USA');
INSERT INTO countries (id, name) VALUES (2, 'France');
INSERT INTO countries (id, name) VALUES (3, 'Brazil');
INSERT INTO countries (id, name) VALUES (4, 'Italy');
INSERT INTO countries (id, name) VALUES (5, 'Canada');
  • Tại đây, lệnh điền vào bảng quốc gia trong dữ liệu của chúng ta với một số dữ liệu mẫu.

  • Spring Boot sẽ tự động chọn file này và chạy nó trên cơ sở dữ liệu được nhúng trong bộ nhớ, chẳng hạn như H2 đã được định cấu hình của chúng ta. Đây là một cách để khởi tạo cơ sở dữ liệu cho mục đích thử nghiệm hoặc khởi tạo.

  • Chúng ta có thể vô hiệu hóa mặc định bằng cách đặt thuộc tính spring.sql.init.mode property to never. Ngoài ra, nhiều file SQL cũng có thể được cấu hình để tải dữ liệu ban đầu.

4.2. Hibernate and data.sql

  • Mặc định, tập lệnh data.sql thực thi trước khi khởi tạo Hibernate. Điều chỉnh việc khởi tạo dựa trên lệnh với các cơ sở dữ liệu khác như Flyway và Liquibase. Khi chúng ta tạo lại dữ liệu bởi Hibernate mỗi lần, chúng ta cần đặt một thuộc tính bổ sung:
spring.jpa.defer-datasource-initialization=true
  • Việc sửa đổi Spring Boot mặc định và điền dữ liệu vào sau khi dữ liệu được tạo bởi Hibernate. Hơn nữa, chúng ta cũng có thể sử dụng tập lệnh schema.sql để xây dựng dựa trên dữ liệu do Hibernate tạo trước tập hợp với data.sql. Tuy nhiên, việc kết hợp các dữ liệu khác nhau này không được khuyên dùng.

5. Truy cập giao diện quản trị H2 Console

  • H2 console là bảng điều khiển giao diện web được nhúng vào Spring Boot app để duyệt nội dung của cơ sở dữ liệu và truy vấn SQL. Theo mặc định, bảng điều khiển H2 không được bật trong Spring.

  • Để kích hoạt nó, chúng ta cần thêm thuộc tính sau vào application.properties:

spring.h2.console.enabled=true
  • Nếu chúng ta sử dụng cấu hình YAML, chúng ta cần thêm thuộc tính vào application.yaml:
spring:
  h2:
    console.enabled: true
  • Sau đó, sau khi khởi động ứng dụng, chúng ta có thể mở link http://localhost: 8080/h2-console, trang này sẽ hiển thị cho chúng ta trang đăng nhập.

  • Trên trang đăng nhập, chúng ta sẽ sử dụng thông tin đăng nhập giống như chúng ta đã cài đặt trong dự án.

    Khi chúng ta đăng nhập, chúng ta sẽ thấy một trang web liệt kê tất cả các bảng ở phía bên trái của trang và một bên để nhập lệnh chạy các truy vấn SQL:

  • Bảng truy vấn web có tính năng tự động hoàn thành đề xuất các từ khóa SQL. Thực tế là giao diện nhẹ nên thuận tiện cho việc kiểm tra cơ sở dữ liệu hoặc thực thi SQL trực tiếp.

  • Chúng ta cũng có thể định cấu hình thêm bảng điều khiển bằng cách chỉ định các thuộc tính sau trong application.properties của dự án với các giá trị mong muốn của chúng ta:

spring.h2.console.path=/h2-console
spring.h2.console.settings.trace=false
spring.h2.console.settings.web-allow-others=false
  • Nếu chúng ta sử dụng cấu hình YAML, chúng ta thêm thuộc tính trên vào vào application.properties dưới dạng:
spring:
  h2:
    console.path: /h2-console
    console.settings.trace: false 
    spring.h2.console.settings.web-allow-others: false
  • Trong đường link, chúng ta đặt đường dẫn tới nơi truy vấn cơ sở dữ liệu là /h2-console, có liên quan đến địa chỉ và cổng của dự án đang chạy của chúng ta. Do đó, nếu ứng dụng của chúng ta đang chạy tại cổng http://localhost:9001, thì cơ sở dữ liệu sẽ có sẵn tại http://localhost:9001/h2-console.

  • spring.h2.console.settings.trace = false để ngăn đầu ra theo dõi

  • spring.h2.console.settings.web-allow-others = false đê vô hiệu hóa truy cập từ xa

6. Kết luận

  • Cơ sở dữ liệu H2 hoàn toàn tương thích với Spring Boot. Chúng ta đã biết cách cấu hình và cách truy vấn cơ sở dữ liệu H2 để quản lý cơ sở dữ liệu đang chạy của chúng ta.