Spring Boot Repository, Spring Boot projelerinde veri tabanı işlemlerini gerçekleştirmek için kullanılan arayüzlere verilen genel bir isimdir. Spring Boot’un sağladığı bu yapı ile veri tabanı işlemlerini kolaylaştırmak için Spring Data JPA veya diğer veri tabanı teknolojileriyle birlikte kullanılır.
Spring Boot Repository genellikle JpaRepository arayüzü ile temsil edilir. JPA Repository içerisinde sorgu metotları bulunur. Genellikle CRUD (Create, Read, Update, Delete) işlemlerini gerçekleştirmek için kullanılan bir arayüzdür. Bu arayüz, veritabanı işlemlerini gerçekleştirmek için bir dizi hazır metot sağlar ve bu sayede biz geliştiricilerin veritabanı işlemlerini kolay ve hızlıca yapmamızı sağlar. Ayrıca istersek kendi özel sorgularımızı oluşturmamıza da olanak tanır.
Özetle Spring Boot Repository’nin temel amacı, veri tabanı işlemlerini gerçekleştirmek için geliştiricilere kolaylık sağlaması ve bizlere zaman kazandırması. Şimdi Repository oluşturmaya başlayalım;

Repository’nin bir arayüz olduğundan bahsetmiştik. Bu yüzden bir Java arayüzü ooluşturuyoruz. Bu arayüz Spring Data JPA tarafından sağlanan JpaRepository‘i miras alacak. Biz istersek CrudRepository‘de kullanabiliriz fakat Jpa, Crud a göre daha gelişmiş bir yapıdır. CrudRepository yalnızca temel CRUD operasyonlarını bize sağlarken JpaRepository, JPA nın özelliklerini tam olarak kullanmamıza olanak sağlar.
Görüldüğü üzere bu arayüz bir entity class ve ilgili entity class a ait id türünü almalıdır. Bu bağlamda bizim Product class ı ve Long tipini almalı.
public interface ProductRepository extends JpaRepository<Product,Long> {
}Sonuç olarak elimizde çeşitli veritabanı işlemlerini gerçekleştirebileceğimiz, uzun uzun kodlar yerine JpaRepository yapısı oluşmuş oldu. Bu hali ile şimdilik bizim için yeterlidir.
Normal şartlarda PreparedStatement dediğimiz JDBC yapıları vardır. Çok can sıkıcı bir yapıdır. Bir sürü sorgular atarız, join işlemleri yaparız ve bu sorguları tek tek yazarız. Bu, hem zaman alıcı hem de hata yapmaya çok açık bir süreçti. Doğrudan Hibernate gibi ORM araçlarını kullanmak yine mümkündü fakat bu biraz zordu ve beraberinde karmaşıklıklarla geliyordu. Spring Framework ve özellikle Spring Boot, bu tür veritabanı işlemlerini büyük ölçüde kolaylaştırmış oldu ve çok güzel bir hal almış oldu.
Şimdi basit bir Servis ve Controller class’ları oluşturup test edelim;
@RequiredArgsConstructor
@Service
public class ProductService {
private final ProductRepository productRepository;
public Product saveProduct(Product product) {
return productRepository.save(product);
}
public void deleteProduct(Long İd) {
productRepository.deleteById(İd);
}
public List<Product> getAllProducts() {
return productRepository.findAll();
}
}Bu Servis sınıfımız ProductRepositry‘i kullanarak basit bir şekilde veriyi kaydediyor, var olan veriyi siliyor ve mevcut verileri listeliyor. JpaRepositry bizim için gerekli sorguları kendisi oluşturacak ve bu basit işlemleri gerçekleştirecek. Şimdi bu Servis sınıfını detaylı inceleyelim;
/*
Lombok kütüphanesini kullanarak konuya odaklanarak ilerlemek istediğimden dolayı
@RequiredArgsConstructor ile final alanlara sahip bir constructer oluşturuyoruz.
Bu, Spring tarafından otomatik olarak ProductService sınıfını enject edebilir.
*/
@RequiredArgsConstructor
/*
Spring uygulamarında Servis sınıflarınıt tanımlamak için bu notasyon kullanılır.
Bu notasyon ile Spring' e şunu demiş oluyoruz; Spring Container, bu sınıfı hizmet olarak tanı!
*/
@Service
public class ProductService {
private final ProductRepository productRepository;
/*
Metot içeriğine baktığımzıda, dışarıdan bir entity (ürünü) alıyor.
Gelen ürünü kaydediyor ve kaydedilen ürünü geri döndürüyor.
Save metodu içeriğine bakarak daha fazla bilgi edinebilirsiniz.
*/
public Product saveProduct(Product product) {
return productRepository.save(product);
}
/*
Veritabanındaki belirli bir ürünü ProductRepository aracılığıyla
id bilgisine göre siler.
*/
public void deleteProduct(Long İd) {
productRepository.deleteById(İd);
}
/*
Aynı şekilde findAll metod içeriğine baktığımızda, return oalrak bize tüm entityleri
List olarak dönüyor.
*/
public List<Product> getAllProducts() {
return productRepository.findAll();
}
}Mevcut durumda bu servis sınıfını, uygulamamızın herhangi bir yerinde kullanabilmekteyiz. O halde bir Controller sınıfı oluşturarak bu servise ait metotları çağıralım ve detaylı inceleyelim;
@RequiredArgsConstructor
/*
Spring framework'ün RESTful servisler için kullanılan bir controller olduğunu
belirtmek için @RestController notasyonunu kullandık.
Bu sınıfın RESTful servisler sunacağını ve HTTP isteklerine yanıt vereceğini belirtir.
*/
@RestController
/*
Bu notasyon ile ise bu controller ın bir URL altında erişilebileceğini ve
'/products' URL inde bulunacağını belirtir.
*/
@RequestMapping("/products")
public class ProductController {
private final ProductService productService;
/*
HTTP POST isteği ile ürün oluşturuyoruz. Gelen ürünü repositoryServis ile
kaydediyoruz.
*/
@PostMapping
public ResponseEntity<Product> createProduct(@RequestBody Product product) {
Product saveProduct = productService.saveProduct(product);
return ResponseEntity.ok(saveProduct);
}
/*
Veritabanında bulunan belirli bir id ürünü id bilgisine göre yine repositoryServis
sayesinde HTTP DELETE isteğiyle silmiş oluyoruz.
Silme işkemi sonrası 204 No Content yanıtını dönüyoruz.
(org.springframework.http.HttpStatus enum sınıfına göz gezdirebilirsiniz)
*/
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteProduct(@PathVariable Long id) {
productService.deleteProduct(id);
return ResponseEntity.noContent().build();
}
/*
Veritabanında bulunan tüm ürünleri GET isteiği ile listelemeyi sağlıyoruz.
dönen ürünleri json formatında HTTP yanıtı olarak oluşturacaktır.
*/
@GetMapping
public ResponseEntity<List<Product>> getAllProducts() {
List<Product> products = productService.getAllProducts();
return ResponseEntity.ok(products);
}
}Sonuç olarak basit operasyonlarımızı gerçekleştirmek üzere servis ve controller sınıflarına sahip olmuş olduk. Şimdi test etmek amacıyla projemizi başlatalım. Sonrasında tarayıcımızdan veya Postman ile http://localhost:port/products basit operasyonları bir test edelim;

