Java ile MySQL Bağlantısı ve AbstractFactory Tasarım Deseni

Batuhan Düzgün tarafından yayınlanmıştır 3. September 2010 08:15

Merhaba arkadaşlar kısa sürelik bir aradan sonra tekrar başka bir makale konusuyla beraberiz.Özellikle staj defterini doldurma zorunluluğu nedeniyle vaktimin bir kısmını ona ayırmak zorunda kaldım.Sizleri de daha fazla sabırsızlandırmadan  bu yazımın konusunu belirteyim.Konumuz Java ile MYSQL bağlantısı olacak. Gelen istekler üzerine Java ile çeşitli veritabanı programlarını bağlamak ve veri işlemleri üzerine duracağım.Bunların ilginizi çekeceğini düşünüyorum.

Yazımda örnekleyeceğim kısım aslında açık kaynak kodlu yayınlamayı düşündüğüm bir projenin bir parçası.Bu projede AbstractFactory,Kopya Nesne ve Facade tasarım desenleri kullanıldı.Aslında projemiz yine N Katmanlı Mimariye uygun oldu.Özellikle,Veri Katmanı ile erişim yapacak kodların tasarımı için AbstractFactory tasarım deseni kullanıldı.İş Katmanına ait kodları düzenleyebilmek için ise Kopya Nesne tasarım deseni kullanıldı.Sunum katmanı ile erişim yapacak olan kodların tasarımı için ise Facade tasarım deseni kullanıldı.

Veritabanı Tasarımı …

Projemizi yaparken veritabanı olarak MYSQL kullandım.Bununiçin XAMMP adlı yerel sunucuyu bilgisayarıma indirip kurdum.Kurulumdansonra  XAMMP Admin Panele girebilmek için,herhangi bir tarayıcıya (Mozilla,Google Chrome veya Internet Explorer…)   http://localhost/xampp/    yazdım.Aşağıdaki sayfaya erişmiş olmanız lazım.

 

 

Eğer ki kurulum sırasında herhangi bir şifre ve kullanıcı adı tanımlamışsanız,onları ilgili kutucuklara yazıp,Admin panele log olabilirsiniz.

Admin panele erişince aşağıda gözüken resimdeki gibi bir sayfayla karşılaşmanız lazım.
 
 
 
Veritabanı ismini “maassistemi” şeklinde  belirledim.Ardından aşağıdaki resimde görülen yerden bir tablo oluşturuyoruz.Adını “maastablo” şeklinde belirledim.
 
 
 

Veritabanı  tasarımımız  bitti. Aslında  bu veritabanımız  sadece  geçici amaçlı ,esas  vereceğim projede birbiriyle  mantıksal  ilişkiler çerçevesinde  bağlanmış  bir veritabanı  olacak.

Kodların Tasarımı …

Kodları tasarlarken  “Abstract Factory” tasarım desenini kullandım.Özellikle veritabanı bağlantı işlemlerinde  gayet kullanılır bir tasarım deseni.

Tasarım desenimiz aslında tam olarak şunu yapıyor.Örneğin;şirketimiz MYSQL veritabanı yönetim sistemi ile çalışıyor ve bir çok uygulaması MYSQL veritabanını kullanıyor diyelim.Gün geldiğinde şirketimiz Oracle veritabanı yönetim sistemi kullanmaya başlayınca biz yazılımcılar kod üzerinde fazla değişiklik yapmadan bu değişimden az etkilenmek isteriz.Veya sadece veritabanıyla ilgili  sınıflarla ilgili kodları düzenlemek isteriz.Çünkü diğer durumda uygulamayı güncellemek,yeniden yazmaktan daha zor olacaktır.İşte ” Abstract Factory “ tasarım deseni,bizlere ilgili durum için gerekli olan nesneleri otomatik kendi üretir.Mesela biz eğer ki MYSQL veritabanı işlemleri için nesneler üreten bir fabrika yerine Oracle veritabanı işlem nesneleri üreten  bir fabrika ekleyebiliriz.Hatta her iki veritabanı için gerekli olan işlem nesnelerini iki ayrı fabrikayı tetikleyek üretebiliriz.Abstract Factory  nesne üretme işini bizden alır,bunu bizim yerimize bir sınıfa yükler.Biz sadece Oracle nesneleri oluştur diye metod veya komut veririz.Arkaplanda o her şeyi üretip hazırlar.Şimdi kodları inceleyelim birazda.

İlk olarak iki adet interface tanımlayacağız.Bunalrın isimleri “IBaglanti” ve “IKomut” şeklinde olacaktir.

IKomut.java Kodları …

/*

 * To change this template, choose Tools |Templates

 * and open the template in the editor.

 */

