İçeriğe geç

Menü

Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Java JDBC ile Veritabanına Bağlanma Nasıl Yapılır? İlk Sorgu

java-jdbc-ile-veritabanina-baglanma-nasil-yapilir-ilk-sorgu
Bu yazıda neler var?
  1. JDBC ile veritabanına bağlanma akışı nedir?
  2. Sürücü ve bağlantı ayarları nasıl hazırlanır?
  3. Parametreli ilk SELECT sorgusu nasıl yazılır?
  4. Kodda kaynaklar ve SQLException nasıl yönetilir?
  5. JDBC sorunları dört katmanda nasıl teşhis edilir?
  6. Uygulama kontrol listesinde neler bulunmalı?

Java JDBC ile veritabanına bağlanma işlemi için önce veritabanına uygun JDBC sürücüsünü proje bağımlılıklarına ekler ve bağlantı ayarlarını hazırlarsın. Ardından DriverManager.getConnection ile bir Connection alır, parametreli SQL sorgusunu PreparedStatement üzerinden çalıştırır ve dönen satırları ResultSet ile okursun.

Bağlantı bilgilerini ortam değişkenlerinden almak, parolanın kaynak koda gömülmesini engeller. Açılan JDBC kaynaklarını try-with-resources ile yönetmek ise iş tamamlandığında kapatılmalarını sağlar.

JDBC ile veritabanına bağlanma akışı nedir?

JDBC, Java kodu ile ilişkisel veritabanı arasındaki iletişimi ortak arayüzler üzerinden kurar. Veritabanı üreticisine göre sürücü ve bağlantı adresi değişse de temel çalışma sırası aynıdır: bağlantıyı aç, sorguyu hazırla, parametreleri bağla, sorguyu çalıştır ve sonucu oku.

Connection, veritabanıyla kurulan açık oturumu temsil eder. SQL ifadeleri bu bağlantı üzerinden oluşturulur ve işlem yönetimi gibi bağlantıya bağlı ayarlar burada uygulanır.

PreparedStatement, çalıştırılacak SQL ifadesini ve bu ifadeye bağlanacak parametreleri yönetir. Kullanıcıdan veya uygulamadan gelen değerleri SQL metniyle birleştirmek yerine ? yer tutucularına bağlamanı sağlar. Bir SELECT sorgusu çalıştırıldığında oluşan ResultSet ise dönen satırlar üzerinde ilerleyen sonuç nesnesidir. next() metodu her çağrıda imleci sıradaki satıra taşır.

JDBC'de önce bağlantıyı, sonra sorguyu, sonra sonucu yönet; her kaynak için kapanma sorumluluğunu açıkça belirle. Bu sıra, kodun hangi aşamada hata verdiğini görmeyi ve kaynak yaşam döngüsünü takip etmeyi kolaylaştırır.

Sürücü ve bağlantı ayarları nasıl hazırlanır?

Sürücü ve bağlantı ayarları nasıl hazırlanır?

JDBC arayüzleri Java ile birlikte gelir, ancak seçtiğin veritabanıyla iletişim kuracak sürücünün projeye ayrıca eklenmesi gerekir. Bu bölümde somut bir kurulum göstermek için PostgreSQL kullanılıyor. Aynı temel akış başka bir veritabanında da geçerlidir, fakat bağımlılık koordinatları ve JDBC URL biçimi üreticiye göre değişir.

1 Ekim 2026 itibarıyla resmî pgJDBC indirme sayfası, yayımlanan sürüm olarak 42.7.13 numarasını listeler. Maven projesinde sürücüyü org.postgresql:postgresql koordinatlarıyla ekleyebilirsin.

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.7.13</version>
</dependency>

Bağımlılık eklendiğinde sürücü JAR dosyası çalışma zamanı sınıf yoluna alınır. pgJDBC, Java Service Provider mekanizmasını desteklediği için bağlantı kurulurken sürücü JVM tarafından yüklenir ve ayrıca Class.forName("org.postgresql.Driver") çağrısı yapman gerekmez.

PostgreSQL için açık bir JDBC URL şu biçimdedir: jdbc:postgresql://sunucu:port/veritabani. Örneğin jdbc:postgresql://localhost:5432/kutuphane adresinde localhost sunucuyu, 5432 portu, kutuphane ise bağlanılacak veritabanını belirtir.

