19 Haziran 2012 Salı

Java'da Dosya ve Klasör Oluşturma, Yönetme



Dosya ve klasör oluşturmak için Java'nın BufferedReader, File, ve FileWriter sınıflarını kullanmamız gerekmektedir. Aşağıdaki örnekte projenin içine bir klasör oluşturup, bu klasörün içine txt uzantılı bir dosya atıp, dosyanın içine birkaç cümle yazacağız.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class FolderAndFile {
    public File file;

    public static void main(String[] args) {
        FolderAndFile faf = new FolderAndFile();
        
        faf.createFolder();
        faf.createFile();
        faf.write();
    }
    
    private void createFolder() {
        File dir = new File("Klasor");
        dir.mkdir(); // Klasör oluşturuluyor
    }
    
    private void createFile() {
        try {
            file = new File("Klasor\\Dosya.txt");
            file.createNewFile(); // Dosya oluşturuluyor
        } catch (IOException ex) {
            Logger.getLogger(XmlBuildier.class.getName()).log(Level.SEVERE, null, ex);
        } 
    }

    private void write() {
        BufferedWriter bfrWriter = null;
        try {
            bfrWriter = new BufferedWriter(new FileWriter(file));
            
            bfrWriter.write("Ne Mutlu Türküm Diyene."); // Dosyaya yazılıyor
            bfrWriter.newLine(); // Yeni satıra geçiliyor
            bfrWriter.write("Hayatta En Hakiki Mürşit İlimdir.");
        } catch (IOException ex) {
            Logger.getLogger(XmlBuildier.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            //BufferedWriter kapatılıyor
            try {
                if (bfrWriter != null) {
                    bfrWriter.flush();
                    bfrWriter.close();
                }
            } catch (IOException ex) {
            }
        }
    }
}

Örnek uygulamamızda görüldüğü üzere createFolder metodu ile klasörümüz oluşturuldu, createFile metodu ile dosyamız klasörümüzün içine atıldı, write metodu ile de txt uzantılı dosyamıza Atatürk'ten iki cümle yazdık.

Dikkat ederseniz dosyaları oluştururken C: gibi bir dizin adresi vermedim. Dosyayı oluşturmak için "Klasor\\Dosya.txt" yazdım. Adresi bu şekilde yazdığınız takdirde söz konusu klasör, projenizin bulunduğu klasörün içinde oluşturulacaktır.

Eğer ki sizin belirleyeceğiniz bir dizine atmak istiyorsanız dizinin tam adresini yazabilirsiniz. Adresi yazarken atlatıcı \ bayraklarını koymayı unutmayın. Örneğin C:\Egemen diye bir klasörün içine Hamutcu adında bir XML dosyası açacaksınız. Bunun içine verilecek adres kısmına "C:\\Egemen\\Hamutcu.xml" yazmanız gerekmektedir. Aynı şey klasör oluşturmak için de geçerlidir.

Programı çalıştırdığınız zaman txt dosyasında bulacağınız çıktı şöyle olacaktır:

Ne Mutlu Türküm Diyene.
Hayatta En Hakiki Mürşit İlimdir.

Son olarak write metodundaki finally bölümünde flush ve close metodlarını çağırarak BufferedWriter objemizin içini boşaltarak RAM'i rahatlatıyoruz.

Bu şekilde klasör ve dosya oluşturma, içine yazı yazma işlemlerini halledebiliriz.

15 Haziran 2012 Cuma

Genişletilmiş ExpandableListView Rehberi



Android'in birçok projesinde ExpandableListView gösterimine ihtiyaç duyulmaktadır. Uygulamayı kategorilere ayırmak, kategorilerin altına menüler eklemek hem kullanıcıya daha pratik bir kullanım sunar hem de Android'in bilgisayarın aksine daha küçük ekranlarda çalışmasından ötürü kullanıcıya kullanım kolaylığı sağlar.

