Harun Reşit Zafer

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

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

Netbeans_java_mySQL
İlk iki yazıyı okuduğunuzu kabul ederek başlıyorum. İlk yazıda veritabanı bağlantısını en başta açmış, en sonda da kapamıştık. Program çalıştığı müddetçe veritabanı bağlantısı açık kalmıştı. Bunun yanında yine programın en başında yalnızca bir defa ResultSet nesnemizi “SELECT * FROM kisiler” SQL sorgusunu kullanarak, kisiler tablosundaki tüm kayıtlar ile doldurmuş ve programın kalanındaki ekle/sil/güncelle gibi işlemleri SQL sorgusu yazmadan gerçekleştirmiştik.

İkinci örnekte ise seç/ekle/sil/güncelle gibi her veritabanı işlemi için gereken sorguyu kendimiz yazmış, her sorguyu çalıştırmadan önce veritabanı bağlantısını açıp sorgu çalıştıktan hemen sonra bağlantıyı kapatmıştık.

Binlerce kullanıcının aynı anda kullandığı bir uygulama için, örneğin bir web uygulaması için ilk yaklaşımın pek de makul olmadığını belirtmiştim. Zira bu aynı anda binlerce veritabanı bağlantısının açık olması demek.

İkinci örneğin en büyük dez avantajı SQL sorgularını String olarak yazmadaki zorluk. Aşağıdaki koda bir bakın:

public void KayitEkle(String ad, String soyad, String yas, String cinsiyet)  throws Exception{
 
    Statement st = baglantiAc();
    String sql = "INSERT INTO vt.kisiler (Ad, Soyad, Yas, Cinsiyet) VALUES ("
    + "'" + ad + "', "
    + "'" + soyad + "', "
    + "" + yas + ", "
    + "" + cinsiyet + ")";
 
    st.executeUpdate(sql); //sorguyu çalıştır
    baglantiKapat(); //bağlantıyı kapat
}

Yukarıdaki SQL sorgusunu yazmak gerçekten zahmetli bir iş. Ben şu ana kadar bir defada hatasız yazamadım. Tek tırnak, virgül, boşluk gibi karakterlerden birini unutmak sorgunun hatalı olmasına yetiyor.

Şimdi bir de aşağıdaki koda bakın:

public void preparedKayitEkle(String ad, String soyad, String yas, String cinsiyet)  throws Exception {
 
    String sql="insert into Kisiler (Ad, soyad, yas, cinsiyet) values (?,?,?,?)";
 
    PreparedStatement prepared = baglantiAc(sql);
    prepared.setString(1, ad);
    prepared.setString(2, soyad);
    prepared.setInt(3,Integer.parseInt(yas));
    if (cinsiyet.equals("1"))
        prepared.setBoolean(4, true);
    else
        prepared.setBoolean(4, false);
 
    prepared.executeUpdate(); //sorguyu çalıştır
}

Gördüğünüz gibi SQL sorgusunu String olarak yazmak çok daha kolay. Değer alanlarını birer “?” karakteri ile belirtip aşağıda sırası ile hangi soru işareti yerine hangi değerin geleceğini belirtiyoruz.

Yukarıdaki kodda Java’nın PreparedStatement (hazır ifade) sınıfını kullandık. PreparedStatement sınıfını kullanabilmemiz için baglantıAc() metodumuzda ufak bir değişiklik yapmamız gerekiyor:

public PreparedStatement baglantiAc(String sql) throws Exception {
    Class.forName(driver).newInstance();
    conn = DriverManager.getConnection(url + dbName, userName, password);//bağlantı açılıyor
 
    return conn.prepareStatement(sql); //sorguya uygun hazır ifadeyi döndür
}

İkinci yazıdaki kodun PreparedStatement kullanan versiyonunu buradan indirebilirsiniz.

Ama sadece kayıt ekle kısmı için bu değişikliği yaptım, diğer kısımları değiştirmek size kalıyor. Öğrenebilmeniz adına kolay ama faydalı bir egzersiz olacağını düşünüyorum.

Herkese Kolay Gelsin

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInPrint this pageEmail this to someone

