Repository Katmanı
Bu bölümde, e-ticaret uygulaması için repository katmanını oluşturmayı detaylı olarak ele alacağız. Repository katmanı, veritabanı işlemlerini gerçekleştiren ve entity’ler ile veritabanı arasında bir köprü görevi gören katmandır.Repository Nedir?
Repository, veritabanı işlemlerini soyutlayan ve entity’ler üzerinde CRUD (Create, Read, Update, Delete) işlemlerini gerçekleştiren bir tasarım desenidir. Spring Data JPA, repository desenini uygulamak için hazır arayüzler ve implementasyonlar sağlar.Spring Data JPA Repository Arayüzleri
Spring Data JPA, repository desenini uygulamak için çeşitli arayüzler sağlar. Bu arayüzler, temel CRUD işlemleri için hazır metodlar içerir ve özel sorgular oluşturmak için bir DSL (Domain Specific Language) sunar.Repository Arayüzü
Repository arayüzü, tüm repository arayüzlerinin temel arayüzüdür. Bu arayüz, herhangi bir metod içermez ve sadece bir işaretleyici (marker) arayüzüdür.
CrudRepository Arayüzü
CrudRepository arayüzü, temel CRUD işlemleri için metodlar sağlar.
PagingAndSortingRepository Arayüzü
PagingAndSortingRepository arayüzü, CrudRepository arayüzünü genişletir ve sayfalama ve sıralama işlemleri için ek metodlar sağlar.
JpaRepository Arayüzü
JpaRepository arayüzü, PagingAndSortingRepository arayüzünü genişletir ve JPA’ya özgü ek metodlar sağlar.
Repository Sınıfları Oluşturma
E-ticaret uygulaması için repository sınıflarını oluşturalım. Her entity için bir repository sınıfı oluşturacağız.UserRepository
User entity’si için temel CRUD işlemlerini sağlar ve kullanıcı adı ve e-posta ile kullanıcı arama işlemleri için özel metodlar içerir.
CategoryRepository
Category entity’si için temel CRUD işlemlerini sağlar ve kategori adı, üst kategorisi olmayan kategoriler ve belirli bir üst kategoriye ait alt kategoriler için özel metodlar içerir.
ProductRepository
Product entity’si için temel CRUD işlemlerini sağlar ve ürün adı, kategori, fiyat aralığı, anahtar kelime araması ve düşük stok durumu için özel metodlar içerir.
ProductRepositoryCustom
Özel sorgu metodları için bir custom repository arayüzü oluşturabiliriz.ProductRepositoryImpl
Custom repository arayüzünün implementasyonu:AddressRepository
Address entity’si için temel CRUD işlemlerini sağlar ve kullanıcı ID’si, varsayılan adres ve adres tipi için özel metodlar içerir.
OrderRepository
Order entity’si için temel CRUD işlemlerini sağlar ve kullanıcı ID’si, sipariş durumu, tarih aralığı ve gelir hesaplama için özel metodlar içerir.
OrderDetailRepository
OrderDetail entity’si için temel CRUD işlemlerini sağlar ve sipariş ID’si, ürün ID’si ve en çok satılan ürünler için özel metodlar içerir.
PaymentRepository
Payment entity’si için temel CRUD işlemlerini sağlar ve sipariş ID’si, ödeme durumu, ödeme yöntemi ve ödeme istatistikleri için özel metodlar içerir.
ReviewRepository
Review entity’si için temel CRUD işlemlerini sağlar ve ürün ID’si, kullanıcı ID’si, ortalama değerlendirme puanı ve değerlendirme istatistikleri için özel metodlar içerir.
ProductImageRepository
ProductImage entity’si için temel CRUD işlemlerini sağlar ve ürün ID’si ve ana görsel için özel metodlar içerir.
Metod İsimlendirme Kuralları
Spring Data JPA, repository metodlarının isimlerine göre otomatik olarak sorgu oluşturur. Bu, özel sorgular oluşturmak için JPQL veya SQL yazmak zorunda kalmadan, sadece metod isimlerine göre sorgular oluşturmanıza olanak tanır.Temel Metod İsimlendirme Kuralları
- find…By: Belirli bir kritere göre entity’leri bulmak için kullanılır.
- get…By:
find...Byile aynıdır. - read…By:
find...Byile aynıdır. - query…By:
find...Byile aynıdır. - count…By: Belirli bir kritere göre entity sayısını saymak için kullanılır.
- exists…By: Belirli bir kritere göre entity’nin var olup olmadığını kontrol etmek için kullanılır.
- delete…By: Belirli bir kritere göre entity’leri silmek için kullanılır.
- remove…By:
delete...Byile aynıdır.
Özel Metod İsimlendirme Örnekleri
- findByName:
namealanına göre entity’leri bulmak için kullanılır. - findByNameAndDescription:
namevedescriptionalanlarına göre entity’leri bulmak için kullanılır. - findByNameOrDescription:
nameveyadescriptionalanlarına göre entity’leri bulmak için kullanılır. - findByPriceBetween:
pricealanının belirli bir aralıkta olduğu entity’leri bulmak için kullanılır. - findByPriceGreaterThan:
pricealanının belirli bir değerden büyük olduğu entity’leri bulmak için kullanılır. - findByPriceLessThan:
pricealanının belirli bir değerden küçük olduğu entity’leri bulmak için kullanılır. - findByNameLike:
namealanının belirli bir desene uyduğu entity’leri bulmak için kullanılır. - findByNameStartingWith:
namealanının belirli bir değerle başladığı entity’leri bulmak için kullanılır. - findByNameEndingWith:
namealanının belirli bir değerle bittiği entity’leri bulmak için kullanılır. - findByNameContaining:
namealanının belirli bir değeri içerdiği entity’leri bulmak için kullanılır. - findByOrderByNameAsc: Entity’leri
namealanına göre artan sırada sıralamak için kullanılır. - findByOrderByNameDesc: Entity’leri
namealanına göre azalan sırada sıralamak için kullanılır.
@Query Anotasyonu
Spring Data JPA, metod isimlerine göre otomatik sorgu oluşturmanın yanı sıra,@Query anotasyonu ile özel JPQL veya SQL sorguları tanımlamanıza da olanak tanır.
JPQL Sorguları
JPQL (Java Persistence Query Language), SQL’e benzer bir sorgu dilidir, ancak veritabanı tablolarını ve sütunlarını değil, entity’leri ve alanlarını hedef alır.Native SQL Sorguları
Native SQL sorguları, veritabanına özgü SQL dilini kullanmanıza olanak tanır.Named Parameters
@Query anotasyonu ile tanımlanan sorgularda, :parameterName sözdizimi ile named parameters kullanabilirsiniz.
Positional Parameters
@Query anotasyonu ile tanımlanan sorgularda, ?1, ?2 gibi sözdizimi ile positional parameters kullanabilirsiniz.
Sayfalama ve Sıralama
Spring Data JPA, sayfalama ve sıralama işlemleri içinPageable ve Sort sınıflarını sağlar.
Sayfalama
Sayfalama işlemleri için, repository metodlarınaPageable parametresi ekleyebilirsiniz.
PageRequest sınıfını kullanarak bir Pageable nesnesi oluşturabilirsiniz:
Sıralama
Sıralama işlemleri için, repository metodlarınaSort parametresi ekleyebilirsiniz veya Pageable nesnesine sıralama bilgisi ekleyebilirsiniz.
Sort sınıfını kullanarak bir sıralama nesnesi oluşturabilirsiniz:
Pageable nesnesine sıralama bilgisi ekleyebilirsiniz:
Specification API
Spring Data JPA, dinamik sorgular oluşturmak için Specification API’sini sağlar. Bu API, JPA Criteria API’sini kullanarak, çalışma zamanında dinamik olarak sorgular oluşturmanıza olanak tanır.Specification Arayüzü
Specification arayüzü, bir sorgu kriterini temsil eder ve toPredicate metodunu içerir.
JpaSpecificationExecutor Arayüzü
JpaSpecificationExecutor arayüzü, Specification nesneleri ile sorgu yapmak için metodlar sağlar.