Fakat ExpandableListView sanıldığı aksine her projede farklı ihtiyaçlar gerektirir ve programlama tarafında oldukça zorlu bir süreçtir. Bu girdimizde diğer tutorial'ların yaptığı gibi tek bir ekrana tek bir expandablelistview gösterimi aksine piyasadaki birçok projeye uyum sağlayabilecek bir Activity'nin içinde herhangi bir yere yerleştirebilecek expandablelistview gösterilecektir.

Anlatacağımız örneğin program mimarisi Sağlık Bakanlığı için hazırladığım bir projeden alınmıştır.

Projemize başlarken ExpandableListView ile ilgili sınıfımızı yerleştirmek istediğimiz ekranın Activity sınıfının içine private halde yazacağımızı hatırlatmamızda fayda var.

Android projemizi oluşturalım, ben ExpandableListViewTutorial adında bir proje oluşturdum. Projemize Activity'mizin içine yerleştirilecek ExpandableAdapter adında BaseExpandableListAdapter sınıfından inherit edilmiş private bir sınıf yazarak başlayalım.

public class ExpandableListViewTutorialActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    
    private class ExpandableAdapterHA extends BaseExpandableListAdapter {
     
    }
}

Şimdi sıra yazdığımız sınıfın içini doldurmaya geldi. ExpandableListView'ın ihtiyaç duyduğu bütün metodları teker teker içine yazacağız. Eğer Eclipse IDE'si kullanıyorsanız proje bu halde hatalı duracaktır, Eclipse size bu metodları otomatikman yazıp içini doldurmaya hazır hale getirecektir.

public class ExpandableListViewTutorialActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    
    private class ExpandableAdapter extends BaseExpandableListAdapter {
     private String[] groups = { "Türk Erkek İsimleri", "Türk Kız İsimleri", "Yabancı Erkek İsimleri", "Yabancı Kız İsimleri" };
     private String[][] children = { { "Ahmet", "Mehmet", "Egemen", "Poyraz" }, { "Ayşe", "Fatma", "Fadime", "Sıdıka" }, { "John", "Kennedy", "Stejan", "Ivan" }, { "Jeniffer", "Angelica", "Roberta", "Eva", "Meg" } };

     @Override
     public Object getChild(int groupPosition, int childPosition) {
      // TODO Auto-generated method stub
      return children[groupPosition][childPosition];
     }

     @Override
     public long getChildId(int groupPosition, int childPosition) {
      // TODO Auto-generated method stub
      return childPosition;
     }

     public TextView getGenericView() {
            // Layout parameters for the ExpandableListView
            AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT, 64);

            TextView textView = new TextView(ExpandableListViewTutorialActivity.this);
            textView.setLayoutParams(lp);
            // Center the text vertically
            textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
            // Set the text starting position
            textView.setPadding(10, 0, 0, 0);
            return textView;
        }
     
     @Override
     public View getChildView(int groupPosition, int childPosition,
       boolean isLastChild, View convertView, ViewGroup parent) {
      // TODO Auto-generated method stub
      TextView textView = getGenericView();
            textView.setText(getChild(groupPosition, childPosition).toString());
            return textView;
     }

     @Override
     public int getChildrenCount(int groupPosition) {
      // TODO Auto-generated method stub
      return children[groupPosition].length;
     }

     @Override
     public Object getGroup(int groupPosition) {
      // TODO Auto-generated method stub
      return groups[groupPosition];
     }

     @Override
     public int getGroupCount() {
      // TODO Auto-generated method stub
      return groups.length;
     }

     @Override
     public long getGroupId(int groupPosition) {
      // TODO Auto-generated method stub
      return groupPosition;
     }

     @Override
     public View getGroupView(int groupPosition, boolean isExpanded,
       View convertView, ViewGroup parent) {
      // TODO Auto-generated method stub
      TextView textView = getGenericView();
            textView.setText(getGroup(groupPosition).toString());
            return textView;
     }

     @Override
     public boolean hasStableIds()
      // TODO Auto-generated method stub
      return true;
     }

     @Override
     public boolean isChildSelectable(int groupPosition, int childPosition) {
      // TODO Auto-generated method stub
      return true;
     }
    }
    }
}

