Spring Framework’ün sunduğu bir çok özellik arasında bulanan bir modülde Spring Data JPA’dır. JPA, Java Persistence Api’nin kısaltması olup Java uygulamarında ilişkisel veriler için geliştirilmiş bir kütüphanedir. Bu yazımızda Spring ile veritabanı işlemlerine değineceğiz.
Bağımlıklıklarımızı Tanımlayalım
Bu projede ki bağımlılıklarımız Spring Web, Data JPA ve H2 Database olacak. Burada veritabanımızı H2 ile kullanacağız. Bunu seçmemizin nedeni ise H2’nin bellek üzerinde veri depolaması ve ekstra bir kuruluma ihtiyaç duymamasından kaynaklanıyor.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.0</version> <relativePath/> </parent> <groupId>com.codingbytime</groupId> <artifactId>mysql</artifactId> <version>0.0.1-SNAPSHOT</version> <name>mysql</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Entity Tanımlayalım
Entity’ler veritabanımızda tutacağımız tablolarımıza denk gelmektedir. Java’da tanımlayacağımız sınıfları @Entity olarak işaretleyerek bunları veritabanında bir tablo altında bu türden verileri saklamak istediğimizi belirtiriz. Şimdi bir Car sınıfı tanımlayalım. Getter ve Setter tanımlamalarını unutmayınız. Sınıfımız bu şekilde olacak:
@Entity public class Car { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String model; private String brand; private int year; private int price; }
Repository Tanımlayalım
Repository’ler interface olup entity yapılarımızın veritabanına kaydedilmesi için kullanılan çatılardır. Repo adında yeni bir package oluşturalım ve burada CarRepository isminde bir interface tanımlayalım:
@Repository public interface CarRepository extends JpaRepository<Car, Long> { }
Burada JpaRepository interface’ni extend ederek burada ki metodları kullanmak istediğimizi belirttik. Bunun haricinde bir çok repository interface’i de bulunmaktadır. Ancak biz temek yapıları kullanacağız.
Controller Tanımlayalım
Yeni bir Car oluşturmak, Caryı silmek ve veritabanında ki tüm Carları listelemek için CarController sınıfımızı oluşturalım:
@RestController @RequestMapping("/cars") public class CarController { private final CarRepository carRepository; @Autowired public CarController(CarRepository carRepository) { this.carRepository = carRepository; } @GetMapping private List<Car> CarList() { return carRepository.findAll(); } @PostMapping private Car carList(@RequestParam String model, @RequestParam String brand, @RequestParam int year, @RequestParam int price) { Car Car = new Car(model, brand, year, price); return carRepository.save(Car); } @DeleteMapping("/{id}") private boolean carList(@PathVariable Long id) { if (carRepository.findById(id).isPresent()) { carRepository.deleteById(id); return true; } return false; } }
Kodumuzu Test Edelim
- http://localhost:8080/?model=5.20&brand=bmw&year=2000&price=54321
{ "id":1, "model":"5.20", "brand":"bmw", "year":2000, "price":54321 }
- http://localhost:8080/
[ { "id":1, "model":"5.20", "brand":"bmw", "year":2000, "price":54321 }, { "id":2, "model":"symbol", "brand":"renault", "year":2000, "price":54321 } ]
- http://localhost:8080/1
true
Sonuç
Spring ile veritabanına yeni kayıt atma, mevcut kaydı silme ve kayıtları listelemek için basit bir yapı oluşturduk. Burada yapılan sorgular en basit derecede yapıldığından daha ileri düzel bilgiler için Spring Framework’ün websitesinde bulunan tutorial’lara göz atabilirsiniz.