🧩 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
| Kategori | Açıklama |
|---|---|
| Ana Teknik Konu | Java JDBC ResultSet Arayüzü |
| Çözülen Problem | Sorgu 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 Özet | ResultSet, 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ür | Açıklama |
|---|---|
| TYPE_FORWARD_ONLY | Sadece ileri yönde gezinilebilir. Varsayılan türdür. |
| TYPE_SCROLL_INSENSITIVE | İleri-geri hareket eder; veritabanı değişikliklerini yansıtmaz. |
| TYPE_SCROLL_SENSITIVE | Hem ileri hem geri kaydırılabilir; veritabanı değişikliklerini yansıtır. |
| Eşzamanlılık | Açıklama |
|---|---|
| CONCUR_READ_ONLY | Yalnızca veri okuma yapılabilir. |
| CONCUR_UPDATABLE | Satır verileri bellekte güncellenebilir ve updateRow() ile veritabanına yansıtılır. |
🧭 Önemli ResultSet Metotları
| Kategori | Örnek | Açı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önetimi | ResultSet ve Statement kapatılmazsa kaynak sızıntısı oluşur. |
| next() Kontrolü | Sonuç bittiğinde next() false döndürür. |
| Index vs Name | Kolonlara hem indeks hem isimle erişilebilir. |
| Performans | Gereksiz ResultSet kopyalarından kaçının. |
| Bağlantı Kapanması | Connection kapandığında bağlı ResultSet geçersiz olur. |
❓ Sıkça Sorulan Sorular (SSS)
- ResultSet neden kapatılmalı?
Açık bırakılan ResultSet nesneleri, veritabanı kaynaklarını tüketir ve performansı düşürür.
- Kolon verisini almak için ne kullanılır?
İstersen indeks (rs.getInt(1)), istersen kolon adı (rs.getInt("personel_id")) kullanabilirsin.
- Güncelleme işlemi nasıl tamamlanır?
updateString() gibi metotlar belleği günceller. updateRow() çağrısı veritabanına yansıtır.
- 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.
- 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 🚀