Sınıfın içindeki kodlara dikkat ederseniz Override edilmiş bütün sınıflar ExpandableListView'ın temelde ihtiyaç duyduğu metodlardır. Override edilmemiş metodumuz listedeki her item'ın görünümünü belirlemede kullanılmaktadır.

Sınımızda kullandığımız arrayler ise listemizdeki başlıkları ve alt başlıkları belirlemektedir. Tek boyutlu array başlıkları, iki boyutlu array alt başlıkları göstermektedir. Mesela children[2][1]'deki değer, 3. başlığın 2. alt başlığını göstermektedir.

ExpandableAdapter'ımızı bitimiş olduk. Sıra gelelim asıl Activity'mizdeki düzenlemelere. Öncelikle ExpandableListView sınıfına ait private bir global değişken atıyoruz ve bu değişkeni XML'imizde bulundurduğumuz expandablelistview'ımıza atayıp içini doldurmak üzere ExpandableAdapter sınıfımıza entegre ediyoruz.

public class ExpandableListViewTutorialActivity extends Activity {
 private ExpandableListView list; //Global değişkenimiz
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        final ExpandableAdapter mAdapter = new ExpandableAdapter(); //adaptörümüz
        list = (ExpandableListView) findViewById(R.id.expandableListView1); //Xml'imizdeki explistview'ımızı global değişkenimize atıyoruz
        list.setAdapter(mAdapter); //global değişkenimizi adaptörümüze bağlıyoruz
    }
}

Bu noktadan itibaren ExpandableListView'ımız uygulamamızda içindeki bütün itemlarıyla beraber görünecektir.

Şimdi gelelim bir kaç ince ayara. ExpandableListView'ımızda bir başlığı açtığımızda önceden açtığımız başlık açık kalıyor ve ekranda çok fazla yer kaplıyor, eğer bu telefonda çalışıyorsa zaten ekrandan taşıyor. Bir başlığı açtığımızda diğer bütün açık kalan başlıkları kapanmasının daha rahat bir kullanım sunacağı düşüncesiyle ExpandableListView'ımıza bir event yazalım.

public class ExpandableListViewTutorialActivity extends Activity {
 private ExpandableListView list; //Global değişkenimiz
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        final ExpandableAdapter mAdapter = new ExpandableAdapter(); //adaptörümüz
        list = (ExpandableListView) findViewById(R.id.expandableListView1); //Xml'imizdeki explistview'ımızı global değişkenimize atıyoruz
        list.setAdapter(mAdapter); //global değişkenimizi adaptörümüze bağlıyoruz

        //ExpandableListView ile alakalı her event'i onCreate metoduna yazıyoruz
        list.setOnGroupExpandListener(new OnGroupExpandListener() {
        public void onGroupExpand(int groupPosition) {
            int len = mAdapter.getGroupCount();
            for (int i = 0; i < len; i++) {
                if (i != groupPosition) {
             list.collapseGroup(i);
         }
            }
        }
        });
    }
}
Bu meseleyi de hallettik, bu örnekle de kodun içinde de yazdığım gibi ExpandableListView ile ilgili bütün eventleri onCreate metoduna yazmamız gerekiyor. Buraya kadar geldik, peki her başlığın alt başlığına tıkladığında programımızın birşeyler yapmasını nereden halledeğiz? Bu sorunun cevabı elbet bir başka eventte yatıyor: onChildClick

Bu eventimizi de onCreate metodumuza yazıyoruz.
list.setOnChildClickListener(new OnChildClickListener() { 
         @Override
         public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
          // TODO Auto-generated method stub   
          if(groupPosition==3)
          {
           if(childPosition==0)
           {
            PokeAndroid();
           }
          }    
            return false;
           }

           private void PokeAndroid() {
            // TODO Auto-generated method stub
            Toast msg = Toast.makeText(ExpandableListViewTutorialActivity.this, "Poke", Toast.LENGTH_LONG);
                        msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
                        msg.show();
           }
        });
