"Enter"a basıp içeriğe geçin

Spring Boot 2.x ile backend -3

Bu yazımızda Spring Boot ile ilişkisel veritabanı (Relational Database) üzerinde veri yönetimini, JPA (Java Persistent API) temelleri ve olanaklarını, ORM (Object Relational Mapping) kavramını ve Spring ile birlikte default JPA implementasyonu olan Hibernate’i anlatmaya çalışacağım.

Temel kavramlar

Object Relatioanl Mapping (ORM), kullanıcıları ürün spesifik SQL yapılarından ve veri yönetiminden soyutlayan, veri işlemlerinde, nesne yönelimli programlama (object oriented programming) paradigmasının kullanımına olanak sağlayan bir tekniktir.

Java Persistent API (JPA), Java geliştiricileri için, veri yapısının (tablolar, kolonlar vs.) Java sınıfları içerisinde standart java notasyonları ve anotasyonlar ile tanımlanmasına olanak sağlayan bir Object Relatioanl Mapping’tir.

Hibernate ise en popüler Java tabanlı JPA implementasyonudur ve Spring Boot içerisinde varsayılan olarak kullanılmakla birlikte, küçük ölçekten, çok büyük ölçekli projelere kadar yaygın bir şekilde kullanılan olgun bir teknolojidir.

In Memory Database ekleme

İlişkisel bir veritabanı ile çalışacaksak öncelikle oluşturduğumuz Entity sınıflarını, veya operasyonları test edebileceğimiz basit bir ortam işimize çok yarayacaktır. Bu ihtiyaçlar için H2 in-memory database‘i kullanabiliriz. H2 tüm uygulama sunucusu üzerinden uygulama ayağa kalkarken oluşturulup, sunucu kapatıldığında resetlenen, tüm ilişkisel veritabanı özelliklerini kullanabileceğimiz, basit web konsolu ile veri işlemlerini kontrol edebileceğimiz bir yapı sunar. Projemizde H2 veritabanı kullanmak için öncelikle pom.xml dosyamıza aşağıdaki bağımlılığı eklememiz gerekmektedir.

<dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <scope>runtime</scope>
 </dependency>

Entity sınıfları oluşturma

Entity sınıfları, @entity anotasyonu ile oluşturulmuş basit Java sınıflarıdır ve standart JavaBean isimlendirme kurallarını kullanır, uygun şekilde oluşturulmuş getter ve setter metodları bulunur. Bu sınıflar içerisindeki parametreler private olarak tanımlanır. JPA, uygulama ayağa kalkarken veritabanı tablolarını, Entity sınıf isimlerini kullanarak oluşturur. (Farklı bir isim vermek istiyorsak, @table anotasyonunu kullanabiliriz). Entity sınıfımızı oluşturmadan önce pom.xml dosyası içerisine aşağıdaki bağımlılığı tanımlamalıyız;

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Entity sınıflarımızı oluşturmadan önce ana paketin altında .modeladında yeni bir paket oluşturuyoruz.

Bu paket altına entity sınıflarımızı oluşturacağız. İlk olarak temel veri tiplerinini anlamak açısından bir “subscriber” yapısı oluşturalım, her subscriber’ın ID, isim-soyisim, doğum yılı, cinsiyet ve yaş bilgilerini tutacağımızı düşünelim.

Primary Key olan alan için @Id anotasyonunu kullanıyoruz, aynı zamanda @GeneratedValue anotasyonu, bu alanın eritabanı tarafından otomatik olarak oluşturulacağını belirtir. (strategy=GenerationType.AUTO) ifadesi ise kullanılacak veritabanı için tanımlanmış varsayılan değer üretim stratejisinin kullanılacağını ifade eder. (kombine primary key oluşturma ihityacı durumunda @Id anotasyonu diğer alanlar için de kullanılır).

Kolon isimleri, entity sınıfı içerisindeki parametre isimleri olarak oluşturulur, eğer farklı bir isim kullanmak istiyorsak @Column anotasyonunu kullanmamız gerekir;

Parametreleri tanımladıktan sonra constructor (kurucu) ve getter, setter metodlarını oluşturmamız gerekir, (id değeri otomatik olarak üretileceği için constructor içerisinde tanımlanmasına gerek yoktur). Entity sınıfımızın son hali aşağıdaki gibi olacaktır;

package com.my.mybackend.com.my.backend.model;

import javax.persistence.*;

@Entity
public class Subscriber {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;
    private String name;
    private String surname;
    private int birthYear;
    private String gender;
    private int age;
    @Column(name="desc", nullable=true, length=512)
    private String description;

    public Subscriber (){

    }

    public Subscriber(String name, String surname, int birthYear, String gender, int age, String description) {
        this.name = name;
        this.surname = surname;
        this.birthYear = birthYear;
        this.gender = gender;
        this.age = age;
        this.description = description;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public int getBirthYear() {
        return birthYear;
    }

    public void setBirthYear(int birthYear) {
        this.birthYear = birthYear;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

Veritabanı üzerinde tabloların otomatik oluşturulması

Uygulamamızı çalıştırmadan önce, tabloların Create Scriptleri’ni görüntülemek ve oluşan tabloları H2 konsol üzerinden kontrol edebilmek için application.properties dosyası içerisine aşağıdaki tanımlamaları yapmamız gerekir;

spring.jpa.show-sql=true

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

H2 konsoluna; localhost:8080/h2-console URL’ini kullanarak erişebiliriz, JDBC URL olarak jdbc:h2:mem:testdb ve password alanını boş geçerek bağlanabiliriz.

Konsola bağlandığımızda oluşturduğumuz Entity’e karşılık oluşan tabloyu görebiliriz.