Çalıştırma yapılandırmanda DB_URL, DB_USER ve DB_PASSWORD ortam değişkenlerini tanımladıktan sonra bağlantıyı şöyle kontrol edebilirsin:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class BaglantiKontrolu {
    public static void main(String[] args) throws SQLException {
        String url = System.getenv("DB_URL");
        String user = System.getenv("DB_USER");
        String password = System.getenv("DB_PASSWORD");

        if (url == null || user == null || password == null) {
            throw new IllegalStateException(
                "DB_URL, DB_USER ve DB_PASSWORD tanımlanmalıdır."
            );
        }

        try (Connection connection =
                 DriverManager.getConnection(url, user, password)) {
            System.out.println("Bağlantı kuruldu.");
        }
    }
}

Veritabanı çalışıyor, kullanıcı bilgileri doğru ve ağ erişimi açıksa beklenen çıktı şöyledir:

Bağlantı kuruldu.

Bu aşama yalnızca bağlantıyı sınar. Bağlantı başarıyla kurulduktan sonra aynı Connection üzerinden PreparedStatement oluşturularak ilk parametreli sorgu çalıştırılabilir.

Parametreli ilk SELECT sorgusu nasıl yazılır?

JDBC ile ilk SELECT sorgusu için önce sürücü bağımlılığı ve bağlantı ayarları hazır olmalıdır. Ardından DriverManager.getConnection ile Connection açılır, PreparedStatement sabit SQL içindeki parametreyi bağlar ve ResultSet dönen satırları okur.

Aşağıdaki örnekte ogrenci tablosunda id, ad ve sinif sütunları bulunur. Varsayılan kayıtlar 1, Ada, 10-A, 2, Mert, 11-B ve 3, Deniz, 10-A şeklindedir. Veritabanı adresi, kullanıcı adı ve parola ortam değişkenlerinden alınır; parola kaynak kodda tutulmaz.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class IlkJdbcSorgu {
    public static void main(String[] args) {
        String url = requiredEnv("DB_URL");
        String user = requiredEnv("DB_USER");
        String password = requiredEnv("DB_PASSWORD");
        String sinif = "10-A";

        String sql = "SELECT id, ad, sinif FROM ogrenci WHERE sinif = ?";

        try (Connection connection =
                     DriverManager.getConnection(url, user, password);
             PreparedStatement statement =
                     connection.prepareStatement(sql)) {

            statement.setString(1, sinif);

            try (ResultSet resultSet = statement.executeQuery()) {
                while (resultSet.next()) {
                    System.out.printf(
                            "%d | %s | %s%n",
                            resultSet.getInt("id"),
                            resultSet.getString("ad"),
                            resultSet.getString("sinif")
                    );
                }
            }
        } catch (SQLException exception) {
            System.err.println("Veritabanı işlemi başarısız oldu.");
            System.err.println("SQLState: " + exception.getSQLState());
            System.err.println("Hata kodu: " + exception.getErrorCode());
        }
    }

    private static String requiredEnv(String name) {
        String value = System.getenv(name);

        if (value == null || value.trim().isEmpty()) {
            throw new IllegalStateException(
                    name + " ortam değişkeni tanımlı değil."
            );
        }

        return value;
    }
}

10-A değeri SQL metnine birleştirilmez. setString(1, sinif) çağrısı, soru işaretiyle gösterilen ilk parametreyi veri olarak bağlar. Bu sorgu için beklenen çıktı şöyledir:

1 | Ada | 10-A
3 | Deniz | 10-A

Kodda kaynaklar ve SQLException nasıl yönetilir?

Kodda kaynaklar ve SQLException nasıl yönetilir?

Connection veritabanıyla kurulan oturumu, PreparedStatement parametreli sorguyu ve ResultSet ise sonuç satırları üzerinde ilerleyen imleci temsil eder. Her nesnenin yaşam döngüsü bir önceki kaynağa bağlıdır: Sonuç kümesi sorguya, sorgu da bağlantıya ihtiyaç duyar.

try-with-resources kullanımı, kaynakların kapanma sorumluluğunu kodda görünür hâle getirir. İçteki blok tamamlandığında ResultSet kapanır; dış blok tamamlandığında PreparedStatement ve Connection için kapanış işlemleri yürütülür. Bu düzen, normal akışta veya bir SQL hatası oluştuğunda kaynakların açık kalma riskini azaltır.

PreparedStatement parametreleri veri değerleri içindir. Tablo veya sütun adları aynı yöntemle ? kullanılarak parametreleştirilemez. Dinamik bir tablo ya da sütun seçimi gerekiyorsa kullanıcı girdisini doğrudan SQL'e eklemek yerine izin verilen adlardan güvenli bir seçim yapılmalıdır.

SQLException içindeki getMessage() ayrıntılı hata açıklamasını, getSQLState() hata sınıfına ilişkin bilgiyi, getErrorCode() ise veritabanı veya sürücü bağlamındaki kodu verir. Bu değerler teşhis amacıyla korunmuş günlüklerde değerlendirilebilir. Bağlantı adresi, kullanıcı adı, parola, belirteç ve hassas sorgu parametreleri son kullanıcıya gösterilmemeli, günlüklerde de uygun biçimde gizlenmelidir.