Gördüğünüz üzere eventi set edip if yapılarıyla ana başlığın (groupPosition) 4. sırasındaki itemın ilk alt başlığına (childPosition) ulaşarak buraya bir PokeAndroid metodu atadık. Yani Yabancı Kız İsimleri ana başlığındaki Jeniffer isimli alt başlığa tıkladığımızda uygulamamız 'Poke' yazılı bir toast mesajı gönderecektir. 

Artık tasarım mevzularına adım atabiliriz. Birçok projede ExpandableListView'daki standart oklar yerine tasarımcıların çizdiği oklar kullanılır ve genelde biri sağa, öteki aşağı bakan iki oktur ki basıldığında sağa bakan okun aşağı bakması istenir. Programa bu meseleyi hallettirmek için hileli bir yol diyebileceğimiz bir yöntemi anlatacağım.

Öncelikle okların bulunduğu iki resmi sağa bakan ok için 'arrowright', aşağı bakan ok için 'arrowdown' olarak isimlendirerek projemizdeki drawable klasörüne atın. Peşine yine drawable klasörüne indicator adında bir Android XML'i oluşturun, içeriğini tamamen silin ve aşağıdaki içeriği yapıştırın.
  
        
   
          
    
Daha sonra ExpandableListView'ımızın bulunduğu XML'i açın ve aşağıdaki attributeların eklendiği hale getirin.

        
Görüldüğü üzere groupIndicator attribute'una sıradan bir resim yerine bir xml atayarak dinamik bir şekilde çalışmasını başarmış olduk. Artık uygulamanızda kendi tasarımlarınız istediğiniz biçimde çalışacaktır.

Fakat bu noktada Android'in kötü bir sürpriziyle karşılaşabilirsiniz. Eğer resimleriniz yeterince küçükse, Android resimleri içeriği dolduracak biçimde genişletecek ve resimlerinizi pikselli bir biçimde gösterecektir. Bu sorunu aşmak için resimlerinizin arka planındaki transparent bölgeyi genişletmeniz yani resmin gerçek boyutunu yeterince büyütmelisiniz. Böylece oklarınız listenin içeriğine tam oturacak ve genişletme işleminden etkilenmeyecektir.

Gelelim ExpandableListView'ın en can alıcı bölümüne. Yukarıdaki XML'imizde indicatorLeft ve indicatorRight attribute'lar gözünüzden kaçmamıştır. Bazı projeler okların sol yerine sağda olmasını istemektedir. Android standart olarak bu okları sola yapıştırır, eğer sağa yapıştırmasını istiyorsanız bu iki attribute'un devreye girmesi gerekmektedir. Fakat bizim projemizde listemiz ekranın herhangi bir yerinde olabileceği için buraya vereceğimiz değerler asırlık aşçıların göz kararı tuz eker misali makul değerler vererek oklarımızı istediğimiz konuma yerleştirebiliriz.

Mesela benim projemde liste en solda 290dp'lik bir layout'un içinde olduğu için 220-280 değerler oklarımı listenin tam sağına oturttu. Siz de mantıklı değerler vererek oklarınızı sağa veya sola istediğiniz ölçüde çekebilirsiniz.

ExpandableListView rehberimizin burada sonuna gelmiş bulunuyoruz. Programın sorucecode'unu aşağıda paylaşıyorum. Kullanıma hazır hale getirdiğimiz listemizi programınızdaki Activity xml'inde istediğiniz yere yerleştirebilirsiniz.
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.TextView;
import android.widget.Toast;

public class ExpandableListViewTutorialActivity extends Activity {
 private ExpandableListView list;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        final ExpandableAdapter mAdapter = new ExpandableAdapter();
        list = (ExpandableListView) findViewById(R.id.expandableListView1);
        list.setAdapter(mAdapter);
        