Verileri listelemek istediğimde konsolda görüldüğü üzere Hibernate basit sql sorgusunu oluşturdu. Henüz herhangi bir veri olmadığı için bir veri gelmedi fakat 200 OK statu bilgisini görmekteyiz. Şimdi bir veri oluşturalım;

Hibernate’in arka planda yaptığı SQL sorgusunu, save işleminin sonrası 200 OK statüsünü ve geriye kayıt sonrası ürünü bize geri döndürdüğünü görüyoruz. Veri tabanına da bir bakalım;

Delete işlemini ve Update işlevselliğini ise sizlere bırakıyorum.
Bu yazımda, bir Spring Boot uygulamasında CRUD (Create, Read, Update, Delete) işlemlerini gerçekleştirmek için gerekli olan temel bileşenlerden bazılarını oluşturduk. Bunlar arasında;
- Bir Entity sınıfı olan Product oluşturduk.
- ProductRepository interface’ini oluşturduk ve JpaRepository‘yi genişleterek bu repository üzerinden CRUD işlemlerini yapabileceğimiz metotları ekledik.
- ProductService sınıfını oluşturduk ve bu sınıfın içinde ProductRepository‘yi kullanarak CRUD işlemlerini gerçekleştirecek metotları tanımladık.
- Bir ProductController sınıfı oluşturduk ve bu controller sınıfında ProductService‘yi enjekte ederek RESTful API endpoint’leri tanımladık. Bu endpoint’ler sayesinde HTTP istekleri ile CRUD işlemlerini gerçekleştirdik.
Son olarak, bu işlemlerin ardından Spring Boot uygulamamızı çalıştırdık ve yeni ürün oluşturma, ürünleri listeleme ve ürün silme gibi temel CRUD işlemlerini gerçekleştirdik.
Sorularınız için yorum bırakabilir veya buraya tıklayarak benimle iletişime geçebilirsiniz.
İyi çalışmalar dilerim.