Harun Reşit Zafer

Bâki kalan bu kubbede bir hoş sadâ imiş

Netbeans, Java, MySQL: Örnek Veritabanı Uygulaması – 2

Bir önceki uygulamadan farklı olarak  bu örnekte her veritabanı işlemi (seç,  ekle, güncelle, sil ) için bağlantıyı açıp kapayacağız ve gerekli tüm SQL kodlarını kendimiz yazacağız. Yazının sonunda ise hangi yaklaşımın daha iyi olduğunu tartışacağız. Hazırlayacağımız uygulamanın pencere görünümü:

java_mysql

Not: Bu makaleyi uygulayabilmeniz için bilgisayarınızda Netbeans ve MySQL’in kurulu olması ve gerekli ayarların yapılmış olması gerekiyor ki bu ayrıntılar birinci yazıda anlatıldı.

Veritabanının Oluşturulması

Birinci örnekte kullandığımız veritabanının aynısını kullanacağız. Veritabanını oluşturmak için gerekli kodları orada bulabilirsiniz. Bu kodları nasıl kullanacağınızı bilmiyorsanız, yine o yazıdaki videoyu izleyiniz.

Eğer birinci örneği bilgisayarınızda uyguladıysanız zaten veritabanınız hazır demektir. Bu kısmı atlayabilirsiniz.

Veritabanına Bağlantı

Bu kısım da birinci yazıdaki ile aynı. Yalnız arada önemli bir fark var. Birinci örnekte baglantıAc() ve baglantıKapat() metodlarını yalnızca bir defa kullanmıştık. Burada ise her veritabanı işlemi için kullanacağız. Zaten bağlantı açma ve kapama işlemlerini birer metod (fonksiyon) haline getirmemizin esas sebebi de bu örnekti.

DBConnection ve myTableModel Sınıfları

Programımız iki sınıftan oluşuyor. Birinci sınıf neredeyse tüm işi yapan ve bu yazıda üzerinde duracağımız DBConnection sınıfı. Diğer sınıf ise myTableModel sınıfı ki aslında tek yaptığı iş veritabanı kayıtlarını yukarıdaki resimde gördüğünüz gibi bir tabloya yazabilmemizi mümkün kılmak. Bu sınıf üzerinde fazla kafa yormanıza gerek yok bence. Java’da neden bu iş için ayrı bir sınıf yazmamız gerektiğini anlayamadım doğrusu. Aynı işi örneğin C# dilinde doğrudan yapabiliyoruz. Neyse…

TabloDoldur() Metodu

Buradaki Tablo ifadesini veritabanındaki tablo ile karıştırmayın. Pencerde kullandığımız görsel tablodan (Jtable nesnesi) bahsediyoruz. Bu metodun işi veritabanındaki kisiler tablosunu olduğu gibi penceremizdeki tabloya aktarmak. Ekleme, silme, güncelleme gibi her işlemden sonra çağırıyoruz ki veritabanındaki değişiklikler penceremize anında yansısın.

public void TabloDoldur() {
    try {

        Statement st = baglantiAc(); //Bağlantıyı aç
        ResultSet res = st.executeQuery("SELECT * FROM  kisiler"); //VT'den kayıtları ResultSet'e al
        myTableModel model = new myTableModel(res); //Tablomuza model oluştur
        jTable1.setModel(model); //Tabloyu res'teki kayıtlar ile doldur
        baglantiKapat(); //Bağlantıyı kapat

    } catch (Exception e) {
        JOptionPane.showConfirmDialog(null, "Bağlantı Başarısız", "MySQL Bağlantısı", JOptionPane.PLAIN_MESSAGE);
    }
}

Kayıt Ekleme

Bu metod “Ekle” düğmesine tıklandığında çağırılacak ve on anda formdaki bilgileri parametre olarak alacak.

public void KayitEkle(String ad, String soyad, String yas, String cinsiyet) {
    try {

        Statement st = baglantiAc();
        String sql= "INSERT INTO vt.kisiler (Ad, Soyad, Yas, Cinsiyet) VALUES (" +
        "'" + ad + "', " +
        "'" + soyad + "', " +
        "" + yas + ", " +
        "" + cinsiyet + ")";

        //System.out.println(sql); sorgunun doğru yazıldığından emin olmak için ekrana yazdırabilirsiniz.

        st.executeUpdate(sql); //sorguyu çalıştır

        baglantiKapat(); //bağlantıyı kapat

        TabloDoldur(); //Penceremizdeki tabloyu yeniden doldur (güncelle)

    }catch (Exception e) {
        JOptionPane.showConfirmDialog(null, "Kayıt Eklenemedi", "Kisiler Tablosu", JOptionPane.PLAIN_MESSAGE);
    }
}

“Ekle” düğmesine basıldığında çalışacak olan metod ise şöyle:

private void ekleButtonActionPerformed(java.awt.event.ActionEvent evt) {

    String ad = AdTextField.getText();
    String soyad = soyadTextField.getText();
    String yas = yasTextField.getText();
    String cinsiyet;
    if (cinsiyetComboBox.getSelectedIndex() == 0) {
        cinsiyet = "0";
    } else {
        cinsiyet = "1";
    }

    KayitEkle(ad, soyad, yas, cinsiyet);
}

