TiiL Tutorials
@TinhocTiiL

Bài 9: Spring Data JPA

Why JPA

Vấn đề? Việc xây dựng và triển khai tầng DAL (Data Access Layer) các ứng dụng thường gây ra cho coder nhiều phiền toái do sự cồng kềnh và phức tạp của nó. Dù hiện nay đã có nhiều thư viện và framework hỗ trợ nhưng ta vẫn không tránh khỏi việc phải viết lại quá nhiều mã viết sẵn trong các thư viện, và code của chúng ta cũng sẽ ngày một trở nên “rối loạn” hơn.

Giải quyết: Spring cung cấp cho chúng ta giải pháp đó là các abstract reposity, nó được thiết kế dựa trên các interface, giảm đáng kể các mã viết sẵn và ảnh hưởng từ việc phải thực thi quá nhiều các lớp trong tầng truy cập dữ liệu.

Source link: https://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html

Core concepts

Phần cơ bản và cốt lõi nhất của SPring Data abstract repository đó là một interface có tên là Repository, nó nhận vào một Entity class tương ứng với java class đại diện cho một bảng trong database của chúng ta, và kiểu dữ liệu của trường ID trong bảng đó. Interface này cung cấp một số function xoay quanh việc Create Read Update Delete thực thể mà nó quản lí, như sau:

 

public interface Repository<T, ID extends Serializable> {
    T save(T entity);                                                                    
    T findById(ID primaryKey);                                                           
    List<T> findAll();                                                                   
    Page<T> findAll(Pageable pageable);                                                 
    Long count();                                                                        
    void delete(T entity);                                                               
    boolean exists(ID primaryKey);                                                       
    // … more functionality omitted.
}

Spring Data cũng cung cấp cho chúng ta một số interface với các tính năng phù hợp với từng mục đích, và chúng đều kế thừa từ interface Repository ở trên.

Example 1.1. CrudRepository interface

public interface CrudRepository<T, ID extends Serializable>
    extends Repository<T, ID> {
                                                                                                                       (1)
    <S extends T> S save(S entity);
                                                                                                                       (2)
    T findOne(ID primaryKey);
                                                                                                                       (3)
    Iterable<T> findAll();

    Long count();
                                                                                                                       (4)
    void delete(T entity);
                                                                                                                       (5)
    boolean exists(ID primaryKey);
                                                                                                                       (6)
    // … more functionality omitted.
}

Example 1.2. PagingAndSortingRepository interface

Cho phép sắp xếp và phân trang dữ liệu được lấy từ database

public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {

    List<T> findAll(Sort sort);

    Page<T> findAll(Pageable pageable);
}

Ví dụ để truy cập vào trang thứ 2 với độ dài của một trang là 20 dòng, chúng ta có thể làm như sau:

PagingAndSortingRepository<User, Long> repository = // lấy ra bean của repository
Page<User> users = repository.findAll(new PageRequest(1, 20);

Xây dựng lớp JPA cho ứng dụng web

Để tạo dựng được một abstract repository với Spring Data cơ bản sẽ gồm 4 bước sau:

  • Khai báo một interface mở rộng từ một trong số các interface có sẵn tùy theo mục đích.public interface PersonRepository extends JpaRepository<User, Long> { … }
  • Khai báo các phương thức truy vấn trong interface.List<Person> findByEmail(String email);
  • Cấu hình cho Spring biết đây là một repository và khởi tạo nó. (ở đây mình sử dụng Repository anotation, các bạn cũng có thể cấu hình với file .xml)
    @Repository
    public interface PersonRepository extends JpaRepository<User, Long> { … }
    

     

  • Sử dụng.
    public class PersonServiceImpl implements PersonService {
    
      @Autowired
      private PersonRepoyitory repository;
      @Overide
      public void doSomething() {
        List<Person> persons = repository.findByEmail("maicuongtho@tinhoc123.edu.vn");
      }
    }

 

Avatar
https://khoacntt.ntu.edu.vn/giang-vien/mai-cuong-tho

một GV Đại học. TiiL đã phụ trách một số môn học như: Lập trình Java, Phát triển web với Java, Lập trình thiết bị di động, Lập trình hệ thống nhúng và IoT.

Comments are closed.