Herhangi bir modern yazılım uygulamasının en kritik noktası, verilerin güvenli ve kalıcı bir şekilde depolanmasıdır. Java programlama dilinde bir veritabanı erişimi (database access) sağlamak için geliştirilmiş standart API’ye Java Database Connectivity (JDBC) adı verilir. Bilgisayarınızda Java programlarını çalıştırmak için kullandığınız Java Runtime Environment (JRE), JDBC gibi kritik entegrasyon kütüphanelerini standart bir paket olarak içerisinde barındırır. Bu sayede ekstra bir dil öğrenmenize gerek kalmadan, Java kodlarınız aracılığıyla veritabanınıza bağlanabilir, veri okuyabilir veya yeni veriler ekleyebilirsiniz.
JDBC’nin Temel Bileşenleri Nelerdir?
JDBC kütüphanesi ile çalışırken uygulamanızın kalbinde yer alacak ve sıklıkla kullanacağınız bazı temel bileşenler (sınıf ve arayüzler) bulunur:
- DriverManager ve Veritabanı Bağlantıları (Database Connections):
DriverManagersınıfı, kullanmak istediğiniz veritabanına (MySQL, PostgreSQL, Oracle vb.) uygun sürücüyü bulur ve Java uygulamanız ile veritabanı arasında canlı bir bağlantı (Connection) oturumu başlatır. - Connection, Statement, PreparedStatement: Bağlantı kurulduktan sonra veritabanına SQL komutları göndermek için
Statementveya güvenlik/performans açısından daha gelişmiş olanPreparedStatementkullanılır. - ResultSet İşleme (Processing): Veritabanından bir veri sorguladığınızda (Örneğin; “Tüm müşterileri getir”), dönen tablo sonuçları
ResultSetadı verilen bir nesnede tutulur ve bu nesne üzerinden veriler satır satır okunur. - İşlem Yönetimi (Transaction Management): Birbiriyle ilişkili birden fazla veritabanı işleminin (örneğin para transferi) hata anında geri alınabilmesini veya tamamen onaylanmasını sağlayan yönetim mekanizmasıdır.
Ayrıca, veritabanı işlemleri sırasında ağ kopması, tablonun bulunamaması veya yanlış SQL yazılması gibi durumlar oluşabilir. Java’nın hata hiyerarşisinde, bu tür veritabanı hataları Exception sınıfının altından türeyen SQLException adı verilen özel bir aykırı durum (hata) nesnesi ile ele alınır.
Şimdi bu kavramları pekiştirmek için adım adım bir MySQL uygulaması yapalım.
Adım 1: MySQL Veritabanı ve Tablo Hazırlığı (Bağımsız Bilgi)
Uygulamamıza başlamadan önce MySQL sunucumuzda bir veritabanı ve içine kayıt yapabileceğimiz bir tablo oluşturmamız gerekiyor. MySQL komut satırını veya phpMyAdmin gibi bir aracı açarak şu SQL komutlarını çalıştırın:
CREATE DATABASE sirket_db;
USE sirket_db;
CREATE TABLE calisanlar (
id INT AUTO_INCREMENT PRIMARY KEY,
ad_soyad VARCHAR(100) NOT NULL,
pozisyon VARCHAR(50),
maas DOUBLE
);
Adım 2: MySQL JDBC Sürücüsünü Projeye Ekleme (Bağımsız Bilgi)
Java’nın (JDBC’nin) MySQL ile konuşabilmesi için bir “çevirmen” kütüphaneye ihtiyacı vardır. Buna JDBC Sürücüsü (Driver) denir. Eğer Maven tabanlı bir proje kullanıyorsanız, pom.xml dosyanıza aşağıdaki bağımlılığı eklemeniz yeterlidir:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
Adım 3: Veritabanına Bağlantı Kurma (Connection)
İlk Java kodumuzda, DriverManager sınıfını kullanarak veritabanımızla bir bağlantı (Connection) oluşturacağız. Bağlantı için veritabanının adresine (URL), kullanıcı adına ve şifreye ihtiyacımız var.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class VeritabaniBaglantisi {
// Veritabanı URL'si, kullanıcı adı ve şifre
private static final String URL = "jdbc:mysql://localhost:3306/sirket_db";
private static final String KULLANICI = "root"; // Kendi MySQL kullanıcı adınız
private static final String SIFRE = "123456"; // Kendi MySQL şifreniz
public static void main(String[] args) {
// try-with-resources kullanarak bağlantıyı otomatik kapatıyoruz
try (Connection conn = DriverManager.getConnection(URL, KULLANICI, SIFRE)) {
System.out.println("MySQL Veritabanına başarıyla bağlanıldı!");
} catch (SQLException e) {
System.out.println("Bağlantı hatası oluştu!");
e.printStackTrace(); // Hatayı detaylıca konsola yazdırır
}
}
}
Yukarıdaki kodda jdbc:mysql://localhost:3306/sirket_db adresi, veritabanımızın bilgisayarımızda (localhost) çalıştığını ve 3306 portunu dinlediğini belirtir.
Adım 4: PreparedStatement ile Veritabanına Veri Ekleme (Create)
Veritabanına dışarıdan veri eklerken her zaman PreparedStatement kullanılması önerilir. PreparedStatement, içine dışarıdan parametre (değişken) alabilen ve SQL Injection adı verilen siber saldırıları otomatik olarak önleyen güvenli bir araçtır.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class VeriEkleme {
private static final String URL = "jdbc:mysql://localhost:3306/sirket_db";
private static final String KULLANICI = "root";
private static final String SIFRE = "123456";
public static void main(String[] args) {
// SQL sorgumuzda dışarıdan gelecek değerler için soru işareti (?) kullanıyoruz
String sqlSorgusu = "INSERT INTO calisanlar (ad_soyad, pozisyon, maas) VALUES (?, ?, ?)";
try (Connection conn = DriverManager.getConnection(URL, KULLANICI, SIFRE);
PreparedStatement pstmt = conn.prepareStatement(sqlSorgusu)) {
// Soru işaretlerinin yerine sırasıyla (1, 2, 3) değerlerimizi atıyoruz
pstmt.setString(1, "Ahmet Yılmaz");
pstmt.setString(2, "Yazılım Geliştirici");
pstmt.setDouble(3, 45000.50);
// Sorguyu çalıştır
int etkilenenSatir = pstmt.executeUpdate();
if (etkilenenSatir > 0) {
System.out.println("Yeni çalışan başarıyla eklendi!");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Burada kullandığımız executeUpdate() metodu, veritabanında değişiklik yapan (INSERT, UPDATE, DELETE) komutlar için kullanılır.
Adım 5: ResultSet ile Veritabanından Veri Okuma (Read)
Eklediğimiz verileri okumak ve ekranda listelemek için bir okuma işlemi yapacağız. SQL sorgusundan dönen sonuçları yönetmek için ResultSet processing (ResultSet işleme) mantığını kullanacağız. ResultSet, bir imleç (cursor) mantığıyla çalışır ve tabloda satır satır ilerlememizi sağlar.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class VeriOkuma {
private static final String URL = "jdbc:mysql://localhost:3306/sirket_db";
private static final String KULLANICI = "root";
private static final String SIFRE = "123456";
public static void main(String[] args) {
String sqlSorgusu = "SELECT id, ad_soyad, pozisyon, maas FROM calisanlar";
try (Connection conn = DriverManager.getConnection(URL, KULLANICI, SIFRE);
PreparedStatement pstmt = conn.prepareStatement(sqlSorgusu);
ResultSet rs = pstmt.executeQuery()) { // Veri okumak için executeQuery kullanılır
System.out.println("--- ÇALIŞAN LİSTESİ ---");
// rs.next() metodu, okunacak yeni bir satır olduğu sürece true döner
while (rs.next()) {
int id = rs.getInt("id");
String ad = rs.getString("ad_soyad");
String pozisyon = rs.getString("pozisyon");
double maas = rs.getDouble("maas");
System.out.println("ID: " + id + " | Ad: " + ad + " | Pozisyon: " + pozisyon + " | Maaş: " + maas);
}
} catch (SQLException e) {
System.out.println("Veriler okunurken hata oluştu!");
e.printStackTrace();
}
}
}
Sonuç
Java ile veritabanı programlamanın temelinde JDBC mimarisi yatar. Bu rehberde; entegrasyon kütüphanesi olan JDBC’nin projeye nasıl dahil edileceğini, DriverManager ile MySQL sunucusuna nasıl oturum açılacağını, PreparedStatement ile verilerin nasıl güvenle veritabanına yazılacağını ve ResultSet nesnesinin nasıl işlenip satır satır ekrana yazdırılacağını öğrendik. Olası ağ veya veritabanı kilitlenmelerine karşı kodumuzu daima SQLException denetimi ve try-catch blokları ile güvence altına almamız gerektiğini unutmamalısınız. Bol kodlamalı günler dileriz!






