CrudRepository, JpaRepository, dan PagingAndSortingRepository di Spring Data

1. Gambaran keseluruhan

Dalam artikel ringkas ini, kami akan menumpukan pada pelbagai jenis antara muka repositori Spring Data dan fungsinya. Kami akan menyentuh mengenai:

  • CrudRepository
  • PagingAndSortingRepository
  • JpaRepository

Ringkasnya, setiap repositori di Spring Data memperluas antara muka Repositori generik , tetapi di luar itu, masing-masing mempunyai fungsi yang berbeza.

2. Penyimpanan Data Spring

Mari kita mulakan dengan JpaRepository - yang meluaskan PagingAndSortingRepository dan, seterusnya, CrudRepository .

Masing-masing menentukan fungsi sendiri:

  • CrudRepository menyediakan fungsi CRUD
  • PagingAndSortingRepository menyediakan kaedah untuk melakukan penomboran dan menyusun rekod
  • JpaRepository menyediakan kaedah yang berkaitan dengan JPA seperti membuang konteks kegigihan dan menghapus rekod secara berkumpulan

Oleh itu, kerana hubungan warisan ini, JpaRepository mengandungi API penuh CrudRepository dan PagingAndSortingRepository .

Apabila kita tidak memerlukan fungsi penuh yang disediakan oleh JpaRepository dan PagingAndSortingRepository , kita hanya boleh menggunakan CrudRepository .

Sekarang mari kita lihat contoh ringkas untuk memahami API ini dengan lebih baik.

Kami akan mulakan dengan entiti Produk yang mudah :

@Entity public class Product { @Id private long id; private String name; // getters and setters }

Dan mari kita laksanakan operasi mudah - cari Produk berdasarkan namanya:

@Repository public interface ProductRepository extends JpaRepository { Product findByName(String productName); }

Itu sahaja. The Spring Data Repository akan menjana pelaksanaan secara automatik berdasarkan nama yang kami berikan kepadanya.

Ini adalah contoh yang sangat mudah; anda boleh mendalami JPA Spring Data di sini.

3. CrudRepository

Sekarang mari kita lihat kod untuk antara muka CrudRepository :

public interface CrudRepository extends Repository {  S save(S entity); T findOne(ID primaryKey); Iterable findAll(); Long count(); void delete(T entity); boolean exists(ID primaryKey); }

Perhatikan fungsi CRUD biasa:

  • simpan (…) - s a Iterable of entities. Di sini, kita dapat meneruskan beberapa objek untuk menyimpannya secara berkumpulan
  • findOne (…) - dapatkan satu entiti berdasarkan nilai kunci utama yang dilalui
  • findAll () - dapatkan Iterable dari semua entiti yang ada dalam pangkalan data
  • hitung () - r eturn kiraan jumlah entiti dalam jadual
  • delete (…) - hapus entiti berdasarkan objek yang dilalui
  • wujud (…) - sahkan sama ada entiti wujud berdasarkan nilai kunci utama yang dilalui

Antaramuka ini kelihatan cukup generik dan sederhana, tetapi sebenarnya, ia menyediakan semua abstraksi pertanyaan asas yang diperlukan dalam aplikasi.

4. PagingAndSortingRepository

Sekarang, mari kita lihat antara muka repositori lain, yang memperluas CrudRepository :

public interface PagingAndSortingRepository extends CrudRepository { Iterable findAll(Sort sort); Page findAll(Pageable pageable); }

Antaramuka ini menyediakan kaedah findAll (Pageable pageable) , yang merupakan kunci untuk melaksanakan Pagination.

Semasa menggunakan Pageable , kami membuat objek Pageable dengan sifat-sifat tertentu dan kami harus menentukan sekurang-kurangnya:

  1. Ukuran halaman
  2. Nombor halaman semasa
  3. Menyusun

Oleh itu, mari kita anggap bahawa kita ingin menunjukkan halaman pertama hasil yang disusun mengikut nama akhir, menaik, masing-masing tidak mempunyai lebih daripada lima rekod. Ini adalah bagaimana kita dapat mencapainya menggunakan definisi PageRequest dan Sort :

Sort sort = new Sort(new Sort.Order(Direction.ASC, "lastName")); Pageable pageable = new PageRequest(0, 5, sort);

Menyampaikan objek yang dapat dilayari ke pertanyaan data Spring akan mengembalikan hasil yang dipersoalkan (parameter pertama PageRequest adalah berdasarkan sifar).

5. JpaRepository

Akhirnya, kita akan melihat antara muka JpaRepository :

public interface JpaRepository extends PagingAndSortingRepository { List findAll(); List findAll(Sort sort); List save(Iterable entities); void flush(); T saveAndFlush(T entity); void deleteInBatch(Iterable entities); }

Sekali lagi, mari kita perhatikan setiap kaedah ini secara ringkas:

  • findAll () - dapatkan Senarai semua entiti yang ada dalam pangkalan data
  • findAll (…) - dapatkan Senarai semua entiti yang ada dan susun menggunakan keadaan yang disediakan
  • simpan (…) - s a Iterable of entities. Di sini, kita dapat meneruskan beberapa objek untuk menyimpannya secara berkumpulan
  • flush () - f lush semua tugas yang belum selesai ke pangkalan data
  • saveAndFlush (…) - simpan entiti dan perubahan flush serta merta
  • deleteInBatch (…) - hapus entiti yang boleh diganti . Di sini, kita dapat meneruskan beberapa objek untuk menghapusnya secara berkumpulan

Jelas, antara muka di atas meluaskan PagingAndSortingRepository yang bermaksud ia mempunyai semua kaedah yang terdapat di CrudRepository juga.

6. Kerosakan Repositori Spring Data

Beyond all the very useful advantages of these repositories, there are some basic downsides of directly depending on these as well:

  1. we couple our code to the library and to its specific abstractions, such as `Page` or `Pageable`; that's of course not unique to this library – but we do have to be careful not to expose these internal implementation details
  2. by extending e.g. CrudRepository, we expose a complete set of persistence method at once. This is probably fine in most circumstances as well but we might run into situations where we'd like to gain more fine-grained control over the methods exposed, e.g. to create a ReadOnlyRepository that doesn't include the save(…) and delete(…) methods of CrudRepository

7. Conclusion

Artikel ini merangkumi beberapa perbezaan dan ciri ringkas dari antara muka repositori Spring Data JPA.

Untuk maklumat lebih lanjut, lihat siri mengenai Spring Persistence.