package iscimaaslariodemesistemi;

importjava.sql.Connection;

importjava.sql.Statement;

public interfaceIKomut {

    public Statement KomutVer(ConnectionBaglanti);

}

 

IBaglanti.javaKodları …

/*

 * To change this template, choose Tools |Templates

 * and open the template in the editor.

 */

package iscimaaslariodemesistemi;

importjava.sql.Connection;

public interface IBaglanti{

    public Connection BaglantiVer(StringDRIVER,String URL,String Username,String Password);

}

 

Bu yazdığımız iki adet interfaceden IBaglanti olanı MYSQL_Baglanti sınıfının base(Ata) sınıfı olacak.Diğer IKomut interface’si ise MYSQL_Komut sınıfının base(Ata) sınıfı olacak.Şimdi de bahsettiğimiz iki sınıfa ait kodları verelim.Bu sınıflar MYSQL için bağlantı ve SQL komutu işleme görevlerini yapacaklar.

MYSQL_Baglanti.javaKodları …

/*

 * To change this template, choose Tools |Templates

 * and open the template in the editor.

 */

packageiscimaaslariodemesistemi;

importcom.mysql.jdbc.Connection;

importjava.sql.DriverManager;

importjava.sql.SQLException;

importjava.util.logging.Level;

importjava.util.logging.Logger;

public classMYSQL_Baglanti implements IBaglanti{

    private Connection Baglanti;

    public Connection BaglantiVer(StringDRIVER, String URL,String Username,String Password) {

        try {

            try {

               Class.forName(DRIVER).newInstance();

            } catch (InstantiationException ex){

               Logger.getLogger(MYSQL_Baglanti.class.getName()).log(Level.SEVERE, null,ex);

            } catch (IllegalAccessException ex){

               Logger.getLogger(MYSQL_Baglanti.class.getName()).log(Level.SEVERE, null,ex);

            }

        } catch (ClassNotFoundException ex) {

           Logger.getLogger(MYSQL_Baglanti.class.getName()).log(Level.SEVERE, null,ex);

        }

        try {

            Baglanti = (Connection)DriverManager.getConnection(URL,Username,Password);

        } catch (SQLException ex) {

           Logger.getLogger(MYSQL_Baglanti.class.getName()).log(Level.SEVERE, null,ex);

        }

        return Baglanti;

    }

}

 

MYSQL_Komut.javaKodları …

packageiscimaaslariodemesistemi;

import com.mysql.jdbc.Statement;

importjava.sql.Connection;

importjava.sql.SQLException;

importjava.util.logging.Level;

importjava.util.logging.Logger;

public classMYSQL_Komut implements IKomut{

    private Statement Komut;

    public java.sql.Statement KomutVer(ConnectionBaglanti) {

        try {

            Komut = (Statement)Baglanti.createStatement();

        } catch (SQLException ex) {

           Logger.getLogger(MYSQL_Komut.class.getName()).log(Level.SEVERE, null,ex);

        }

        return this.Komut;

    }

}

 

MYSQL_Baglanti adlı sınıf Connection tipinde bir nesneyi kullanıma hazırlar ve çağrıldığı üst katmana gönderir. MYSQL_Komut sınıfı ‘da aynı şekilde Statement türünde bir nesne hazırlar ve çağrıldığı üst katmana bunu gönderir.

Connection Sınıfı ve Statement Sınıfı Ne işe Yarar?

Connection sınıfı bildiğimiz veritabanı bağlantısı açmak için gerekli olan sınıftır.C#’taki gibi çeşitlilik göstermez.Sadece “Driver” (Veritabani sürücüsü)  türüne göre hangi veritabanı yönetim sistemini olduğunu algılar. Class.forName(DRIVER).newInstance(); satırıyla hangi sürücüyü kullanacağımızı belirtmiş oluyoruz.Hangi sürücüyü kullanacağımızı ise yukarıdan String parametresi olarak gönderiyoruz.

Statement sınıfı ise SQL komutlarını işleyebilmek içingereklidir.Açık olan bir bağlantı nesnesinden createStatement()  adlı metodu ile üretilir.Sanırım biraz şekillenmeye başladı.Bu yazdığımız sınıfların aynısını Oracle,PostgreSQL,DB2 veya SQL Server 2005/2008 için yazabilirdik.Dikkat ederseniz güncellememiz gereken sadece bağlantı cümleleri ve Driver cümleleri.

