Spring Data JPA là gì? Tại sao chúng ta cần sử dụng nó?

Khi chúng ta triển khai một dự án mới, điều cần nhất là làm sao phát triển nó trong thời gian nhanh nhất có thể tiết kiệm chi phí cho dự án. Đó là lý do vì sao JPA và Spring Data JPA trở nên phổ biến. JPA giúp chúng ta xử lý hầu hết các công việc phức tạp và nhàm chán trong JDBC và object-relational mappings. Spring Data JPA giúp chúng ta triển khai một số lượng mã nguồn mà JPA yêu cầu, giúp triển khai tầng persistence dễ dàng và nhanh hơn.

Nghe có vẽ Spring Data JPA quá tuyệt vời phải không, chúng ta sẽ cùng nhau tìm hiểu về nó qua bài viết này.

Mối quan hệ giữa Spring Data JPA, JPA và Hibernate/EclipseLink

Trước khi nói về Spring Data JPA, chúng ta sẽ bàn luận về môi quan hệ giữa Spring Data JPA, JPA và Hibernate/EclipseLink để có được cái nhìn tổng quan về chúng.

JPA là một đặc tả định nghĩa các API cho các object-relational mapping và quản lý các persistent object. Hibernate và EclipseLink là 2 JPA implementation được sử dụng phổ biến trong các ứng dụng Java.

Và Spring Data JPA là được tầng được xây dự phía trên tầng JPA. Có nghĩa là nó sẽ sử dụng tất cả các chức năng của JPA như entity mapping, entity life-lifecycle, JPA query v.v để xây dựng một số tính năng như no-code repository, khởi tạo query thông qua tên hàm v.v. Những khái niệm này sẽ được giải thích ở phần sau.

3 lý do để sử dụng Spring Data JPA

Nếu JPA và các JPA implementation của nó đã cung cấp hầu hết các tính năng mà chúng ta cần để phát triển tầng persistence của một ứng dụng thì tại sao chúng ta lại cần đến Spring Data JPA. Chúng ta có thể sử dụng trực tiếp JPA với Hibermate hoặc EclipseLink mà không cần đến một tầng bổ sung như Sping Data JPA được không? 

Tất nhiên, bạn có thể làm điều đó. Đó là điều mà rất nhiều ứng dụng Java SE làm. Jakarta EE cho phép tích hợp JPA một cách dễ dàng mà không cần thêm một tầng bổ sung nào khác.

Nhưng Spring Data JPA team đã làm thêm một số bước giúp cho việc triển khai ứng dụng của chúng ta trở nên dễ dàng hơn một chút bằng việc cung cấp rất nhiều chức năng cơ bản mà nếu không thì chúng ta cần phải tự triển khai. Dưới đây là 3 lý do chúng ta nên sử dụng Spring Data JPA.

No-code Repository

Đối với mỗi repository chúng ta đều cần phải triển khai các hàm CRUD, việc này khiến mã nguồn bị lặp đi lặp lại nhiều lần và công việc này cũng khá nhàm chán. Spring Data JPA cung cấp cho bạn một tập hợp các repository interface mà bạn chỉ cần extends chúng thì mặc định nó đã cung cấp các hàm CRUD cho chúng ta ngoài ra còn một số tính năng khác mà chúng ta sẽ tìm hiểu ngay trong các phần sau.

Ví dụ chúng ta chỉ cần triển khai AuthorRepository như sau:

package org.thoughts.on.java.spring.data.repository;
 
import org.springframework.data.repository.CrudRepository;
import org.thoughts.on.java.spring.data.model.Author;
 
public interface AuthorRepository extends CrudRepository<Author, Long> {}

Thì Spring Data mặc định đã cung cấp cho chúng ta các hàm cần thiết như:

  • Thêm, xóa, sửa một hoặc nhiều Author entity.
  • Tìm kiếm Author theo khóa chính
  • Đếm số lượng Author trong database.
  • Lấy tất cả các Author trong database.
  • Xóa tất cả Author trong database.
  • Kiểm tra một Author có tồn tại hay không dựa vào khóa chính được truyền vào.

Như vậy với một lượng lớn method cơ cản của một repository như vậy mà chúng ta phải triển khai thì sẽ rất vất vả với một dự án có rất nhiều repository.

Giảm thiểu tối đa boilerplate code

Một tính năng tiện lợi khác của Spring Data JPA là tạo các truy vấn database dựa trên tên hàm. Nếu một câu truy vấn không quá phức tập thì chúng ta chỉ cần định nghĩa tên hàm trong repository bắt đầu bằng chữ findBy và kế tiếp là tên các thuộc tính tương ứng kết hợp các phép AND, OR thì Spring Data sẽ giúp sinh ra câu truy vấn cách tự động.

Ví dụ như hàm findByTitle, Spring Data JPA sẽ sinh ra câu truy vấn tìm kiếm Book entity theo title một cách tự động, đẩy giá trị title từ tham số đầu vào câu truy vấn.

public interface BookRepository extends CrudRepository<Book, Long> {
     
    Book findByTitle(String title);
}

Sử dụng Spring Data JPA trong Sring Boot

Nếu bạn đang sử dụng Spring Boot thì việc kết hợp với Spring Data JPA là một điều tuyệt vời, và đa số các ứng dụng Spring boot hiện nay đều sử dụng Spring Data JPA để triển khai tầng persistence một cách hiệu quả.

Để sử dụng Spring Data JPA trong Spring boot chúng ta cần thêm spring-boot-starter-data-jpa dependency và jdbc driver tương ứng với database mà bạn đang sử dụng: 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>test</scope>
</dependency>

Dependency spring-boot-starter-data-jpa đã bao gồm  JPA API, JPA Implementation, JDBC và một số thư viện cần thiết khác.

Tiếp theo, chúng ta cần cấu hình các thông qua kết nối database trong application.properties hoặc application.yml file.

spring.datasource.url = jdbc:postgresql://localhost:5432/recipes
spring.datasource.username = postgres
spring.datasource.password = postgres

Nếu cấu trúc của project theo mặc định của Spring boot, main class nằm ở root package thì tải tất cả các repository được chúng ta định nghĩa trong các sub-package nhờ vào @SpringBootApplication annotaiton. Còn nếu không thì chúng cần cấu hình bằng cách sử dụng @EnableJpaRepositories annotation.

Các repository trong Spring Data JPA

Sau khi thiết lập xong mọi thứ để sử dụng Spring Data JPA trong project, chúng ta cần quan tâm đến 3 repository interface của nó:

Như cái tên được đặt thì chúng ta cũng có thể đoán ra rằng CrudRepository interface định nghĩa các hàm cơ bản như create, read, update và delete. PagingAndSortingRepository thừa kế từ CrudRepository và thêm findAll method cho phép chúng ta sắp xếp và truy xuất kết quả được phân trang. JpaRepository bổ sung thêm một số method dành riêng cho JPA như flush, findAll.

Nguồn

https://thorben-janssen.com/what-is-spring-data-jpa-and-why-should-you-use-it/

5 3 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x