06 - Spring Boot Data JPA

03/03/2025 - 4 phút

Follow  on Google News

Trong bài viết này, chúng ta sẽ tìm hiểu về Spring Boot Data JPA, cách làm việc với cơ sở dữ liệu một cách hiệu quả!

1. Giới Thiệu

Khi xây dựng một ứng dụng, việc tương tác với cơ sở dữ liệu là một phần quan trọng. Spring Boot Data JPA giúp bạn quản lý dữ liệu một cách dễ dàng mà không cần viết nhiều mã boilerplate.

Spring Data JPA là một phần mở rộng của JPA (Java Persistence API), cung cấp các API mạnh mẽ để truy vấn dữ liệu mà không cần viết SQL thủ công. Với sự hỗ trợ của Hibernate, Spring Data JPA giúp bạn quản lý các entity và truy vấn dữ liệu nhanh chóng.

Trong bài viết này, chúng ta sẽ tìm hiểu về Spring Boot Data JPA, cách cấu hình kết nối cơ sở dữ liệu, tạo repository, sử dụng các phương thức truy vấn và tối ưu hiệu suất.


2. Cài Đặt Spring Boot Data JPA

2.1. Thêm Dependency

Để sử dụng Spring Data JPA, bạn cần thêm dependency vào 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-jdbc</artifactId>
</dependency>

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

Ở đây:

  • spring-boot-starter-data-jpa: Hỗ trợ JPA và Hibernate.
  • spring-boot-starter-jdbc: Hỗ trợ JDBC.
  • mysql-connector-j: Kết nối đến MySQL (bạn có thể thay bằng PostgreSQL, H2, v.v.).

2.2. Cấu Hình Kết Nối Cơ Sở Dữ Liệu

Thêm thông tin cấu hình trong application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

Giải thích:

  • spring.datasource.url: Địa chỉ kết nối MySQL.
  • spring.jpa.hibernate.ddl-auto: update giúp Hibernate tự động cập nhật cấu trúc bảng khi có thay đổi trong entity.
  • spring.jpa.show-sql: Hiển thị SQL truy vấn trên console.

3. Làm Việc Với Entity và Repository

3.1. Tạo Entity

Một Entity trong JPA đại diện cho một bảng trong cơ sở dữ liệu. Ví dụ:

import jakarta.persistence.*;

@Entity
@Table(name = "students")
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(nullable = false)
    private String name;
    
    @Column(nullable = false, unique = true)
    private String email;
    
    // Constructors, getters, and setters
}

3.2. Tạo Repository

Spring Data JPA cung cấp JpaRepository, giúp bạn truy vấn dữ liệu dễ dàng.

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface StudentRepository extends JpaRepository<Student, Long> {
    Student findByEmail(String email);
}

Spring Boot tự động tạo truy vấn SQL dựa trên phương thức findByEmail().

3.3. Sử Dụng Repository Trong Service

import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class StudentService {
    private final StudentRepository studentRepository;
    
    public StudentService(StudentRepository studentRepository) {
        this.studentRepository = studentRepository;
    }
    
    public List<Student> getAllStudents() {
        return studentRepository.findAll();
    }
    
    public Student getStudentByEmail(String email) {
        return studentRepository.findByEmail(email);
    }
    
    public Student saveStudent(Student student) {
        return studentRepository.save(student);
    }
}

4. Sử Dụng Query Trong Spring Boot Data JPA

Spring Data JPA cung cấp nhiều cách truy vấn dữ liệu:

4.1. Sử Dụng Phương Thức Tự Động Của JpaRepository

List<Student> findByName(String name);

Spring Boot tự động tạo SQL:

SELECT * FROM students WHERE name = ?

4.2. Sử Dụng @Query Với JPQL

@Query("SELECT s FROM Student s WHERE s.email = :email")
Student getStudentByEmail(@Param("email") String email);

Hoặc sử dụng native query:

@Query(value = "SELECT * FROM students WHERE email = :email", nativeQuery = true)
Student getStudentByEmailNative(@Param("email") String email);

4.3. Phân Trang và Sắp Xếp

Spring Data JPA hỗ trợ phân trang bằng Pageable:

Page<Student> findAll(Pageable pageable);

Ví dụ, lấy danh sách sinh viên theo trang:

Page<Student> students = studentRepository.findAll(PageRequest.of(0, 10, Sort.by("name")));

5. Tối Ưu Hiệu Suất Với Hibernate

5.1. Chỉ Lấy Các Trường Cần Thiết Với DTO

Tránh lấy toàn bộ entity khi không cần thiết bằng cách sử dụng Projection:

@Query("SELECT s.name FROM Student s WHERE s.id = :id")
String findStudentNameById(@Param("id") Long id);

5.2. Dùng fetch = FetchType.LAZY Để Tối Ưu Hiệu Suất

Nếu một entity có quan hệ với entity khác, sử dụng Lazy Loading để tránh truy vấn dư thừa:

@OneToMany(mappedBy = "student", fetch = FetchType.LAZY)
private List<Course> courses;

6. Kết Luận

Spring Boot Data JPA giúp bạn quản lý dữ liệu một cách hiệu quả mà không cần viết nhiều SQL thủ công. Bạn có thể:

  • Kết nối cơ sở dữ liệu nhanh chóng với Spring Boot.
  • Quản lý Entity và Repository dễ dàng.
  • Tạo truy vấn thông minh với JpaRepository, @Query.
  • Tối ưu hiệu suất bằng cách dùng DTO, Lazy Loading.

👉 Trong bài viết tiếp theo, chúng ta sẽ tìm hiểu về Spring Boot Caching, giúp tăng tốc hiệu suất ứng dụng bằng cách lưu trữ dữ liệu vào bộ nhớ đệm!