        //ExpandableListView ile alakalı her event'i onCreate metoduna yazıyoruz
        list.setOnGroupExpandListener(new OnGroupExpandListener() {
        public void onGroupExpand(int groupPosition) {
            int len = mAdapter.getGroupCount();
            for (int i = 0; i < len; i++) {
                if (i != groupPosition) {
             list.collapseGroup(i);
         }
            }
        }
        });
    
        
        list.setOnChildClickListener(new OnChildClickListener() { 
         @Override
         public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
          // TODO Auto-generated method stub   
          if(groupPosition==3)
          {
           if(childPosition==0)
           {
            PokeAndroid();
           }
          }    
            return false;
           }

           private void PokeAndroid() {
            // TODO Auto-generated method stub
            Toast msg = Toast.makeText(ExpandableListViewTutorialActivity.this, "Poke", Toast.LENGTH_LONG);
                        msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
                        msg.show();
           }
        });
    }
    
    private class ExpandableAdapter extends BaseExpandableListAdapter {
     private String[] groups = { "Ameliyat Hizmetleri", "Cerrahi Uygulamalar", "Diş Hastalıkları", "Hastane Genel Hizmetleri*", "Muayene, Konsültasyon ve Takip", "Paket Uygulamaları" };
     private String[][] children = { { "Ameliyat" }, { "Cerrah" }, { "Diş Eti Hastalıkları" }, { "Genel Uygulamalar ve Girişimler*", "Servis Hizmetleri" }, { "Tedavi" }, { "AP / Poliklinik Muayene Paketi", "Check-up Programları", "PK / Cerrahi Uyulamalar", "Fizik Tedavi ve Rehabilitasyon" } };

     @Override
     public Object getChild(int groupPosition, int childPosition) {
      // TODO Auto-generated method stub
      return children[groupPosition][childPosition];
     }

     @Override
     public long getChildId(int groupPosition, int childPosition) {
      // TODO Auto-generated method stub
      return childPosition;
     }

     public TextView getGenericView() {
            // Layout parameters for the ExpandableListView
            AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT, 64);

            TextView textView = new TextView(ExpandableListViewTutorialActivity.this);
            textView.setLayoutParams(lp);
            // Center the text vertically
            textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
            // Set the text starting position
            textView.setPadding(10, 0, 0, 0);
            return textView;
        }
     
     @Override
     public View getChildView(int groupPosition, int childPosition,
       boolean isLastChild, View convertView, ViewGroup parent) {
      // TODO Auto-generated method stub
      TextView textView = getGenericView();
            textView.setText(getChild(groupPosition, childPosition).toString());
            return textView;
     }

     @Override
     public int getChildrenCount(int groupPosition) {
      // TODO Auto-generated method stub
      return children[groupPosition].length;
     }

     @Override
     public Object getGroup(int groupPosition) {
      // TODO Auto-generated method stub
      return groups[groupPosition];
     }

     @Override
     public int getGroupCount() {
      // TODO Auto-generated method stub
      return groups.length;
     }

     @Override
     public long getGroupId(int groupPosition) {
      // TODO Auto-generated method stub
      return groupPosition;
     }

     @Override
     public View getGroupView(int groupPosition, boolean isExpanded,
       View convertView, ViewGroup parent) {
      // TODO Auto-generated method stub
      TextView textView = getGenericView();
            textView.setText(getGroup(groupPosition).toString());
            return textView;
     }

     @Override
     public boolean hasStableIds() {
      // TODO Auto-generated method stub
      return true;
     }

     @Override
     public boolean isChildSelectable(int groupPosition, int childPosition) {
      // TODO Auto-generated method stub
      return true;
     }
    }
}
ExpandableListView konusunda yaşadığınız her türlü sorun için benimle iletişim kurabilirsiniz. Sorunlarınızı aşağıdaki yorum kısmına veya egmnhmtc@gmail.com adresine gönderebilirsiniz.

9 Haziran 2012 Cumartesi

Android'de Özel CheckBox Ataması