Kayıt Silme

Bu metod “Sil” düğmesine tıklandığında çağırılacak ve on anda tablod seçili olan satır silinecek. Bu metod parametre olarak silinecek kaydın ID‘sini alıyor. ID bilgisi pencere tablosunda görünmüyor çünkü tablo ikinci kolondan itibaren bilgileri gösteriyor. Bunu myTableModel isimli sınıfta öyle kodladık çünkü.

public void KayitSil(String ID) {
    try {
        Statement st = baglantiAc();
        st.executeUpdate("Delete FROM  kisiler where id=" + ID);
        baglantiKapat(); //bağlantıyı kapat
        TabloDoldur();  //Penceremizdeki tabloyu yeniden doldur (güncelle)
    } catch (Exception e) {
        JOptionPane.showConfirmDialog(null, "Kayıt Silinemedi", "Kişiler Tablosu", JOptionPane.PLAIN_MESSAGE);
    }
}

“Sil” düğmesine basıldığında çalışacak olan metod:

private void silButtonActionPerformed(java.awt.event.ActionEvent evt) {
    String ID = jTable1.getValueAt(jTable1.getSelectedRow(), 0).toString();
    KayitSil(ID);
}

Kayıt Güncelleme

Güncelleme ekleme ve silmenin bir bileşimi gibi aslında. Hem güncellecenek tüm alanları hem de güncellecenek kaydın ID’sini parametre olarak alıyor.

public void KayitGuncelle(String ID, String ad, String soyad, String yas, String cinsiyet) {
    try {
        Statement st = baglantiAc();
        String sql = "UPDATE vt.kisiler SET " +
        "Ad='" + ad + "', " +
        "Soyad='" + soyad + "', " +
        "yas=" + yas + ", " +
        "cinsiyet=" + cinsiyet +
        " WHERE ID=" + ID ;

        st.executeUpdate(sql); //sorguyu çalıştır
        baglantiKapat(); //bağlantıyı kapat
        TabloDoldur(); //Penceremizdeki tabloyu yeniden doldur (güncelle)

    } catch (Exception e) {
        JOptionPane.showConfirmDialog(null, "Kayıt Güncellenemedi", "Kişiler Tablosu", JOptionPane.PLAIN_MESSAGE);
    }
}

“Güncelle” düğmesine basıldığında çalışacak olan metod:

private void guncelleButtonActionPerformed(java.awt.event.ActionEvent evt) {

    String ID = jTable1.getValueAt(jTable1.getSelectedRow(), 0).toString();
    String ad = AdTextField.getText();
    String soyad = soyadTextField.getText();
    String yas = yasTextField.getText();
    String cinsiyet;
    if (cinsiyetComboBox.getSelectedIndex() == 0) {
        cinsiyet = "0";
    } else {
        cinsiyet = "1";
    }
    KayitGuncelle(ID, ad, soyad, yas, cinsiyet);
}

Tabloda Tıklanan Satırın Bilgilerinin Forma Gelmesi

Tabloda bir satıra tıkladığımızda o satırdaki bilgilerin forma yansıması aşağıdaki olay işleyici metod ile oluyor. Bu metod tabloya ait bir metod ve imleç tablo üzerindeyken fareye her basıldığında çağrılıyor.

private void jTable1MousePressed(java.awt.event.MouseEvent evt) {

    //Tabloda üzerine tıklanılan satırın bilgilerini ilgili form elemanlarına yazar.
    AdTextField.setText(jTable1.getValueAt(jTable1.getSelectedRow(), 1).toString());
    soyadTextField.setText(jTable1.getValueAt(jTable1.getSelectedRow(), 2).toString());
    yasTextField.setText(jTable1.getValueAt(jTable1.getSelectedRow(), 3).toString());
    String cinsiyet = jTable1.getValueAt(jTable1.getSelectedRow(), 4).toString();
    if (cinsiyet.equals("1")){
         cinsiyetComboBox.setSelectedIndex(1);
    }
    else{
        cinsiyetComboBox.setSelectedIndex(0);
   }
}

Sonuç

Birinci örnekteki yaklaşıma göre bu örneğin iki avantajı var. Birincisi yalnızca gerektiğinde bağlantı açılıyor ve iş bitince hemen kapanıyor. Aynı veritabanını birden fazla uygulama kullanıyorsa, örneğin bir web sitesi veritabanı, veritabanı gereksiz yere meşgul edilmemiş oluyor. İkincisi ise bu yaklaşım bence daha esnek. SQL kodlarına daha hakim olmamızı sağlıyor. Dezavantaj olarak ise SQL kodlarını String olarak yazarken sıkça yapılan,  zaman ve sabır kaybına neden olan hatalar. Benzer kodları kendiniz yazdığınızda ne demek istediğimi daha iyi anlayacaksınız. Bir sonraki örnekte aynı yaklaşımı kullanan ama bahsettiğim zaman ve sabır kaybına neden olan hataları daha az yapmamıza olanak veren bir yöntemden bahsedeceğim. Kodların tamamını NetBeans projesi olarak buradan indirebilirsiniz.

Herkese kolay gelsin

İlgili Yazılar

30 Ocak 2010 Cumartesi tarihinde yayınlandı.