Java çalışmalarını kişiye özel bir planla sürdürmek istersen Java birebir özel ders programı hakkında bilgi edinebilirsin.

JDBC sorunları dört katmanda nasıl teşhis edilir?

JDBC hatalarını rastgele ayar değiştirerek aramak yerine bağlantıdan sonucun okunmasına kadar dört katmanı sırayla inceleyebilirsin. Her katmanda önce belirli bir kontrol sorusu sor, ardından yalnızca o katmana ait küçük bir doğrulama yap.

  1. Bağlantı katmanı: Uygun JDBC sürücüsü proje bağımlılıklarında bulunuyor mu, bağlantı URL’si doğru mu, veritabanı sunucusuna erişilebiliyor mu ve kimlik bilgileri geçerli mi? Sonraki adım: Sürücü bağımlılığını, ortamdan gelen URL ve kimlik bilgilerini, ardından sunucunun erişilebilirliğini tek tek kontrol et. Gizli bilgileri günlük çıktısına yazma.
  2. Kaynak yaşam döngüsü katmanı: Connection, PreparedStatement veya ResultSet kullanılmadan önce kapanmış olabilir mi? Bu kaynakların tamamı, kullanıldıkları kodu kapsayan bir try-with-resources bloğunda mı? Sonraki adım: Kaynakların oluşturulduğu ve kullanıldığı sıralamayı incele. Özellikle blok dışına taşan bir ResultSet ya da kapanmış bağlantı nesnesi olup olmadığını kontrol et.
  3. Sorgu katmanı: Sorgudaki tablo ve sütun adları, kullanıcının yetkileri, yer tutucu sayısı ve bağlanan parametre türleri birbiriyle uyumlu mu? Sonraki adım: Her ? yer tutucusuna bir değer bağlandığını, değerlerin doğru sırada verildiğini ve örneğin metin için setString, sayısal değer için uygun sayısal metot kullanıldığını doğrula.
  4. Sonuç katmanı: resultSet.next() çağrıldı mı, filtre gerçekten satır döndürüyor mu ve sütun etiketi ile kullanılan Java türü uyumlu mu? Sonraki adım: Önce next() sonucunu kontrol et. Ardından filtre değerini, sütun adını ve getString ya da getInt gibi okuma metodunu karşılaştır.

Bağlantı hatası alınmadan sonuç kümesi boş geliyorsa dördüncü katmandan başlamak uygundur. next() sonucu satır bulunmadığını gösteriyorsa filtre değerini ve örnek veriyi incele; bu noktada sorun çoğunlukla üçüncü katmandaki sorgu veya parametre eşleşmesiyle ilgilidir.

Uygulama kontrol listesinde neler bulunmalı?

İlk JDBC uygulamasını çalıştırmadan önce aşağıdaki maddeleri kontrol etmek, bağlantı ve sorgu sorunlarını birbirinden ayırmayı kolaylaştırır.

  • Uygun JDBC sürücüsü proje bağımlılıklarında yer alıyor.
  • Bağlantı URL’si ve kimlik bilgileri kaynak kod yerine ortamdan geliyor.
  • Veritabanı sunucusu ve üzerinde kullanılacak örnek tablo hazır durumda.
  • SQL içindeki değişken değerler String birleştirme yerine parametrelerle gönderiliyor.
  • Connection, PreparedStatement ve ResultSet gibi kaynaklar güvenli biçimde kapanıyor.
  • Boş sonuç ile SQLException durumu ayrı ele alınıyor.
  • Kullanıcı adı, parola ve diğer gizli bilgiler hata ya da sonuç çıktısına yazılmıyor.

Bu kontrol listesini pekiştirmek için üç küçük alıştırma yapabilirsin:

  1. Sınıf parametresini değiştirerek farklı kayıtları listele.
  2. Sonuç bulunmadığında, boş sonucu bağlantı hatasından ayıran açıklayıcı bir çıktı üret.
  3. Tek seferde yalnızca bir bağlantı ayarını değiştirerek dört katmanlı teşhis şemasını uygula ve belirtinin hangi katmanda ortaya çıktığını belirle.

JDBC konularını teknik kontrol listesinden ayrı olarak birlikte çalışmak istersen, birebir özel ders programları hakkında bilgi edinebilirsin.

Dört katmanı sırayla incelemek, JDBC’de sorunun bağlantıda mı, kaynak yönetiminde mi, sorguda mı yoksa sonuç okuma aşamasında mı olduğunu daha düzenli biçimde görmeni sağlar.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara