Harun Reşit Zafer

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

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

Netbeans_java_mySQLBu makalede Netbeans, Java ve MySQL ile basit bir veritabanı uygulaması gerçekleştireceğiz. Uygulama basitçe bir tabloya kayıt ekleme, silme ve tablodan kayıt getirme işlemleri yapacak. Bunları yaparken Java Swing paketini kullanarak basit bir görsel arayüz de kullanacağız.

Öncelikle sistemimizde NetBeans + JDK ve MySQL kurulu olması gerekiyor. Daha sonra NetBeans ile MySQL bağlantısını yapmamız ve uygulamada kullanacağımız örnek veritabanının oluşturmamız gerekiyor.  İşin bu kısmını görünlütü olarak anlatmak daha kolay olacağından aşağıdaki videoyu hazırladım. Videoyu izledikten sonra devamında kodlar ve açıklamalar var. Yazının sonunda ise kaynak kodların tamamını indirebilirsiniz.

Not: Videoyu izlemekte problem yaşıyorsanız, buradan indirebilirsiniz.

Örnek veritabanı için gerekli kodlar aşağıdaki gibidir:

Veritabanını oluşturmak için:

CREATE DATABASE IF NOT EXISTS vt;
USE vt;

Kisiler Tablosunu oluşturmak için:

DROP TABLE IF EXISTS `kisiler`;
CREATE TABLE `kisiler` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`Ad` VARCHAR(45) NOT NULL,
`Soyad` VARCHAR(45) NOT NULL,
`Yas` INT(10) UNSIGNED NOT NULL,
`Cinsiyet` tinyint(3) UNSIGNED NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

Kisiler Tablosuna örnek kayıtları eklemek için:

INSERT INTO `kisiler` (`id`,`Ad`,`Soyad`,`Yas`,`Cinsiyet`) VALUES
(1,'Harun Reşit','Zafer',27,1),
(2,'Derya','Deniz',24,0),
(3,'Emir','Aydın',33,1),
(4,'Levent','Denizeri',25,1),
(5,'Abbas','Yolcu',25,1);

Veritabanına Bağlantı

private Connection conn = null; //Bağlantı nesnemiz
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
private ResultSet res; // sorgulardan dönecek kayıtlar (sonuç kümesi) bu nesne içerisinde tutulacak

Yukarıdaki kodda driver isimli değişken önemli. Bu sürücüyü projemize eklememiz gerekiyor. Bunun için resimde gördüğünüz “Libraries” düğümünün üzerine sağ tıklayıp “add library” deyip, açılan pencereden MySQL JDBC Driver’ı seçin ve “Add Library” butonuna tıklayın.
ScreenHunter_01 Jan. 24 19.57

Bu sürücüyü projemize dahil etmeden, programımızın çalışmayacağını hatırlatalım.

Aşağıdaki fonksiyonlar bağlantı açmak ve kapamak için kullanılıyor. Dikkat ederseniz yukarıdaki değerleri aşağıda kullanıyoruz.

public Statement baglantiAc() throws Exception {
    Class.forName(driver).newInstance();
    conn = DriverManager.getConnection(url + dbName + properties, userName, password);//bağlantı açılıyor
    return conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
    //return conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
 
}

Yukarıda ResultSet.CONCUR_UPDATABLE yerine ResultSet.CONCUR_READ_ONLY yazarsak veritabanı salt okunur olarak açılır. Bu durumda kayıtları okuyabiliriz ama kayıt ekle/sil/güncelle işlemlerini yapamayız.

public void baglantiKapat() throws Exception {
    conn.close();
}

Yukarıdaki fonksiyon da bağlantıyı kapatıyor.

Kayıtların Tablodan Alınması

st = baglantiAc(); //veritabanına bağlanılıyor
res = st.executeQuery("SELECT * FROM  kisiler"); //tablodaki kayıtlar getiriliyor

Yukarıdaki sorgunun sonuç kümesi (bu sorgu için tablonun tamamı) res isimli ResultSet nesnesine aktarılıyor. Bu işlem bir kere programın başında yapılıyor. Programın geri kalanında hep res isimli ResltSet nesnemizi kullanarak veritabanı işlemlerini gerçekleştireceğiz.

Kayıtların Metin Kutularına Yazılması

res.next(); //tablonun ilk kaydını göster.
 
adTextField.setText(res.getString("Ad"));
soyadTextField.setText(res.getString("Soyad"));
yasTextField.setText(res.getString("Yas"));
if(res.getInt("Cinsiyet")==1){
    cinsiyetComboBox.setSelectedIndex(0);
}
else{
    cinsiyetComboBox.setSelectedIndex(1);
}

Kayıtlar Arasında Gezinme

res.next() komutu ilk defa kullanıldığında res nesnesinin barındırdığı tablonun ilk kaydına (satırına) gelinir. Daha sonra her res.next() komutu ile bir sonraki kayıda gidilir.

ResultSet nesnesinin ilgili diğer metodları aşağıdaki gibidir:

res.previous(); // bir önceki kayıta git
res.first(); //ilk kayıta git
res.last(); //son kayıta git
res.absolute(3); //3. kayıta git.

Kayıt Ekleme

res.moveToInsertRow(); //Kaydın ekleneceği yeni satıra git
res.updateString("Ad", adTextField.getText()); //"Ad" alanına metin kutusuna girilen değeri ekle
res.updateString("Soyad", soyadTextField.getText()); //"Soyad" alanına "   "    "
res.updateInt("yas", Integer.parseInt(yasTextField.getText()));//"yas" alanına "    "   "
boolean cns;
if (cinsiyetComboBox.getSelectedIndex()==0){
   cns=true;
}
else
{
   cns=false;
}
res.updateBoolean("cinsiyet",cns); //cinsiyet alanına 1 veya 0 değeri ekleniyor
res.insertRow(); //Kaydı (satırı) tabloya ekle

Kayıt Güncelleme

Kayıt eklemeye çok benzediğinden bir daha burada eklemedim. Kodları indirdiğinizde görebilirsiniz.

Kayıt Silme

res.deleteRow();

Görüldüğü gibi oldukça basit. O an üzerinde bulunulan kaydı (satırı) siliyor.

Programın Genel Akış Mantığı

Programın koduna dikkat ederseniz veritabanı bağlantısının program başlarken baglantiAc() ile 1 kere yapıldığını, program sonlanana kadar açık kaldığını ve program kapanırken, bağlantının da baglantiKapat() ile  kapatıldığını göreceksiniz. Bir diğer göze çarpan husus ise ekle/güncelle/sil gibi komutlar için bildiğimiz INSERT/UPDATE/DELETE gibi SQL komutlarının kodda yer almaması. Bu kodlar geri planda çalıştırılıyor.

Peki neden bağlantıyı yalnızca bir defa açıp kapamak için iki metod yazdık?

Bunun cevabını bir sonraki örnekte anlayacağız. O örnekte SQL komutlarını bizzat kendimiz yazıp kullanırken, her veritabanı işlemi için bağlantıyı açıp işlem bittikten hemen sonra bağlantıyı kapatacağız.

Peki ama hangi yaklaşım daha iyi? Elbette 2. örneği de görüp anlamadan bu soruya cevap aramak anlamsız.

Kodların tamamını NetBeans projesi olarak  buradan indirebilirsiniz.

Not: Yaklaşık 1,5 yıl sonra kodda bir hata (Türkçe karakter problemi) farkettim ve yukarıdaki koda “properties” adında bir string daha ekledim. Bu değişikliği kodların bulunduğu proje dosyasında yapmadım. Bunu da ödev olarak size bırakıyorum 🙂

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

