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

Netbeans_java_mySQL
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ızDBConnection 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

<img class=”alignright size-full wp-image-565″ title=”Netbeans_java_mySQL” src=”http://www.hrzafer.com/wp-content/uploads/2010/01/Netbeans_java_mySQL.jpg” alt=”Netbeans_java_mySQL” width=”166″ height=”198″ />
 
 

YORUMLAR

29 Cevap to “Netbeans, Java, MySQL: Örnek Veritabanı Uygulaması – 2”

  1. Gamze on Mayıs 1st, 2010 10:49

    Java ile access bağlantısı kurmaya çalışıyorum ama bir tülü veriyi Jlist’e çekemiyorum, bunu nasıl yapabilirim,tablo doldur kodunuza baktım ama myTableModel dediğiniz yapı nedir biraz detay verirmisiniz

  2. admin on Mayıs 2nd, 2010 04:22

    JTable aslında sadece verinin tablo şeklinde görünmünü sağlıyor. Veriyi tutmuyor. TableModel ise verinin tutulduğu yer. Table, TableModel’deki veriyi görüntülüyor. Aynı şey List ve ListModel yapıları için de geçerli. Bu ipucundan sonra internetten gerekli örnekleri bulabilirsiniz sanırım. Ben de vaktim olduğunda benzer bir örneği siteye ekleyeyim inş.

  3. AHMET ÇAĞDAŞ SEÇKİN on Mayıs 17th, 2010 04:43

    Öncelikle yazılarınız için teşekkür ediyorum. Çok faydası oldu. “myTableModel” sınıfına hangi kütüphaneden ulaşabiliriz. Veritabanından aldığım verileri diğer tablemodel’lerle tabloya atmaya çalıştım ancak beceremedim. Yardımcı olursanız veya bu projenin tam halini eklerseniz sevinirim.

  4. AHMET ÇAĞDAŞ SEÇKİN on Mayıs 17th, 2010 04:44

    şimdi fark ettim projeyi sayfanın altına eklemişsiniz. iyi çalışmalar.

  5. pcmuh on Temmuz 16th, 2010 05:15

    merhabalar,
    sitenizi takip ediyorum,gerçekten de faydalı..
    ben veritabanındaki kayıtları tabloda göstermek istiyorum,sizin örnek benzer ama jtable’ın özelliklerini değiştirdiniz mi?
    ben örnek olsun diye sizin örneği kndim yapmaya çalıştım ama MyTableModel diye bişey var,onu nasıl oluşturabiliriz,onun hakkında biraz anlatırsanız çok sevinirim,projemi yapmam için gerekli
    teşşkurler..

  6. pcmuh on Temmuz 16th, 2010 06:32

    bir de sizin projenizinizin projects kısmında default package ın içinde vt.properties var,
    bn de o yok,kendiliğinden mi oluşması gerekiyor onun yoksa biz mi oluşturacağiz,bnm projem veritabanına baglanıyor ama kayıt eklenmedi diye bir uyarı alıyorum,sizce sebebi nedir?
    2 gündür bununla uğraşıyrm,yardım lütfen..

  7. admin on Temmuz 16th, 2010 06:40

    MyTableModel sınıfı zaten proje dosyalarının arasında var. Olduğu gibi kullanmanız yeterli. Java’da TableModel sınıfı içerisinde tablonun verisi tutulur. Jtable sınıfı ise yalnızca TableModel sınıfının barındırdığı veriyi göstermekle sorumludur. Yani veri JTable’da değil TableModel’de tutulur. Eğer Tablonuza farklı özellikler katmak istiyorsanız bu iki sınıfı biraz çalışmanız gerekiyor. Ben de vaktim müsait olduğunda Swing classlarına dair bir kaç yazı hazırlmayı düşünüyorum.

  8. admin on Temmuz 16th, 2010 07:02

    Sizin oluşturmanız lazım o dosyayı. Benim projeden kopyalayabilirsiniz. Program bağlantı bilgilerini oradan okuyor. Dosyada ilgili kısımları değiştirmeniz gerekiyor:
    Database.url = jdbc:mysql://localhost:3306/
    Database.name = [veritabanınızın ismi buraya]
    Database.driver = com.mysql.jdbc.Driver
    Database.userName = [kulanıcı adı buraya - büyük ihtimal ile root]
    Database.password = [şifre buraya - varsayılan olarak boş]

  9. pcmuh on Temmuz 16th, 2010 07:43

    Teşekkürler cvp için..MyTableModel sınıfını olduğu gibi aldım,şuan herşey tamam,bir de vt.properties kısmı da tamam,yani veritabanına sorunsuz bir şekilde bağlanıyorum,ama kayıt eklenemedi diye bir sorunla karşılaşıyorum hala..

  10. pcmuh on Temmuz 16th, 2010 07:48

    kayıt ekle metodunda böyle bir dğişiklik yapmıştım.’tablogoster’ bnm veri tabanı ismi,ordaki (+) ve (“)işaretlerinde sorun yok sanırım..biraz kafamı karıştırdı da.
    String sql = “INSERT INTO tablogoster.musteriler (hesapismi, bireyselmusteri) VALUES (” + “‘” + hesapismi + “‘, ” + “‘” + bireyselmusteri + “)”;

  11. pcmuh on Temmuz 16th, 2010 12:02

    internette sizden başka bu konuyu anlatan kimse yok,çok yardımcı oluyrsunuz,çok teşekkür ederim,projemi tamamlamam gerekiyor,msn kullanıyorsanız eklerseniz size tam olarak nerde takıldığımı söyleyeceğim..tekrar teşekkur ederim

  12. pcmuh on Temmuz 17th, 2010 06:16

    Cevap için çok teşkkur ederim,dediğiniz videoyu izledim,SQL komutlarını netbeanste system.out.println ile yazdırdım,output ekranına yazdığı halde bnm yaptığım tabloda kayıt eklenmedi uyarısı alıyorum hala..Jtable1 üzerine sağ tıkladığımızda table contents var..columns kısmında type olarak object seçili,acaba onla alakalı bişey mi?
    yani string falan yapmıyacakmıyım?

  13. pcmuh on Temmuz 20th, 2010 06:16

    merhabalar,
    en son başlığınız olan
    “Tabloda Tıklanan Satırın Bilgilerinin Forma Gelmesi”
    kodunu yazdım çalışmadı..sorun ne olabilir?

  14. Serbay on Eylül 8th, 2010 09:23

    Merhabalar.Paylaşımlarınız çok güzel.Benimde bir problemim var ve paylaşmak istedim.JTable ile ilgili.Eclipse kullanıyorum ve jtable nesnesini sürükle bırak mantıgıyla forma ekledim. veritabanımdan çektiğim bilgileri JTable a aktarmak istiyorum.ButonClick eventımın arkasında şimdiye kadar ResultSet oluşturmaya kadar geldim.Yani şuan sadece ResultSet nesnesini TableModel a aktardıktan sonra(yazdıklarınızdan öyle anladım),TableModel dan da jTable aktarıp görüntülemek istiyorum.Vektör ile alakalı hiç bir şey oluşturmadım ki gerek varmı bilmiyorum.Yani butonumun arkasında standart baglantı kodları var.
    Yardımınız için şimdiden teşekkürler.

  15. admin on Eylül 8th, 2010 15:01

    Vektörü sanırım kendi tablemodel sınıfımızda kullanmıştık. O sınıfı olduğu gibi kullanmanızı tavsiye ederim JTable ile birlikte. Sorunsuz çalışacaktır. Java’da JTable, JList gibi swing bileşenlerinin bir de jTableModel, JListModel gibi model sınıfları var. Bunun nedeni veriyi tutan (model) ve veriyi gösteren (view) sınıfları birbirinden ayırmak ki buna MVC mimarisi diyoruz ve ayrı bir makale konusu inşaallah.

  16. emre on Ağustos 3rd, 2011 07:59

    Ben swing ile buna benzer bir veritabanı oluşturmaya çalışıyorum jtable oluşturdum sizin myTableModel sınıfınızla verileri de yazdırmayı başardım fakat kolon başlıklarını yazdıramadım acaba bunun için farklı birşey mi yapmam gerekiyor?

  17. Mutlu on Ağustos 25th, 2011 08:28

    Merhabalar,
    Makalelerinizdeki kodları kendi projeme uyarlamaya çalışıyorum. Bir yere kadar geldim ama karşılaştığım sorunu aşamıyorum.
    MyTableModel ile doldurduğum jtable’daki verileri, veritabanından silmeden temizlemek istiyorum. İnternetten pekçok örnek inceledim ama hiçbiri işe yaramadı.

  18. mustafa göksu on Ekim 30th, 2011 11:15

    merhabalar hocam yukarıdaki örneği rnek sınıf kodlarınızla uygularken jtable bir satırı ilk seçimde aşağıdaki alıyorum daha sonraki seçim işlemlerinde bilgileri ilgili textfieldlere aktarılıyor sorun ne olabilir sizce? hata:

    Exception in thread “AWT-EventQueue-0″ java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.elementData(ArrayList.java:371)
    at java.util.ArrayList.get(ArrayList.java:384)
    at myTableModel.getValueAt(myTableModel.java:53)
    at javax.swing.JTable.getValueAt(JTable.java:2720)
    at girispencere.jTable1MousePressed(girispencere.java:476)
    at girispencere.access$1100(girispencere.java:31)
    at girispencere$11.mousePressed(girispencere.java:281)
    at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:280)
    at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:279)

  19. mustafa göksu on Ekim 30th, 2011 11:23

    sayın hocam aşağıdaki görünüm kodunu kaldırınca
    düzeldi neden bu görünümde bu hata oluşuyor sizce
    public girispencere() {
    initComponents();
    //setLookandFeel(UIManager.getSystemLookAndFeelClassName(), this);
    TabloDoldur();

    }

  20. mustafa göksu on Ekim 30th, 2011 12:46

    sayın hocam java appletleri hakkında bir ders hazırlarsanız benim gibi javaya yeni başlayanlara çok yardımcı olursunuz. Örneğin bu programı bir applete çevirip html sayfasında çalıştırabilir miyiz;?

  21. mustafa göksu on Ekim 31st, 2011 14:51

    sayın hocam sizin örneklere bakarak hazırlamaya çalıştığım programda veritabanı ve tablolar eğer mysql de yoksa program içerisinde oluşturmaya çalışıyorum şu şekilde:

    Statement durum;
    try {
    durum = baglantiAc();
    durum.executeUpdate(“CREATE DATABASE IF NOT EXISTS vt”);
    durum.executeUpdate(
    “CREATE TABLE IF NOT EXISTS Users {”
    + ” uid INT NOT NULL PRIMARY KEY,”
    + ” username VARCHAR(32) NOT NULL,”
    + ” worldid INT NOT NULLm FORIEGN KEY REFERENCES Worlds(worldid),”
    + “CONSTRAINT UserNameWorld UNIQUE (username, World)”
    + “};”);

    baglantiKapat();
    KayitGetir(“listele”);//veritabanına bağlanılıyor
    TabloDoldur();
    } catch (Exception ex) {
    Logger.getLogger(girispencere.class.getName()).log(Level.SEVERE, null, ex);
    }

    ama hata veriyor sebebi sizce nedir?

  22. mert yılmaz on Kasım 10th, 2011 15:12

    mrb arkadaşlar hakan arkadaşımız gibi javayı anlatan başka türkçe sayfa var mı?

  23. ismail on Temmuz 2nd, 2012 04:57

    merhabalar..
    şimdi bende mysql veri tabanını kullnarak bir program yazmayı düşünüyorum sıkıntı şu;
    şimdi yazdığım programın veri tabanıda kullandığımdan dolayı başka bir bilgisayarda bu programı çalıştıracam zaman veri tabanını da nasıl taşayacam yada yazdığım programın sorunsuzca başka bi bilgisayarda çalışması için nasıl bir yol izlemeliyim ?? şimdden teşekkürler

  24. admin on Temmuz 2nd, 2012 08:00

    mysql yerine sqlite gibi sunucu gerektirmeyen sadece dosyada ibaret olan bir veritabanı kullanmanız gerekiyor.

  25. bilmüh on Temmuz 3rd, 2012 05:46

    merhaba,
    ekle butonuna kod eklediğimizde,örneğin AdTextField.getText(); kodu yazdığımda sınıf açmam isteniyo hem text field hemde gettext için neden class gerekli?

  26. admin on Temmuz 3rd, 2012 06:23

    aldığınız hata mesajını tam olarak yazar mısınız?

  27. ismail on Temmuz 5th, 2012 07:49

    şimdi mysql veri tabanını kullanarak yazdığım bir programı başka bir bilgisayara taşıyamayacak mıyım?

  28. sezai uçan on Ağustos 16th, 2012 15:22

    mysql veritabanı kullanarak yazdığın programı her bilgisayar tabi ki taşırsın.
    eğer sunucu kullanıyorsan zaten sorun yok, eğer kullanmıyorsan, uygulamanı taşıyacağın bilgisayara da mysql kurmak zorundasın.

  29. admin on Ağustos 16th, 2012 17:19

    Doğru ancak merkezi bir sunucu kullanılmayacaksa mysql kullanmaya zaten gerek yok. Programın kurulacağı her bilgisayara bir de mysql sunucusu kurmak verimli bir yok değil. Böyle programlar için dahili veritabanı diye adlandırabileceğimiz SQLite veritabanı kullanılabilir. Firefox, open office ve benzeri pek çok uygulama böyle çalışıyor. Microsoft ise aynı iş için SQL compact diye bir veritabanı sunuyor.

Okul Zil Programı

yilsoftzil

9786059223690
logo5

Esma-ül Hüsna

Ziyaretçi İstatistikleri

Bugün231
Dün341
Bu hafta2120
Bu ay8315
Hepsi721196