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.

2 yorum:

  1. hocam merhaba bu konu hakkında makalelerı devamlı okuyorum yapmaya calısıyorum fakat yapamıyorum javaya yenı basladım ,rıca etsem elınızde bı ornegı varsa benımle paylasabılır mısınız ?

    YanıtlaSil
  2. mail adresim yunusemreyasar@windowslive.com

    YanıtlaSil