Skip to main content

🧩 Java ResultSet Rehberi: Veritabanı Sorgu Sonuçlarını Yönetme


📘 Bu Rehberde Ne Öğreneceksiniz?

Bu rehberde, Java JDBC çatısının temelini oluşturan java.sql.ResultSet arayüzünü detaylıca öğreneceksiniz.
ResultSet nesnesi; veritabanı sorgularının sonuçlarını okumak, kayıtlar arasında gezinmek ve veriyi güncellemek için kullanılır.
Ayrıca farklı ResultSet tiplerini (TYPE_SCROLL_INSENSITIVE vb.) ve eşzamanlılık modlarını (CONCUR_UPDATABLE vb.) de tanıyacaksınız.


🧠 Aşama 1 – Teknik Özet

KategoriAçıklama
Ana Teknik KonuJava JDBC ResultSet Arayüzü
Çözülen ProblemSorgu sonuçlarını programatik olarak işleme, gezinme ve güncelleme
Kullanıcı AdımlarıJDBC bağlantısı → Sorgu çalıştırma → ResultSet alma → Satırlarda gezinme → Veriyi okuma/güncelleme
Teknik ÖzetResultSet, JDBC'nin temel bileşenidir. Veriyi satır bazında okur, imleç ile kontrol sağlar ve okuma/güncelleme işlemlerine olanak tanır.

⚙️ ResultSet Nasıl Çalışır?

ResultSet, veritabanı sorgusundan dönen kayıtlar üzerinde imleç (cursor) mantığıyla çalışır.
İmleç başlangıçta ilk satırdan önce konumlanır. next() metodu çağrıldığında bir sonraki satıra ilerler ve oradaki veriler getString(), getInt() gibi getter metotlarıyla okunur.


💻 Adım Adım ResultSet Kullanımı

1️⃣ Veritabanı Hazırlığı (MySQL Örneği)

CREATE DATABASE rabisu_db;
USE rabisu_db;

CREATE TABLE personel (
personel_id INT PRIMARY KEY,
ad VARCHAR(32),
soyad VARCHAR(32),
dogum_tarihi DATE
);

INSERT INTO personel VALUES (1, 'Ali', 'Yilmaz', '1998-11-11');
INSERT INTO personel VALUES (2, 'Veli', 'Can', '1988-10-22');
INSERT INTO personel VALUES (3, 'Ayse', 'Kara', '1999-05-11');

💡 Bu SQL komutları örnek bir personel tablosu oluşturur.


2️⃣ JDBC Bağlantısı ve Sorgu İşlemi


package com.rabisu.db;

import java.sql.*;

public class ResultSetDemo {
public static void main(String[] args) {
String sorgu = "SELECT personel_id, ad, soyad, dogum_tarihi FROM personel";
try (Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/rabisu_db", "root", "rabisu_sifre");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sorgu)) {

while (rs.next()) {
int id = rs.getInt("personel_id");
String ad = rs.getString("ad");
String soyad = rs.getString("soyad");
Date dogum = rs.getDate("dogum_tarihi");
System.out.printf("ID:%d | Ad:%s | Soyad:%s | Doğum:%s%n", id, ad, soyad, dogum);
}

} catch (SQLException e) {
e.printStackTrace();
}
}
}

💡 Bu örnek, veritabanındaki tüm kayıtları konsola yazdırır.


🔄 ResultSet Türleri ve Eşzamanlılık Modları

TürAçıklama
TYPE_FORWARD_ONLYSadece ileri yönde gezinilebilir. Varsayılan türdür.
TYPE_SCROLL_INSENSITIVEİleri-geri hareket eder; veritabanı değişikliklerini yansıtmaz.
TYPE_SCROLL_SENSITIVEHem ileri hem geri kaydırılabilir; veritabanı değişikliklerini yansıtır.
EşzamanlılıkAçıklama
CONCUR_READ_ONLYYalnızca veri okuma yapılabilir.
CONCUR_UPDATABLESatır verileri bellekte güncellenebilir ve updateRow() ile veritabanına yansıtılır.

🧭 Önemli ResultSet Metotları

KategoriÖrnekAçıklama
Gezinme (Navigational)next(), previous(), absolute()İmleci belirli bir satıra taşır.
Okuma (Getter)getString(), getInt(), getDate()Geçerli satırdan veri okur.
Güncelleme (Updater)updateString(), updateInt(), updateRow()Bellekteki veriyi değiştirir, updateRow() ile kalıcı hale getirir.
Diğer (Misc.)close(), getMetaData()Kaynakları kapatır ve tablo meta verisini döndürür.

✍️ Satır Güncelleme Örneği


Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT * FROM personel");

if (rs.absolute(2)) {
System.out.println("Mevcut isim: " + rs.getString("ad"));
rs.updateString("ad", "Hasan");
rs.updateRow();
}

💡 Bu kod, ikinci satırdaki “ad” değerini “Hasan” olarak günceller.


💡 Dikkat Edilmesi Gereken Noktalar

💡 Durum🧾 Açıklama
Kaynak YönetimiResultSet ve Statement kapatılmazsa kaynak sızıntısı oluşur.
next() KontrolüSonuç bittiğinde next() false döndürür.
Index vs NameKolonlara hem indeks hem isimle erişilebilir.
PerformansGereksiz ResultSet kopyalarından kaçının.
Bağlantı KapanmasıConnection kapandığında bağlı ResultSet geçersiz olur.

❓ Sıkça Sorulan Sorular (SSS)

  1. ResultSet neden kapatılmalı?

Açık bırakılan ResultSet nesneleri, veritabanı kaynaklarını tüketir ve performansı düşürür.

  1. Kolon verisini almak için ne kullanılır?

İstersen indeks (rs.getInt(1)), istersen kolon adı (rs.getInt("personel_id")) kullanabilirsin.

  1. Güncelleme işlemi nasıl tamamlanır?

updateString() gibi metotlar belleği günceller. updateRow() çağrısı veritabanına yansıtır.

  1. TYPE_FORWARD_ONLY ne işe yarar?

İmleç yalnızca ileri gider; geriye dönmek veya belirli satıra atlamak mümkün değildir.

  1. ResultSet hangi nesnelerden elde edilir?

Statement, PreparedStatement ve CallableStatement nesneleriyle oluşturulabilir.


🏁 Sonuç

ResultSet, JDBC'nin en temel bileşenlerinden biridir. Sorgu sonuçlarını satır satır okumayı, gerektiğinde güncellemeyi ve bellek yönetimini anlamak, veritabanı uygulamalarında büyük önem taşır. Bu örnekleri Rabisu Bulut platformunda kuracağınız kendi veritabanı sunucusunda hemen deneyebilirsiniz 🚀