23 Yorum

  1. volkan yaylacı

    07 Temmuz 2010 at 00:54

    hocam eline sağlık java ile gui+veritabanı olayını sayende öğrendik.
    ben raporlama olayını merak ediyorum ancak işe yara bişe bulamadım.
    yaptığımız sorgu sonucu istersek bilgileri yazdırabileceğimiz bir örnek çalışma yaparsanız gerçekten müthiş yararlı olur diye düşünüyorum.
    iyi çalışmalar…

  2. merhaba;
    uygulama çok güzel. epey bir fikir edindim, elinize sağlık. bir sorum olacak; mysql veya javadb kullandığımızda, programı clean&build yaptıktan sonra başka bilgisayarlarda nasıl çalıştırırız? daha açık anlatayım; ben javadb ile benzer bir program yaptım. javadb, netbeans ile birlikte otomatik olarak başlatıldığı için derleyici açık olduğu sürece programı masaüstünden çalıştırmak sorun olmuyor. derleyiciyi kapatınca javadb de kapandığı için programı çalıştıramıyorum. yani javadb’yi manuel olarak başlatamıyorum. mysql’de böyle bir sorun yok, kendisi kurulunca otomatik olarak başlıyor nasıl olsa.. ama, başka kullanıcılara programı dağıttığımda mysql kurmayı unutmayın da diyemem sonuçta. lütfen bu konuda yardımcı olun. günlerdir kafamı meşgul ediyor. şimdiden teşekkürler…

    • admin

      13 Temmuz 2010 at 07:49

      Sorunuzun cevabı SQLite. Sunucu ve ayar gerektirmeyen bir veritabanı sistemi. Bizzat kullanmadım ama tam olarak ihtiyacınız olan veritabanının bu olduğunu biliyorum.

  3. Merhabalar,
    Siteniz gerçekten çok başarılı. Tebrik ederim.
    Bu SQLite programı hakkında da bir makale yazar mısınız?

  4. Hocam ben sizin 3 uygulamanızıda uyguladım…
    Çok güzel uygulamalar..
    Bana birde veri tabanından aldığımız tabloyu yazıcıdan çıkarabilmem için yazdır butonu lazım ve türkçe sayfalarda yok siz bunun hakkında bir makale yazarsanız minnettar oluruz…

  5. Hocam merhabalar,

    Ben yaklaşık 4 yıldır PHP ile ilgileniyorum. Şu sıralar Java ve MySQL’i beraber kullanmayı öğrenmeye çalışıyorum. Yazılarınız benim durumumdaki insanlar için biçilmiş kaftan. Bunun için size ne kadar teşekkür etsek az.

    Bu yazınızdaki preparedKayitEkle adlı fonksiyonun çalışma prensibini görünce bizim PHP’de kullandığımız sprintf fonksiyonu aklıma geldi. Tüm SQL sorgusunu kendi elimizle yazmadığımız, ama sorguyu göz ile de kontrol edebileceğimiz bir yöntem bence bu. Yani yazıda karşılaştırdığınız KayitEkle ve preparedKayitEkle fonksiyonlarının ortası bence.

    Java’da sprintf fonksiyonunun dengi, String sınıfının format fonksiyonu. O halde benim anlatmak istediğim fonksiyon şu şekilde tanımlanıyor:

    public void formatliKayitEkle(String ad, String soyad, String yas, String cinsiyet) throws Exception {

    String sql = “INSERT INTO kisiler (Ad, Soyad, Yas, Cinsiyet) values (‘%s’, ‘%s’, ‘%d’, ‘%d’)”;

    sql = String.format(sql, ad, soyad, Integer.parseInt(yas), Integer.parseInt(cinsiyet));

    Statement st = baglantiAc(sql); // 1. yazıdaki baglantiAc fonksiyonu, dikkat!

    st.executeUpdate(sql);

    baglantiKapat();

    }

    Aslında sizin de gördüğünüz gibi preparedKayitEkle’den çok da faklı değil ama benim daha çok hoşuma giden bir yöntem bu. Faydalı olması dileğiyle..

  6. preparedStatement ile veritabanındaki bir veriyi değişkene nasıl aktarabilirim? Bir türlü yapamadım hep sql cümleciği olarak yapıyor.

    • admin

      10 Ekim 2010 at 14:07

      3 makalenin de kaynak kodlarını yazıların sonundaki linkten indirebilirsiniz. Kodları incelerseniz sorunuzun cevabını bulacaksınız.

  7. Merhaba; yaptığınız bu güzel çalışmadan ötürü sizlere ne kadar teşekkür etsek azdır. İnternet üzerinden oldukça kıt türkçe kaynak bulabiliyoruz. Benim de öğrenme iştahım fazla esasında. Sizden ricam veritabanı uygulamalarında “resim ekleme” “resimleri listeleme” gibi bir uygulama daha hazırlayabilir misiniz. Mesela mevcut uygulamadaki kişilerin bir de fotoğraflarını eklemek ve daha sonra kişilerin detaylarında da resimlerini görmek istiyoruz. Bu durumda nasıl bir yol izlememiz gerekir? Değerli çalışmalarınız için çok teşekkür ediyor başarılarınızın devamını diliyorum.

  8. Merhabalar hocam,
    Siteniz gerçekten çok iyi. Tebrik ederim.

  9. 3 Yazınızıda okudum ve gerçekten çok güzel bir şekilde anlatmışsınız. Tebrik ederim.

  10. hocam size bir sorum olacak veritabanı da procedureler ile nasıl çalışılır bir örnek verebilirmisiniz

  11. mrb hocam bazen preparedstatement bazen da statement kullanıyorsnz bu ikisi arasndaki fark nedir
    ??

  12. gerçekten çok yararlı bilgiler vermişsiniz.. çok teşekkürler

  13. merhabalar…
    benim buna benzer geliştirdiğim bir program var arayüzün birinde arayüz her açıldğında o anki saati ve tarihi textfield a yazıyor.ama bunun değiştirilemez olması lazım.amacım o anki saati ve tarihi veri tabanına kayıt etmek text field lara saat ve tarihler geldiktek sonra kolayca el ile değişiebiliyo bunu nasıl engellerim.

  14. Hocam
    Yazılarınızı merakla takip ediyorum. Benim java ve mysql ile ilgili bir sorum var.
    win xp olan makinada netbeans üzerinde java ile bir proje geliştirdim.Bu makinada program sorunsuz mysqle bağlanıp verileri getiriyor.
    win 7 homebasic 64 bit üzerine mysql kurdum. java kurdum. Projenin olduğu dist dosyasını bu makinaya kopyaladım. jar dosyasını tıklayınca yapmış olduğum form ekranı geliyor. mysqlden data çağıramıyor. Acaba neyi eksik yapıyorum. Bilgilendirirseniz çoksevinirim. İyi çalışmalar dilerim.

    • admin

      25 Temmuz 2012 at 09:13

      Aynı veritabanını yeni mysql kurulumu üzerinde de oluşturdunuz mu? Ayrıca bağlantı parametrelerinin doğruluğunu tek tek kontrol edin. Yani şunları:

      private String url = “jdbc:mysql://localhost:3306/”;//veritabanının adresi ve portu
      private String dbName = “vt”; //veritabanının ismi
      private String properties= “?useUnicode=true&characterEncoding=utf8”; //Türkçe karakter problemi yaşamamak için
      private String driver = “com.mysql.jdbc.Driver”;//MySQL-Java bağlantısını sağlayan JDBC sürücüsü
      private String userName = “root”; //veritabanı için kullanıcı adı
      private String password = “”; //kullanıcı şifresi

  15. Hocam emeğine sağlık. 3 gündür şu zımbırtıyı Sakarya Üniversitesinin derslerinden ve internetten araştırıyorum senin gibi anlatabilen olmadı. Sonunda istediğim bilgiyide sayende aldım.

  16. Çok güzel bir anlatım olmuş. Elinize sağlık….

  17. hocam çok teşekkürler harika olmuş ama kaynak kodları bulamadım ben

  18. Hocam merhabalar. MySQL ile ilgili anlatımlarınız çok beğendim. Elinize emeğinize sağlık. Bir sorum olacak (Visual Studio) C# da olduğu gibi bir Entity-Facade yapısını Java da nasıl kurabililiriz. Hani C#’da Facade kullanarak Stored Procedure çalıştırma şansımız var. Ayrıca bir DataTable a sorgudan gelen verileri yükleyip istediğimiz gibi kullanabiliyoruz.Bu Java’da nasıl bir hal alıyor? Umarım anlatabilmişimdir. Bununla ilgili ufakta olsa bir Örnek yapabilir misiniz?

Bir Cevap Yazın

E-posta adresiniz yayınlanmayacak

*

© 2016 Harun Reşit Zafer

Temayı tasarlayanAnders NorenYukarı ↑