Not: NetBeans ‘te veritabanı sürücüsünü proje dahil etmek için Proje ismi üzerine sağ tıklayıp Properties>>Libraries>>Add Library yolunu izleyerek yükleyebilirsiniz.MYSQL için gerekli sürücü ismi “MySQL  JDBC Driver”  şeklindedir.Eğer ki  bağlantı ile ilgili bir sıkıntınız olursa,”mysql-connector-java-5.1.10-bin.jar ” dosyasını internetten  indirip, Properties>>Libraries>>Add Jar/Folder yolunu izleyerek kurabilirsiniz.

Şimdide nesnelerimizi üretme sorumluluğunu üzerine almış olan MYSQL_Factory sınıfı tasarlayacağız.Bundan önce bu sınıfın atası olacak olan AbstractSQLFactory sınıfını tasarlayalım.Bu sınıf abstract türden olacaktır.

 

AbstractSQLFactory.javaKodları …

/*

 * To change this template, choose Tools |Templates

 * and open the template in the editor.

 */

package iscimaaslariodemesistemi;

import com.mysql.jdbc.Connection;

import java.sql.Statement;

public abstract classAbstractSQLFactory {

    public abstract void BaglantiAc();

    public abstract void KomutAc();

    public abstract Connection getBaglanti();

    public abstract Statement getKomut();

}

 

Ardından MYSQL_Factory sınıfının kodlarını verelim.

 

MYSQL_Factory.javaKodları …

 

packageiscimaaslariodemesistemi;

 

import com.mysql.jdbc.Connection;

import com.mysql.jdbc.Statement;

 

public class MYSQL_Factory extends AbstractSQLFactory{

    IBaglanti Baglantim;

    IKomut Komutum;

    Connection Baglanti;

    Statement SQLKomut;

    @Override

    public void BaglantiAc() {

        Baglantim=new MYSQL_Baglanti();

        this.Baglanti=(Connection)Baglantim.BaglantiVer("com.mysql.jdbc.Driver","jdbc:mysql://localhost/maassistemi","root","");

    }

    @Override

    public void KomutAc() {

        Komutum=new MYSQL_Komut();

        this.SQLKomut=(Statement)Komutum.KomutVer(Baglanti);     }

    @Override

    public Connection getBaglanti(){

        return this.Baglanti;

    }

    @Override

   public Statement getKomut(){

        return this.SQLKomut;

    }

}

 

Görüldüğü üzere AbstractSQLFactory sınıfının bütün abstract metodları  MYSQL_Factory sınıfı içinde override edildi.Aynı şekilde bir Oracle fabrikası kurabilirdik.O fabrika da Oracle veritabanı işlemleri nesnelerini üretip bize sunardı.

 

Main metodu içinde bunları şu şekilde kullanabiliriz.

AbstractSQLFactory  MyFac=new MYSQL_Factory();

MyFac.BaglantiAc();

Diyerek bağlantımı açabilirim.Birde son olarak projenin çalışır halinden bir kesit sunayım.
 
 
 

Aynı şekilde komut’u hazırlayan metodu çağırdığım da komutumda hazırlanmış olur geriye sadece gerekli olan SQL cümlesi kalır.Burada yaptığımıza dikkat edelim.Polimorfizm denen olayı uyguladık.AbstractSQLFactory  sınıfından bir referans tanımlayıp.Nesnesini MYSQL_Factory şeklinde ürettik.Gerçekten nesne yönelimli programlamanın bütün imkanlarını kullanmaya çalıştık gibi.Bu yazım için bu günlük bu kadar.Projemizin başlangıcını yaptık.Diğer yazı dizilerinde farklı tasarım desenleriyle  projemizi ilerleteceğiz.Görüldüğü gibi önemli olan programlama dili grameri öğrenmek değil,uygun çözümü sunabilmektir.Umarım zevkle okuyacağınız bir makale olmuştur.Bir sonraki makalemde görüşmek dileğiyle …

Batuhan Düzgün

Sakarya Üniversitesi

Bilgisayar Mühendisliği 

Currently rated 5.0 by 3 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler:

Java

Comments

Add comment


(Will show your Gravatar icon)  

  Country flag

biuquote
  • Comment
  • Preview
Loading





Bu site BlogEngine.NET 1.4.5.0 ile oluşturulmuştur. Türkçe çevirisi BlogEngine TR ekibi tarafından yapılmıştır.

Batuhan Düzgün

Sakarya Üniversitesi 

Bilgisayar Mühendisi

Endüstri Mühendisi

Yeditepe Üniversitesi

Bilgisayar Mühendisliği Yüksek Lisans 

 sahibinden.com

   Kıdemli Uzman Yazılım Mühendisi  

E-Mail 

   batuhan.duzgun@sahibinden.com

   batuhan.duzgun@windowslive.com

  github.com/batux

 

Sayfalar

Calendar

<<  August 2018  >>
MoTuWeThFrSaSu
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

Yazıları geniş takvimde göster