Kendi tasarladığımız CheckBox resimlerimizi Android projemize atamak istiyorsak Android'in selector özelliğini kullanmamız gerekmektedir. Selector bir XML dosyasıdır ve drawable klasöründe bulunması gerekmektedir. Öncelikle resimlerimizi drawable klasörüne atıp XML dosyamızı oluşturalım. Dosyamızın ismini checkbox_selector olarak belirleyelim.







Gördüğünüz üzere selector XML'i ile CheckBox'un her iki durumunda gösterilecek resimleri atamış olduk. android:drawable="@drawable/checked" ve android:drawable="@drawable/unchecked" attribute'larındaki checked ve unchecked, drawable klasörümüze attığımız resimlerimizi göstermektedir. Eğer sizde farklıysa lütfen değiştirmeyi unutmayınız.

Şimdi sıra geldi selector'umuzu CheckBox'umuza atama kısmına.



Gördüğünüz üzere android:button="@drawable/checkbox_selector" attribute'unda CheckBox'umuza sıradan bir resim atamak yerine dinamik çalışan selector XML'ini atamış olduk. Böylece kendi tasarladığımız CheckBox'larımızı projelerimizde kullanabilmekteyiz.

Android'de Component'ları Sağa Kaydırmak



Android'de Button, TextView veya herhangi bir layout'un içine alınmış toplu component'ları sağa kaydırma ihtiyacı birçok projede karşınıza çıkar. Bu noktada RelativeLayout yardımımıza koşmaktadır. Sağa kaydırmak istediğimiz component'ları RelativeLayout tagine alıp gerekli ayarlamaları yaptığımızda istediğimiz sonuca ulaşacağız.

Aşağıda verdiğim kodda yan yana iki butonu bir LinearLayout içine alıp topluca sağa kaydırma işlemi yapılmıştır.



   

Görüldüğü üzere butonlar orentation'u horizontal olarak ayarlanmış bir LinearLayout'un içine alınarak yanyana dizilmiştir. Bu LinearLayout'u da gravity'si top yapılmış bir RelativeLayout'un içine alınıyor ve LinearLayout'a android:layout_alignParentRight="true" attribute'u atanarak sağa kaydırılıyor ve android:layout_centerVertical="true" attribute'u atanarak da dikey olarak ortalanmasını sağlıyor.

Bu şekilde sağa kaydırma işlemini başarıyla tamamlamış bulunuyoruz.

4 Haziran 2012 Pazartesi

Adım Adım Java ile MySQL Bağlantısı


Java'da MySQL bağlantısı oluşturmak sanıldığı kadar zor değildir aksine diğer veritabanlarına göre oldukça kolaydır, yalnız bu veritabanı bağlantı mimarisini verimli bir şekilde oluşturmak ileride yazılımda karşılaşacağınız veritabanı sorunlarını; SQL Expection ve benzeri hataları minimuma indirecektir.

Bu girdimizde benim kendi oluşturduğum bir mimariyle ilerleyeceğiz. Öncelikle MySQL'in resmi sitesinden bağlantı sürücüsünü indirmemiz gerekmektedir. İndirmek için bir defalığına kayıt yaptırmanız yeterlidir. İndirdikten sonra sıkıştırılmış dosyanın içindeki jar uzantılı dosyayı projenize import edin.

Sürücümüzü projemize entegre ettikten sonra mimarimize giriş yapabiliriz. Başlarken mimarimizi kısaca özetlememiz yararımıza olacaktır. Öncelikle veritabanıyla ilgili bütün işlemleri ayrı bir pakette tutmanızı öneririm. Bir defa oluşturacağınız sınıfları bu paketin içine atarsanız hem diğer sınıflarla karışmayacak hem de bir daha girip bakmanıza gerek kalmayacaktır. İkincisi bağlantı için DAO isminde bir sınıf oluşturacağız bağlantılar bu sınıftan gerçekleştirilecek. Bununla birlikte veritabanımızdaki her tablo için ayrı bir sınıf oluşturacağız böylece tablolarla ilgili her türlü işlemi sınıflarda metod aramadan kolayca yapabileceğiz. Mimarimize Database isimli bir paket oluşturarak başlayalım.