63 Yorum

  1. Emeklerinize sağlık hocam çok teşekkür ederiz.

  2. İsa Kalınsaz

    11 Şubat 2010 at 14:34

    Anlatımınız Çok Güzel olmuş.Çok Teşekkürler.Elinize ve ağzınıza sağlık…

  3. ResultSet res = st.executeQuery(“SELECT * FROM kisiler”); //VT’den kayıtları ResultSet’e al

    Burada local variable hides field diye bi hata alıyorum ve bağlantı başarısız oluyor çok uğraştım ama nedenini bulamadım cevaplarsan sevinirim

    • admin

      25 Nisan 2010 at 02:08

      Hata mesajının bir kısmını google’da aratırsanız eminim bir şeyler çıkacaktır. Kaynak kodları indirirdiyseniz bir hata olmaması lazım.

  4. Şükrü GENCER

    25 Nisan 2010 at 08:20

    sa / çok hoş alnattınız teşekkür ederiz

  5. Teşekkürler hocam. Çok başarılı bir anlatım çok sağolun.

  6. hakikaten çok güzel bi anlatım olmuş.Teşekkürler..

  7. mrb bende kurulum sırasında en son execute dedikten sonra hata alıorum start service kısmında ama hala problemi çözemedim ne yapabilirim

    • admin

      09 Haziran 2010 at 02:40

      Sorunu tam olarak anlayamadım. MySQL kurulumunu anlattığım bir video var. Belki o yardımcı olabilir.

  8. s.a hocam bu örnekte “git” butonu çalışmıyor,problemin ne olduğunu söylerseniz sevinirim.

  9. HOCAM BEN MYSQL DE İSME GÖRE ARAMA YAPIP BİLGİLERİ EKRANA YAZDIRMAK İSTİOM SİZ tabloda row ile arama yapmışsınız. res.absolut();
    yardımcı olursanız 😀

  10. local variable hides hatası alan arkadas orda demek istenilen senin res nesnen daha önce tanımlanmıs sanırım programın en basında res die bir result set nesnesi tanımlamıssın veri ilerki bir satırda örneğin bir fomksiyonun içinde tekrar res adında bir result set nesnesi tanımlamak istiyrsun cözüm aadı res den baska bişey yaz mesela ressss gibi

  11. onla bi ilgisi yok res.absolut(); res. den sonraki absolut row adresine göre arama yapacaksın dio. ben ise res. dan sonra ne yazmalıyım ki texfiledin içine yazdığım veri ile arama yapsın

  12. hocam acil cevap verirseniz sevinirim

  13. aziz yücelen

    09 Ekim 2010 at 03:38

    Merhabalar. Bu güzel kaynak için teşekkür ederim.Anlaşılması zaman alacak bir programı çok güzel anlatmışsınız.Devamını bekliyoruz.javadaki report apileri ile ilgili makalenizi bekliyorum.İyi çalışmalar

  14. Çok saolun test ettim hiç bir sorun yok gerçekten iyi bir anlatım olmuş..

    Bir şey sorcaktım Form1 e bi buton koyucam basınca form2 açılcak ve form1 disable olcak. form2yi kapatınca yanlız form2 kapancak form1 gene eski haline döncek bunu nasıl yapabilirim..

    • admin

      29 Ekim 2010 at 11:41

      Frame2’in constructor’ına Frame1’i parametre olarak gönderirsen Frame2 kapanırken tekrar frame1’i çağırabilirsin.

      JFrame2 pencere2 = new JFrame2(pencere1); // bu 2 satır kod pencere1’deki buton’a basıldığında çağırılacak.
      this.setVisible(false); // birinci pencere kendini görünmez yapıyor

      public JFrame1 (JFrame2 parent){ // bu da pencere1’in yapıcı metodu
      this.parent = parent;
      }

      // Kodları doğrudan yazdım ama test etmedim. Neticede ana fikir bu.

  15. Ahmet TAÇGIN

    15 Kasım 2010 at 00:26

    hocam süpersin her yerde arayıpta bulamadığımız kaynak ellerin dert görmesin …

  16. Çok fayfali bigiler paylastiğin için tesekkürler…

  17. Hocam elinize sağlık ancak bu kod kısmını videolu olarak anlatma durumunuz yokmu..Kod kısmını yapamadığımız için becermedik. Yada örnek olarak projeyi gönderseniz. Şimdiden çok teşekkür ederiz.

    • admin

      29 Mart 2011 at 02:45

      Kodları makalenin sonundan indirebilir ve Netbeans’te proje olarak açıp çalıştırabilirsiniz.

  18. yakup başer

    31 Mart 2011 at 16:53

    döküman ve videolarınız için teşekkür ederim. Gerçekten işime yaradı.

  19. hocam bütün kodları uygulamamız lazım dimi uygulama derken eklememiz lazım misal driver için add library ondan önceki kodları yapıştırıp çalıştırmamız lazım değil mi?

  20. bahtsızbedevi

    30 Nisan 2011 at 14:33

    teşekkürler +rap +respect

  21. Sayın hocam, Javaya yeni başladım. VB C# ile ilgilenmiştim. Verdiğiniz emek ve paylaşım için teşekkürler. Sorum : 1-) MDI form uygulaması olabilir mi?
    2-) 300 kullanıcı bir java Desktop uygulaması+ MySQL yaparsak kodların güvenliğini alabilir miyiz?

    Kendinize iyi bakınız

  22. hocam tüm kodları incelemek için alabilir miyiiz

  23. teşekkürler hocam ellerinize sağlık

  24. Mehtmet Kutlu

    10 Eylül 2011 at 01:28

    Merhabalar,

    Öncelikle yukarıda detaylı açıklamalarınız için teşekkürler.Aşağıda karşılaştığım bir problemi size aktarıyorum.Umarım fazla zamanınızı almam.
    Netbeans ortamnında veritabanı(Şuan MySQL) projesi sorunsuz olarak çalışmasına rağmen başka ortamda(hem aynı windows ortamında hem de linux ortamında) Jar dosyası çalışmıyor.Herhangi bir hata da almıyorum.(MySQL Connectoru hem derleme hem de çalışma kısmına ekledim.Yani,orada sorun yok.Projenin oluştuğu pathdeki dist klasöründe hem jar dosyası hem de mysql connector için gerekli ilintiyi görebiliyorum.Ancak Jar dosyası çalışmıyor.).Bu durum ile karşılaştınız mı veya önerebileceğiniz bir çözüm var mı?

    Kolay Gelsin.

    • admin

      10 Eylül 2011 at 02:03

      Öncelikle boş bir desktop uygulaması aç netbeans ile ve pencereye bir buton at. Derle ve jar dosyasını çalıştır. Eğer ekranda pencere görünmüyorsa, jar’ların çalıştırılabilir değil demektir ki çözümünü internetten bulabilirsin. Çalışyorsa muhtemelen veritabanı bağlantısında bir problem vardır. Koddaki try catch bloklarında hata durumunda ekrana bir mesaj kutusu vb. çıkaracak bir kod var mı? Yoksa catch içine bunları yaz ve hatayı görmeye çalış. İlk etapda aklıma gelenler bunlar.

  25. Tekrar Merhaba,
    Veritabanı uygulaması dışındaki projelerimin Jar dosyaları normal olarak çalışıyor.Tek sıkıntı Veritabanı ile bağlantılı projelerde.
    Verdiğin öneriler için teşekkürler, onları deneyeceğim.

    Kolay Gelsin.

  26. Teşekkürler bu değerli paylaşımınız için. Videolu anlatım tabi büyük bir artı…

  27. Tekrar merhabalar,
    Daha önce mesajımda(şu an onaylanmadığından görünmeyen mesaj) da belirttiğim gibi sadece veritabanı projelerinin jar dosyalarında çalışmama durumu var(Normal uygulamaların jar dosyaları problemsiz çalışıyor).Try-catch bloklarında herhangi bir hataya rastlayamadım.İlk etaptaki öneriniz dışında bir öneriniz var mı?

    Kolay Gelsin.

    • admin

      13 Eylül 2011 at 08:20

      Benim demek istediğim catch{ } içerisinde eğer kod yok ise, yani boş ise veritabanına hatsını (ya da try içerisindeki kod her ne yapıyor ise) hasır-altı edecektir. Bu yüzden catch içerisinde oluşan bu hatayı kullanıcıya bildiren bir kod olmalı. Örneğin ekrana bir mesaj kutusu çıkabilir. Yanılmıyorsam benim kodlar bu şekilde. Onlara bir bakabilirsiniz. Bunun dışında aklıma gelen bir şey yok ne yazık ki.

  28. Catch içerisinde kullanıcıya hatasını bildiren “hata mesaj kutusu” boş olarak geliyor.
    (Tamamen boş bir frame olarak düşün.)
    Önerilerin için teşekkürler.
    Kolay Gelsin.

  29. volkan gülbudak

    26 Eylül 2011 at 15:17

    hocam elinize sağlık gerçekten çok iyi bilgilendirmişsiniz…

  30. Ahmet Güneş

    05 Ekim 2011 at 09:50

    Merhaba,
    Ben Netbeans üzerinden MySQL’e bağlanmak istiyorum.Ancak ” ERROR 1045 : Access denied for user ‘@’localhost’ (using password: NO)” mesajını alıyorum.Bu sorunu nasıl çözebilirim?

    • admin

      06 Ekim 2011 at 04:29

      Mysql kullanıcı adınızı ve şifrenizi doğru girmeniz gerekiyor. Varsayılan olarak kullanıcı adı root, şifre kısmı ise boştur.

  31. Mustafa Göksu

    28 Ekim 2011 at 07:01

    s.a hocam dersler çok güzel elleriniz sağlık.
    yukarıdaki örneği uygularken türkçe karekter problemi yaşıyotum bunun sebebi sizce nedir?

  32. Mustafa Göksu

    28 Ekim 2011 at 11:28

    yukarıda verdiğiniz adımları izleyerek netbeans içinde veritabanı ve tablomu oluşturdum mysql üzerinde herhangi bir ayar yapmadım. Mysql içinde ayrı bir ayar yapmam gerekiyor mu ?

  33. Mustafa Göksu

    28 Ekim 2011 at 12:14

    hocam sorun benden kaynaklanıyor yanlış mysql paketini kurmuşum mysql kurulumu ile ilgili video izlediğimde farkettim teşekkür ederim

  34. Mustafa Göksu

    28 Ekim 2011 at 13:22

    sayın hocam vs c# daki datagridwiev deki gibi netbeans da kullanabileceğimiz bir nesne var mı?

  35. Çok teşekkür ederim. Ne kadar yardımcı oldugunuzu tahmin edemezsiniz

  36. Hocam eline saglık fakat MYSQL yerine Easy Php ile veri tabanı yapmak daha kolay ben bunu kullanıyorum çokkolaylıgı car apachi,php server ve mysql içinde tek paket aklınızda bunnsun kolaylık sağlar

  37. hocam merabalar,

    veritabanıyla yapılan projeleri jar ladığımız zaman benim bilgisayarımda program çalışıyor sorunsuz olarak ancak jar dosyasını başka bir bilgisayara attıgım zaman çalışmıyor. Yani demek istediğim database i proje içine nasıl gömeceğiz. Kullanıcı database i kendi bilgisayarına kurmadan direk programı çalıştırdığı zaman kullanılabilir hale nasıl getirebiliriz.

    • admin

      22 Ocak 2012 at 07:28

      Bunun için SQLite gibi sunucu gerektirmeyen bir veritabanı kullanman gerekiyor. MySql ile mümkün değil.

  38. merhabalar.ben Mysql i kurum aşamasında en extcute diyorum start services te takılıyo program yanıt vermiyo.kapatıp programlardan baktığımda mysql kurulu görünüyo ama yönetimsel araçlar/hizmetlerden mysql i başlatmak istediğimde başlatamıyor.sorun nedir acaba…

  39. ha bu arada işletim sistemim w 7.xp ye kurdum çalışıyo sanki başka bir program hizmetlerin başlamasını engelliyo gibi ???

    • admin

      03 Mart 2012 at 04:07

      Mysql’in kullandığı port 3306 başka bir hizmet tarafından kullanılıyor olabilir. Hizmetin neden başlatılamadığına dair bir hata mesajı olmalı bir yerlerde. Mesela sistem olayları log’unda. Onu bulup google’da aratın. şu anda ilk aklıma gelen bu.

  40. hocam ellerineze saglik, cok faydali bir calisma olmus. Boyle calismalarin devamini dilerim..:)

  41. Mysql i birkere kurup kaldırınca c: de data klasörü silinmiyormuş.Tekrar kurmadan önce bu klasörü manüel olarak silmek lazımmış.silinmediği takdirde mysql kurulumunda start services te takılıp kalıyo

  42. birinci pencereden bir kisinin ismini ve sifresini girdiginde ikinci pencerede veri tabanindan(Mysql) o kisiye ait bilgileri nasil goruntuleyebiliriz.

  43. elinize emeğinize sağlık hocam gerçekten güzel bi anlatım olmuş bi teşekkürü çok görmemek lazım

  44. Merhaba, ben de java’yı yeni yeni öğrenmeye başladım. Sitedeki kaynaklar gerçekten çok faydalı. Arkadaşlar gibi ben de rica etsem, eğer proje mevcutsa, onu da alabilir miyiz? Hangi sınıfta, hagi kodun yazıldığını tam olarak çıkartamadım açıkcası.

    • admin

      29 Nisan 2012 at 10:51

      Kodları indirmek için gerekli link makalenin sonunda mevcut. Sitedeki derslerle ilgili tüm kodlar herkese açık.

  45. aa evet gözümden kaçmış.. tekrar teşekkürler..

  46. hocam row’a göre deilde isme/diğer satırlara göre sorgulama/arama yapmak için ne yapmamız gerekio ?

    • admin

      04 Mayıs 2012 at 07:29

      Row’a göre değil Id kolonuna göre arama yapıyoruz. Çünkü bulan birincil anhtar veritabanında. Sonra da bu Id değerinin bulunduğu satırı (row’u) siliyoruz/güncelliyoruz.

  47. hocam Statement ifadesinin ne işe yaradığından bahsede bilir misiniz?

    Statement st; // SQL komutumuz için

    st = baglantiAc(); //veritabanına bağlanılıyor
    ————————————————
    public Statement baglantiAc()

  48. Isabek Tashiev

    06 Temmuz 2012 at 05:04

    Hocam ben Java + Accesste sozlük yapıyordum. Ne yazık ki jList Turkçe harfleri tanımıyor. Utf-8 kullandım , ama bir türlü yapamadım . Yardımınızı bekliyorum , teşekkür ederim.

    Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”).newInstance();
    Properties props = new Properties();

    props.put(“user”,””);
    props.put(“password”,””);
    props.put(“Encoding”, “utf8”);
    props.put(“CharSet”, “utf8”);

    Connection connection = DriverManager.getConnection(“jdbc:odbc:WORDS”,props);

  49. Isabek Tashiev

    06 Temmuz 2012 at 05:05

    Turkçe ı,ğ,ü,ş,ç,ö bu harfleri tanımıyor onların yerine soru (?) işareti geliyor

    • admin

      10 Temmuz 2012 at 15:17

      Yazıdaki Veritabanına Bağlantı bölümüne dikkat edin:
      private String properties= “?useUnicode=true&characterEncoding=utf8”; //Türkçe karakter problemi yaşamamak için

Bir cevap yazın

E-posta adresiniz yayınlanmayacak

*

© 2022 Harun Reşit Zafer

Temayı tasarlayanAnders NorenYukarı ↑