Trong bài viết này, tôi sẽ hướng dẫn các bạn tìm hiểu cách configure Spring Boot sử dụng cơ sở dữ liệu PostgreSQL và build RESTful CRUD API từ đầu.

Chúng ta cũng sẽ học được cách làm thế nào để Spring Data JPA và Hibernate có thể sử dụng với PostgreSQL.

Tôi sẽ viết REST APIs cho ứng dụng Q&A. Ứng dụng Q&A sẽ có 2 domain models là: Question và Answer. Vì một question sẽ có nhiều answers, nên tôi sẽ định nghĩa mối quan hệ one-to-many giữa QuestionAnswer entity.

Đầu tiên, tôi sẽ khởi tạo Project và cấu hình PostgreSQL database. Sau đó, tôi sẽ định nghĩa các domain models và repositories để truy cập dữ liệu từ PostgreSQL. Cuối cùng, tôi sẽ viết REST APIs và test các APIs sử dụng Postman.

I. Khởi tạo Project

Trong bài viết này, tôi sẽ khởi tạo project bằng cách sử dụng công cụ web Spring Initializr, hãy làm theo hướng dẫn bên dưới:

Đầu tiên, hãy truy cập vào http://start.spring.io

  • Nhập postgres-demo vào Artifact field.
  • Add Web, JPA , PostgreSQL và Lombok vào phần Dependencies.
  • Click Generate Project để download project.

Hãy import project vào IDE bạn yêu thích và bắt đầu làm việc.

Cấu trúc thư mục của dự án sau khi hoàn thành, bạn có thể tham khảo nó để tạo các package và class cho phù hợp.

II. Cấu hình PostgreSQL

Để Spring Boot có thể sử dụng PostgreSQL làm nguồn dữ liệu, thì chúng ta phải cấu hình bằng cách thêm driver, url, username và password của cơ sở dữ liệu PostgreQuery vào src/main/resources/application.properties:

III. Xác định các domain models

Các domain models là các class được ánh xạ tới các bảng tương ứng trong cơ sở dữ liệu. Chúng ta sẽ có hai domain models chính trong ứng dụng của mình đó là QuestionAnswer.
Cả hai domain models này sẽ có chung 1 số thuộc tính như createAtupdateAt. Nên tốt nhất thì chúng ta nên tách các trường này ra 1 lớp riêng. Chúng ta sẽ tạo 1 class abstract là AuditModel để chứa các trường này.
Chúng ta cũng sẽ sử dụng tính năng JPA Auditing của Spring Boot để tự động điền createAtupdateAt.

1. AuditModel

Class AuditModel sau sẽ được extended bởi các entities khác. Nó sẽ sử dụng annotation @EntityListeners(AuditingEntityListener.class) để tự động điền createAtupdateAt.

  • Lưu ý: tôi đang sử dụng @Getter@Setter của Lombok, Bạn cần phải setting IDE của mình để có thể sử dụng Lombok. Trong trường hợp bạn gặp lỗi, hãy tham khảo cách setting tại đây

Kích hoạt JPA Auditing

Để bật JPA Auditing, chúng ta sẽ phải cần thêm annotation @EnableJpaAuditing vào một trong các class config. Vì vậy, hãy mở class PostgresDemoApplication.java và thêm annotation @EnableJpaAuditing như sau:

2. Question model

Dưới đây là class Question entity. Nó được ánh xạ tới một table có tên questions trong cơ sở dữ liệu.

3. Answer model

Dưới đây là class Answer entity. Nó chứa một annotation @ManyToOne để tuyên bố rằng nó có mối quan hệ nhiều-một với Question entity.

IV. Định nghĩa các class Repositories

Các Repository sẽ được sử dụng để truy cập các QuestionAnswer từ cơ sở dữ liệu.

1. QuestionRepository

2. AnswerRepository

V. Building các REST APIs

Cuối cùng, chúng ta hãy viết các REST API bên trong các controller để thực hiện các thao tác CRUD cho các QuestionAnswer.

1. QuestionController

2. AnswerController

Custom lớp ResourceNotFoundException

Các REST API của QuestionAnswer sẽ trả ra ResourceNotFoundException khi không tìm thấy questions hoặc answers trong cơ sở dữ liệu. Dưới đây là definition của class ResourceNotFoundException.

Lớp ngoại lệ chứa một annotation @ResponseStatus(HttpStatus.NOT_FOUND) để báo với Spring Boot trạng thái 404 NOT FOUND khi ngoại lệ này được ném ra.

VI. Chạy ứng dụng và kiểm tra API thông qua Postman

Chúng ta đã hoàn thành việc xây dựng REST API. Hãy chạy ứng dụng và kiểm tra các API đó.
Các ảnh chụp màn hình sau đây sẽ cho bạn thấy cách kiểm tra API bằng Postman.

1. Tạo câu hỏi: Post/questions

2. Get thông tin câu hỏi: Get/questions

3. Tạo câu trả lời: Post/questions/{questionId}/answers

4. Get thông tin Answer của Question: Get/questions/{questionId}/answers