Tổng quan

Có lẽ chúng ta đã quá quen thuộc với cơ sở dữ liệu rồi nhỉ? Hầu hết các dự đều sẽ xoay quanh các nghiệp vụ CRUD (Create/Read/Update/Delete), chính vì vậy mà Spring JPA cũng đã hỗ trợ cho chúng ta tương đối tốt, chúng ta sẽ chỉ cần khai báo các interface và các query tương ứng với các hàm việc còn lại Spring sẽ lo giúp chúng ta.

Để điều này thì Spring cần sử dụng bridge design pattern kết hợp với Java Just In Time (sử dụng thư viện byte buddy). Phần chúng ta nhìn thấy sẽ là các repository interface, phần spring cài đặt sẽ gọi đến 1 framework ORM nào đó, ví dụ là Hibernate. Các thư viện ORM cũng sẽ lại tiếp tục gọi đến các thư viện Connection Pool và thông qua JDBC và database driver để gọi đến Database.

Cài đặt

Để sử dụng được Spring JPA, chúng ta sẽ cần add dependecies vào project của chúng ta, ví dụ với gradle:

implementation 'mysql:mysql-connector-java:' + mysqlConnectorVersion
implementation 'org.springframework.boot:spring-boot-starter:' + springBootVersion
implementation 'org.springframework.boot:spring-boot-starter-data-jpa:' + springBootVersion

Ngoài ra chúng ta cũng cần cấu hình data source url, ví dụ với file application.properties:

spring.datasource.url=jdbc:mysql://root:12345678@localhost:3306/test

Ví dụ

Giả sử chúng ta cần quản lý tác giả sách, và chúng ta cần làm việc với cơ sở dữ liệu là SQL (ví dụ MySQL), chúng ta sẽ cần tạo 1 lớp data tương ứng với bảng trong cơ sở dữ liệu, ví dụ:

package com.tvd12.example.spring_webflux_jpa.entity;

import lombok.*;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.time.LocalDateTime;

@Getter
@Setter
@Entity(name = "author")
@AllArgsConstructor
@NoArgsConstructor
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String name;
    private LocalDateTime createdTime;
    private LocalDateTime updatedTime;
}

Bây giờ chúng ta sẽ chỉ cần tạo ra AuthorRepository interface nữa là xong:

package com.tvd12.example.spring_webflux_jpa.repository;

import com.tvd12.example.spring_webflux_jpa.entity.Author;
import org.springframework.data.jpa.repository.JpaRepository;

public interface AuthorRepository extends JpaRepository<Author, Long> {}

Bây giờ Spring đã toạ AuthorRepository bean (singleton) cho chúng ta, và chúng ta có thể sử dụng nó ở bất cứ đâu trong chương trình giống như 1 bean bình thường, ví dụ:

@RestController
@RequestMapping("/api/v1")
@AllArgsConstructor
public class AuthorController {

    private final AuthorRepository authorRepository;

    @PostMapping("/author/add")
    public Mono<AddAuthorResponse> authorsAddPost(
        @RequestBody AddAuthorRequest request
    ) {
        Author author = new Author();
        ...
        Author saved = authorRepository.save(author);
    }

Ví dụ đầy đủ bạn có thể tham khảo tại Github Repo.