Merhabalar. Önceki yazımızda JDBI ile veritabanına nasıl kayıt girilir onu görmüştük. Bu yazıda ise kayıt çekme işlemini göreceğiz.

Şimdi JDBI ile kayıt çekme işlemini örnekleyelim. Ben önceki yazıda eklediğim Can Kahveci kaydındaki ismi çekmek istiyorum diyelim ki. O kaydın id bilgisi de 1 idi. O zaman PersonOperationsInterface’e şu iki satırı ekliyorum.

@SqlQuery("select name from people where id = :id")
public String selectField(@Bind("id") int id);

Yukarıdaki kodda gördüğümüz gibi selectField metodumuz tablo üzerinde manüpilasyon metodu olmadığı, bir veri çekme işlemi olduğu için @SqlQuery notasyonu ile işaretli. Bu notasyona parametre olarak SQL cümleciğimizi verdik ve yine parametreyi iki nokta ve akabinde ismi şeklinde tanımladık. SQL cümleciğinde tanımlı parametreyi metodun parametre kısmında da @Bind notasyonu ile tanımlıyoruz.

Akabinde sadece try bloğunun içerisini değiştirmek sureti ile kodumuzu çalıştıralım. Kodumuzun yeni hali şöyledir:

package com.ilkaygunel.jdbitutorial.operation;

import com.ilkaygunel.jdbitutorial.pojo.Person;
import com.mysql.cj.jdbc.MysqlDataSource;
import org.skife.jdbi.v2.DBI;

public class SelectOneFieldOperation {
    public static void main(String[] args) {
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        mysqlDataSource.setURL("jdbc:mysql://localhost:3306/JDBIDatabase");
        mysqlDataSource.setUser("root");
        mysqlDataSource.setPassword("");

        DBI dbi = new DBI(mysqlDataSource);

        PersonOperationsInterface personOperationsInterface = null;

        try {
            personOperationsInterface = dbi.open(PersonOperationsInterface.class);
            String name = personOperationsInterface.selectField(1);
            System.out.println("Veritabanından çekilen isim:"+name);
        } catch (Exception e) {
            System.err.println("An Error Occured!\n Error is:" + e);
        } finally {
            if (personOperationsInterface != null) {
                personOperationsInterface.close();
            }
        }
    }
}

Verilen id’ye göre isim çekme işlemini başarı ile yaptı. Peki ben tablodaki bir kaydın tüm sütunlarını çekmek istersem? JDBI bu işlem için öncelikle bir Mapper tanımlanasını şart koşuyor.

Bunun için biz de şöyle bir Mapper yazıyoruz:

package com.ilkaygunel.jdbitutorial.operation;

import com.ilkaygunel.jdbitutorial.pojo.Person;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;

public class PersonMapper implements ResultSetMapper<Person> {

    @Override
    public Person map(int i, ResultSet rs, StatementContext sc) throws SQLException {
        Person person = new Person();
        person.setId(rs.getInt("id"));
        person.setName(rs.getString("name"));
        person.setSurname(rs.getString("surname"));
        person.setCity(rs.getString("city"));

        return person;
    }
}

PersonMapper sınıfımızı ResultSetMapper arabiriminden implemente ediyoruz ve ResultSetMapper sınıfına Person sınıfı kullanacğaımızı söylüyoruz. Sınıf içerisinde map metodunu Override ediyoruz. Override ettiğimiz metot içerisinde bir Person nesnesi oluşturup ResultSet’den gelen bilgilerle dolduruyoruz. Son olarak da döndürüyoruz. Bu ResultSet’in doldurulması işlemine şimdi değineceğim.

PersonOperationsInterface arabirimine şu 3 satır kodu ekliyoruz:

@SqlQuery("select * from people where id = :id")
@Mapper(PersonMapper.class)
public Person selectRecord(@Bind("id") int id);

Az önceki Select’den farklı olarak göreceğiniz üzere @Mapper(PersonMapper.class) ekledik. @Mapper notasyonuna verdiğimiz PersonMapper sınıfı içerisinde map metodu sorgu çalıştırıldığında devreye girecek. Sorguyu çalıştırıp değeri ResultSet’e değeri alacak ardından Person nesnesini doldurup döndürecek.

Select işlemini yapacak kodumuzun yeni hali şöyle:

package com.ilkaygunel.jdbitutorial.operation;

import com.ilkaygunel.jdbitutorial.pojo.Person;
import com.mysql.cj.jdbc.MysqlDataSource;
import org.skife.jdbi.v2.DBI;

public class SelectRecordOperation {
    public static void main(String[] args) {
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        mysqlDataSource.setURL("jdbc:mysql://localhost:3306/JDBIDatabase");
        mysqlDataSource.setUser("root");
        mysqlDataSource.setPassword("");

        DBI dbi = new DBI(mysqlDataSource);

        PersonOperationsInterface personOperationsInterface = null;

        try {
            personOperationsInterface = dbi.open(PersonOperationsInterface.class);
            Person person = personOperationsInterface.selectRecord(1);
            System.out.println("Veritabanından çekilen kayıt:"+person.getName()+" "+person.getSurname()+" "+person.getCity());
        } catch (Exception e) {
            System.err.println("An Error Occured!\n Error is:" + e);
        } finally {
            if (personOperationsInterface != null) {
                personOperationsInterface.close();
            }
        }
    }
}

İlgili kaydı başarı ile çektik.

Son olarak bir de veritabanındaki 4 kaydı birden nasıl çekeceğimize bakalım.

Öncelikle PersonOperationsInterface içerisinde şu 3 satır eklenmesi işlemini gerçekleştiriyorum:

@SqlQuery("select * from people")
@Mapper(PersonMapper.class)
public List<Person> selectAllRecords();

Tek bir Person kaydı çekmek için kullandığımız Mapper’ı aynı şekilde burada da kullanıyoruz. Metodumuza bir liste döndür diyoruz. İşlemi gerçekleştirecek kodumuz şu şekilde:

package com.ilkaygunel.jdbitutorial.operation;

import com.ilkaygunel.jdbitutorial.pojo.Person;
import com.mysql.cj.jdbc.MysqlDataSource;
import java.util.List;
import org.skife.jdbi.v2.DBI;

public class SelectAllRecordsOperation {

    public static void main(String[] args) {
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        mysqlDataSource.setURL("jdbc:mysql://localhost:3306/JDBIDatabase");
        mysqlDataSource.setUser("root");
        mysqlDataSource.setPassword("");

        DBI dbi = new DBI(mysqlDataSource);

        PersonOperationsInterface personOperationsInterface = null;

        try {
            personOperationsInterface = dbi.open(PersonOperationsInterface.class);
            List<Person> personList = personOperationsInterface.selectAllRecords();
            personList.stream().forEach((person) -> {
                System.out.println(person.getId()+" "+person.getName() + " " + person.getSurname() + " " + person.getCity());
            });
        } catch (Exception e) {
            System.err.println("An Error Occured!\n Error is:" + e);
        } finally {
            if (personOperationsInterface != null) {
                personOperationsInterface.close();
            }
        }
    }
}

SelectAllRecordsOperation sınıfı içerisinde try bloğunda Interface içinde tanımlı metodu tetikliyoruz ve listeyi doldurup ekrana yazdırıyoruz. Konsol çıktısı şu şekilde:

Bu yazıda anlatacaklarım da bu kadar arkadaşlar. JDBI ile kayıt çekme işlemini öğrenmiş olduk. Gelecek yazıda kayıt güncelleme konusuna değineceğiz.

Görüşmek üzere.

Selam ve Sevgilerimle