Paketi oluşturduktan sonra paketimizin bel kemiği DAO isimli sınıfımızı oluşturalım. Öncelikle dört adet global değişkene ihtiyacımız vardır.

private static Connection con;
private static String dbURL= "jdbc:mysql://localhost:3306/dbName";
private static String username = "root";
private static String password = "root";

Şimdi bu değişkenler ne işimize yarayacak inceleyelim.

Connection: Import ettiğimiz sürücümüzle bağlantı kuran değişken.
dbURL: Veritabanımızla bağlantı kurmasını sağlayan link.
username: Veritabanımızın kullanıcı adı.
password: Veritabanımızın şifresi.

Burada dikkat etmeniz gereken nokta dbURL değişkenindeki dbName yerine kendi oluşturduğunuz veritabanınızın ismini girmeniz gerektiğidir. Aksi takdirde veritabanı ile bağlantı kuramazsınız!

Global değişkenlerimizi oluşturduktan sonra iki adet metod girmemiz gerekmektedir.

public static Statement dbConnect()
{
    try {
        Class.forName("com.mysql.jdbc.Driver").newInstance(); //My sql JDBC sürücüsü kullanılıyor
        con = (Connection) DriverManager.getConnection(DAO.dbURL, DAO.username,DAO.password);//bağlantı açılıyor
        return (Statement) con.createStatement();
    } catch (SQLException ex) {
        Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    } catch (InstantiationException ex) {
        Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    } catch (IllegalAccessException ex) {
        Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
}

public void dbClose() throws Exception
{
    con.close();
}

Şimdi bu metodlar neler yapıyor inceleyelim.

dbConnect: Bağlantı session'u açılıyor.
dbClose: Bağlantı session'ları kapatılıyor.

Böylece sınıfımızı tamamlamış olduk, aşağıda yazdığımız DAO sınıfımızın son hali gösterilmektedir.

package Database;

import com.mysql.jdbc.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Egemen
 */
public class DAO {
    private static Connection con;
    private static String dbURL= "jdbc:mysql://localhost:3306/dbName";
    private static String username = "root";
    private static String password = "root";
    
    public static Statement dbConnect()
    {
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance(); //My sql JDBC sürücüsü kullanılıyor
            con = (Connection) DriverManager.getConnection(DAO.dbURL, DAO.username,DAO.password);//bağlantı açılıyor
            return (Statement) con.createStatement();
        } catch (SQLException ex) {
            Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (InstantiationException ex) {
            Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (IllegalAccessException ex) {
            Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
    
    public void dbClose() throws Exception
    {
        con.close();
    }
}

Burada dikkat edilmesi gereken husus import ettiğimiz kütüphanenin Statement'ını kullanmaktır. Kesinlikle java.sql.Statement isim uzayını import etmeyin!

DAO sınıfımızı oluşturduktan sonra geriye tabloların sınıfı oluşturmak kalıyor. Biz örnek olarak Customer isimli bir tablonun sınıfını oluşturacağız.

Customer sınıfımızda bir adet global değişkene ihtiyacımız vardır.

public static Statement st = DAO.dbConnect();

Bu değişken yazdığımız DAO sınıfını kullanarak veritabanı ile Customer sınıfı arasında bir bağlantı session'u açmaktadır.

Bundan sonra veritabanında select/insert/update/delete işlemlerini gerçekleştiren metodları yazarak sınıfımızı tamamlayacağız.

public static ResultSet SelectCustomer(String QSelect)
{
    try
    {
        return st.executeQuery(QSelect);
    }
    catch (SQLException ex) {
        Logger.getLogger(Customer.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
}

public static void UpdateCustomer(String QUpdate)
{
    try
    {
        st.executeUpdate(QUpdate);
    }
    catch (SQLException ex) {
        Logger.getLogger(Customer.class.getName()).log(Level.SEVERE, null, ex);
    }
}
   
public static void DeleteCustomer(int _iStatusID)
{
    try
    {
        String QDelete = "DELETE FROM Customer WHERE customerID = " + _iStatusID;
        st.executeUpdate(QDelete);
    }
    catch (SQLException ex) {
        Logger.getLogger(Customer.class.getName()).log(Level.SEVERE, null, ex);
    }
}

Şimdi bu metodlar neler yapıyor inceleyelim.

SelectCustomer: Select sorgusu gönderir. Aldığı string parametresine bütün Select sorgusunu yazınız. ResultSet olarak döner.
UpdateCustomer: Insert ve Update sorgularını gönderir. Aldığı string parametresine bütün sorguyu yazınız.
DeleteCustomer: Delete sorgusunu gönderir. Aldığı integer parametreye silmek istediğiniz satırın primary key numarasını giriniz.

Böylece tablo sınıfımızı da bitirdik. Aşağıda Customer sınıfının son hali gösterilmektedir.

package Database;

import com.mysql.jdbc.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Egemen
 */
public class Customer {
    public static Statement st = DAO.dbConnect();
    
    public static ResultSet SelectCustomer(String QSelect)
    {
        try
        {
            return st.executeQuery(QSelect);
        }
        catch (SQLException ex) {
            Logger.getLogger(Customer.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public static void UpdateCustomer(String QUpdate)
    {
        try
        {
            st.executeUpdate(QUpdate);
        }
        catch (SQLException ex) {
            Logger.getLogger(Customer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public static void DeleteCustomer(int _iStatusID)
    {
        try
        {
            String QDelete = "DELETE FROM Customer WHERE customerID = " + _iStatusID;
            st.executeUpdate(QDelete);
        }
        catch (SQLException ex) {
            Logger.getLogger(Customer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Bu şekilde diğer tablo sınıflarını da oluşturarak Database paketimizi sorunsuz bir şekilde tamamlamış olacağız. Burada da DAO sınıfında olduğu gibi doğru Statement isim uzayını import etmeyi unutmuyoruz. Artık veritabanımıza istediğimiz bir sınıfta işlem yapmak istediğimiz tablonun sınıfındaki metodları static bir şekilde çağırarak işlemlerimizi gerçekleştirebiliriz.

ResultSet rsCustomer = Customer.Select("SELECT * FROM Customer");

while(rsCustomer.next())
{
    //Select sorgusuyla gelen tablonun içindeki satırlarda sırayla ilerleyerek ilgili işlemler burada yapılır
}

Customer.Update("UPDATE Customer Set customerName='Ahmet' WHERE customerID=3"); //customerID'si 3 olan müşterinin adı Ahmet olarak değiştiriliyor
Customer.Delete(3); //customerID'si 3 olan müşteri tablodan siliniyor

Görüldüğü üzere yukarıdaki örnek işlemlerle veritabanı bağlantısı hızla kurulup istediğimiz işlemleri bir kaç satır koda indirgemeyi başarmış olduk.

MySQL veritabanıyla bağlantı kurarken yaşadığınız her türlü sorun için benimle iletişim kurabilirsiniz. Sorunlarınızı aşağıdaki yorum kısmına veya egmnhmtc@gmail.com adresine gönderebilirsiniz.

3 Haziran 2012 Pazar

Bugünün Tarihini İstediğimiz Formatta Almak

Java'da bugünün tarihini almak oldukça basittir, yalnızca Java kütüphanesinde bulunan birkaç sınıfı kullanmak yeterlidir, aşağıdaki yazdığımız metod alınan tarihi string tipinde döndürmektedir.

import java.text.SimpleDateFormat;
import java.util.Calendar;

public static String now(String dateFormat) 
{
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
    return sdf.format(cal.getTime());
}

Görüldüğü üzere metodumuz tarih formatını da parametre olarak alabilmektedir, böylece tarihimizi istediğimiz formatta döndürebilmekteyiz.

String Date = now("yyyy-MM-dd");
String DateTime = now("yyy-MM-dd H:mm:ss");

Bu şekilde tarih ile ilgili işlemlerde bugünün tarihini kolayca alabiliriz.