Herkese merhaba 😎 Bugün ki yazımda öncelikle bazı kavramlar hakkında bilgiler verip bu kavramları bir spring boot uygulamasında kullanımını göstermeye çalışacağım. İyi okumalar 📒
JPA
JPA, (Java Persistence API) Java dilinde nesne-tablo eşleştirmesi (Object-Relational Mapping — ORM) işlemlerini yapmayı kolaylaştıran bir API’dir.
DTO (Data Transfer Object)
DTO (Data Transfer Object), veri transferi amacıyla kullanılan bir tasarım desenidir ve genellikle yazılım uygulamalarının farklı katmanları veya bileşenleri arasında veri taşımak için kullanılır. DTO’lar, verilerin tutarlılığını sağlamak, gereksiz veri aktarımını önlemek ve veri bütünlüğünü korumak için kullanılabilir.
DAO (Data Access Object)
Bir yazılım uygulamasında veritabanı veya diğer veri kaynaklarına erişimi sağlayan bir tasarım desenidir. DAO ile diğer katmanlar etkilenmeden veritabanı ve bilgi bankası değiştirilebilir. Aslında DAO’lar için metotları tek tek el ile de yazabiliriz fakat yukarıda tanımını verdiğim JPA bizim kahramanımız olarak işe el atıyor.
Şimdi geçelim bu kavramları kullanarak bir uygulama yapmaya.
Burada öncelikle spring boot projesi generate edelim.
Eklenen 4 dependency hakkında ara bir bilgi verecek olursak.
Spring Web ->Tomcat, Restful gibi destekleri var. Bu da web üzerinden işlemlerimizi rahatlatıyor.
Spring Boot DevTools -> Kod yazarken çalıştırdık diyelim, bu dependency sayesinde çalışırken bir değişiklik yaptığımız zaman kodu durdurup tekrar çalıştırmaya gerek kalmadan otomatik olarak refresh ediyor ve yaptığımız değişiklik rahatça görülebiliyor.
Spring Data JPA -> DAO işlemlerinde işimizi kolaylaştıracak JPA kullanmak için gereklidir.
MySQL Driver -> MySQL bağlantısı yapmamız için gerekli bir dependency
Generate ettiğimiz projemizi idemizde açalım ve application.properties içine veritabanı işlemlerimizi ekleyelim.
spring.datasource.url=jdbc:mysql://localhost:3306/person
spring.datasource.username=root
spring.datasource.password=123456
Şimdi bir entity sınıfı oluşturalım.
Veritabanında tutulacak verileri temsil eden sınıftır.
Getters and setters eklemeyi unutmayalım…
Bunun için isterseniz lombok dependency kullanabilirsiniz.
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int age;
// Getters and setters
}
Şimdi Person
entity için bir JPA Repository arayüzü oluşturalım. Spring Data JPA; CRUD işlemleri için otomatik olarak implementasyonlar sağlar:
public interface PersonRepository extends JpaRepository<Person, Long> {
}
JPA Repository’yi kullanarak veri erişim katmanını (DAO) oluşturalım. Bu sınıf, Person
entity ile ilgili özel işlemleri içerir:
public class PersonDao {
@Autowired
private PersonRepository personRepository;
public List<Person> findAll() {
return personRepository.findAll();
}
public Person save(Person person) {
return personRepository.save(person);
}
public void delete(Person person) {
personRepository.delete(person);
}
}
DTO Sınıfı:
Verileri API’ye taşımak için bir Data Transfer Object (DTO) sınıfı oluşturalım. Bu sınıf, Person
entity'den farklı alanlara sahip olabilir:
public class PersonDto {
private Long id;
private String name;
// Getters and setters
}
Service Sınıfı:
İşlemleri daha organize hale getirmek için bir Service sınıfı oluşturalım. Bu sınıf, DAO katmanını kullanarak iş mantığını içerir:
public class PersonService {
@Autowired
private PersonDao personDao;
public List<PersonDto> getAllPersons() {
List<Person> persons = personDao.findAll();
List<PersonDto> personDtos = new ArrayList<>();
for (Person person : persons) {
PersonDto personDto = new PersonDto();
personDto.setId(person.getId());
personDto.setName(person.getName());
personDtos.add(personDto);
}
return personDtos;
}
public Person savePerson(PersonDto personDto) {
Person person = new Person();
person.setName(personDto.getName());
return personDao.save(person);
}
public void deletePerson(Long id) {
personDao.delete(personDao.findById(id).get());
}
}
Controller Sınıfı:
HTTP isteklerini işlemek için bir Controller sınıfı oluşturalım. Bu sınıf, Service katmanını kullanarak API endpoints tanımlar:
@RestController
public class PersonController {
@Autowired
private PersonService personService;
@GetMapping("/persons")
public List<PersonDto> getAllPersons() {
return personService.getAllPersons();
}
@PostMapping("/persons")
public Person savePerson(@RequestBody PersonDto personDto) {
return personService.savePerson(personDto);
}
@DeleteMapping("/persons/{id}")
public void deletePerson(@PathVariable Long id) {
return personService.deletePerson(id);
}
}
Burada postmanden gerekli isteklerimizi attığımızda çalıştığını görebilirsiniz.