Java İle Nesne Yönelimli Crud İşlemleri Nasıl Yapılır?

Java İle Nesne Yönelimli Crud İşlemleri Nasıl Yapılır?
Java İle Nesne Yönelimli Crud İşlemleri Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu rehberdeki kod örneklerini uygulayabilmek için sisteminizde aşağıdaki araçların kurulu olması gerekmektedir:

  • JDK 21 veya üzeri: Modern Java özellikleri için gereklidir.
  • Maven veya Gradle: Proje bağımlılıklarını yönetmek için.
  • PostgreSQL veya MySQL: Verilerinizi saklayacağınız ilişkisel veritabanı.
  • JDBC Sürücüsü: Veritabanı bağlantısı için gerekli olan kütüphane.

Projenize veritabanı bağlantısı için pom.xml dosyanıza ilgili veritabanı sürücüsünü eklemeyi unutmayın. Nesne yönelimli tasarımda, veritabanı tablolarını Java sınıfları olarak modellemek, veriye erişimi kolaylaştırır.

Veri Modeli (Entity) Oluşturma

Nesne yönelimli CRUD yapısının kalbi, veritabanı tablosunu temsil eden sınıflardır. Bu sınıflara "Entity" (Varlık) denir. Aşağıdaki örnekte bir Product (Ürün) sınıfını nasıl tanımlayacağımızı görebilirsiniz.

public class Product {
    private int id;
    private String name;
    private double price;

    public Product(int id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    // Getter ve Setter metotları
    public int getId() { return id; }
    public String getName() { return name; }
    public double getPrice() { return price; }
}

Bu sınıf, veritabanındaki bir satırı Java nesnesi olarak temsil eder. Nesne yönelimli yaklaşımda, veritabanı sütunlarını sınıfın özel (private) alanları olarak tanımlamak, kapsülleme (encapsulation) prensibine uygundur.

Veritabanı Bağlantısını Yönetmek

Veritabanı bağlantısını her işlemde yeniden oluşturmak performans kaybına neden olur. Bunun yerine, bağlantı yönetimini tek bir sınıfta toplamak (Singleton deseni) en iyi pratiktir.

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

public class DatabaseConnection {
    private static final String URL = "jdbc:postgresql://localhost:5432/mydb";
    private static final String USER = "admin";
    private static final String PASS = "sifre123";

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASS);
    }
}

Bu yapı, bağlantı bilgilerini tek merkezden yönetmenizi sağlar. Güvenlik için veritabanı şifrelerini asla kodun içine gömmeyin; bunun yerine ortam değişkenlerini (Environment Variables) kullanın.

DAO (Data Access Object) Tasarımı

DAO deseni, veritabanı mantığını iş mantığından ayırır. CRUD işlemlerini bu katmanda gerçekleştirmek, kodun test edilebilirliğini artırır. Aşağıda bir ProductDAO örneği yer almaktadır.

import java.sql.*;

public class ProductDAO {
    public void addProduct(Product product) throws SQLException {
        String sql = "INSERT INTO products (name, price) VALUES (?, ?)";
        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, product.getName());
            pstmt.setDouble(2, product.getPrice());
            pstmt.executeUpdate();
        }
    }
}

Burada PreparedStatement kullanımı kritik önem taşır. Bu yapı, SQL Injection saldırılarını önlemek için kullanıcı girdilerini güvenli bir şekilde işler.

CRUD İşlemlerini Uygulama: Okuma ve Güncelleme

Veritabanından veri okumak ve mevcut veriyi güncellemek için DAO sınıfımızı genişletelim. Nesne yönelimli bir yapıda, veritabanından dönen sonuçları bir nesne listesine dönüştürmek en yaygın yöntemdir.

public Product getProductById(int id) throws SQLException {
    String sql = "SELECT * FROM products WHERE id = ?";
    try (Connection conn = DatabaseConnection.getConnection();
         PreparedStatement pstmt = conn.prepareStatement(sql)) {
        pstmt.setInt(1, id);
        ResultSet rs = pstmt.executeQuery();
        if (rs.next()) {
            return new Product(rs.getInt("id"), rs.getString("name"), rs.getDouble("price"));
        }
    }
    return null;
}

Güncelleme işlemi ise benzer şekilde UPDATE sorgusu ile gerçekleştirilir. Nesne yönelimli tasarımda, bir nesnenin durumunu değiştirdiğinizde, bu değişikliği veritabanına yansıtmak için bir update metodu tanımlamanız yeterlidir.

CRUD İşlemlerinde Güvenlik ve Hata Yönetimi

CRUD işlemleri sırasında veritabanı güvenliği en üst seviyede tutulmalıdır. Kullanıcıdan alınan veriler asla doğrudan sorgu dizgilerine eklenmemelidir.

Kritik Uyarı: SQL Injection saldırılarından korunmak için her zaman PreparedStatement kullanın. Ayrıca, veritabanı işlemlerinde oluşan SQLException hatalarını yakalayın ve kullanıcıya teknik detayları göstermeden anlamlı hata mesajları döndürün.
Yöntem Avantaj Dezavantaj
JDBC (Saf) Yüksek performans, tam kontrol Çok fazla boilerplate kod
JPA/Hibernate Daha az kod, nesne odaklı Öğrenme eğrisi ve yapılandırma maliyeti

Sıkça Sorulan Sorular

Neden JDBC yerine bir ORM aracı kullanmalıyım?

ORM araçları, nesnelerle veritabanı tabloları arasındaki eşleşmeyi otomatikleştirir. Bu, geliştirme hızını artırır ancak küçük projelerde karmaşıklık yaratabilir.

SQL Injection nedir ve nasıl engellenir?

SQL Injection, saldırganın veritabanı sorgusuna zararlı kodlar enjekte etmesidir. PreparedStatement kullanarak bu saldırıları tamamen engelleyebilirsiniz.

İşlemlerimi nasıl daha hızlı hale getirebilirim?

Bağlantı havuzu (Connection Pooling) kullanarak veritabanı bağlantılarını yeniden kullanmak, uygulamanızın performansını ciddi oranda artırır.

Hata yönetimi nasıl yapılmalıdır?

Veritabanı hatalarını loglamak için SLF4J veya Log4j gibi kütüphaneler kullanın. Kullanıcıya ise sadece işlemin başarısız olduğunu bildiren genel mesajlar gösterin.

Nesne yönelimli CRUD'da "Repository" deseni nedir?

Repository, DAO deseninin bir üst katmanıdır. Veri erişim mantığını bir koleksiyon gibi yönetmenizi sağlar, bu da kodunuzu daha okunabilir kılar.

Sonuç

Java ile nesne yönelimli CRUD işlemleri yapmak, veritabanı ile etkileşiminizi disiplinli ve güvenli bir yapıya oturtmanızı sağlar. Bu rehberde öğrendiğiniz DAO deseni, PreparedStatement kullanımı ve Singleton bağlantı yönetimi, profesyonel projelerin temel taşlarıdır. Bir sonraki adım olarak, bu yapıları Spring Boot gibi modern framework'ler üzerinde nasıl uygulayacağınızı araştırmanızı öneririm.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) veritabanı bağlantı bilgilerini güvenli bir şekilde saklamalı, bağlantı havuzu (HikariCP gibi) kullanmalı ve tüm girdi validasyonlarını titizlikle yapmalısınız.
Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Kişisel gelişim ve zaman yönetimi odaklı pratik teknikler üzerine çalışıyorum. Günlük rutinleri iyileştiren, zaman kazandıran yöntemleri bilimsel temellere dayandırarak editöryal bir dille paylaşıyorum.

Yorumlar (0)

Yorum Yaz