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.

4 Mart 2012 Pazar

Objective-C'de ViewController'lar Arası Veri Geçişi

Objective-C'de bir sayfadan başka bir sayfaya integer ve string gibi değişkenlerin verilerini aktarmak için belirli bir ilişkisel yapı ve implementasyonlar gerekmektedir. Aşağıdaki küçük örnekte TableView kullanan iki ViewController arası veri geçişi gösterilmektedir.

Öncelikle elimizde MasterViewController ve DetailViewController adında iki sınıfımız olsun. Amacımız master'dan detail'a bir integer değer aktarmak. Bunun için master'ımıza DetailViewController'a ulaşmak için MasterViewController.h'ye tanımlamamız gerekir.

#import UIKit/UIKit.h

@class DetailViewController; //Tanımlama

@interface MasterViewController : UITableViewController{
    DetailViewController *dvc;
    int *a; // aktarılacak olan değişken
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;

@property (nonatomic, retain) DetailViewController *dvc;
@property (nonatomic)int a;

@end

interface'e yazdığımız dvc ismindeki DetailViewController objesini implementasyon kısmında kullanacağız.

#import "MasterViewController.h"
#import "DetailViewController.h" //Aktarım için bu sınıfın import edilmesi gerekir

@implementation MasterViewController

@synthesize dvc;
@synthesize a = _a;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(dvc != nil)
        [dvc dealloc];
    
    self.a = 5;    

    dvc = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    dvc.b = [self a]; // Aktarım işlemi burada gerçekleşiyor
    
    [self.navigationController pushViewController:bvc animated:YES];
}
       
@end

Gördüğünüz üzere, interface'de nonatomic olarak tanımlanan objemizin değerini diğer sınıftaki integer tanımlı b objesine aktardık. DetailViewController sınıfında da a objesi gibi interface'e sadece nonatomic tanımlarsanız veri geçişi başarılı bir şekilde gerçekleştirilecektir.

25 Aralık 2011 Pazar

Windows 7'deki Gizli TanrıModu (GodMode)

Windows 7'de gizlenmiş TanrıModu (GodMode) kullanıcıların bütün sistem denetimine tek bir klasörden erişmesine olanak tanımaktadır. TanrıModu'na girmenizi sağlayacak anahtar, bir klasörün adının sonuna özel bir karakter kümesi eklemekten geçmektedir.

Bu klasörden denetim masasındaki bütün ayarların yanı sıra gelişmiş yönetimsel araçlara ulaşabilirsiniz. Bu klasör ile bilgisayarınıza format atabilir, yeni bir disk alanı dahi oluşturabilirsiniz.

TanrıModu'na erişmek için yapılması gereken tekşey yeni bir klasör oluşturup klasörün ismini aşağıdaki gibi değiştirmek:

GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}

Bu işlem gerçekleştirildikten sonra klasör simgesi denetim masası simgesine dönüşecek ve bilgisayarınızla ilgili bütün ayarlara buradan ulaşabileceksiniz.

Niteleyici Ulaşılabilirlik Şeması

Aşağıdaki şemada niteleyicilerin diğer sınıflardan, alt sınıflardan veya farklı paketlerdeki sınıflardan ulaşılıp ulaşılamadığı gösterilmiştir.
Dipnot: Superclass'tan override edilmiş bir metodun ulaşılabilirlik seviyesi yükseltilebilir ama asla azaltılamaz. Örneğin superclass'taki protected metod override edilerek public yapılabilir ancak private yapılamaz.

22 Aralık 2011 Perşembe

String Tipindeki Tarihi SQL Date Tipine Çevirmek

Java tarafında string tipinde yazılan tarihleri bazen karşılaştırma ihtiyacı duyabiliriz. Ancak string tipinde olması bize bu karşılaştırma işlemini gerçekleştirmemize imkan tanımaz. Bunun için string tipindeki tarihleri sql isim uzayındaki Date tipine çevirmemiz gerekir.
public static Date ConvertStringToSqlDate(String date)
{
    try 
    {
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");            
        java.util.Date dateTimeUtil = formatter.parse(date);
        java.sql.Date dateTimeSql = new java.sql.Date(dateTimeUtil.getTime());
        return dateTimeSql;
    } 
    catch (ParseException ex)
    {
        Logger.getLogger(SaleOptions.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
}
Yukarıdaki kodda string'te yazılan tarih formatı ile DateFormat objesinde belirlenen format tutarlı olmalıdır. Gereksinimleri karşıladığınızda kodumuz sorunsuz çalışacaktır.

20 Kasım 2011 Pazar

Android'de İnternetteki Bir Resmin Gösterimi

Android'de ImageView'a internetteki bir resmi atamak geliştiriciler için sorun teşkil edebiliyor. Çünkü ImageView'a direk olarak bir resim url'i verilemiyor, sadece projenizin içinde bulunan resimler atanabiliyor. Bu sorunun çözümü için aşağıdaki metod işinize yarayacaktır.
private Drawable LoadImageFromWebOperations(String url)
{
    try
    {
        InputStream is = (InputStream) new URL(url).getContent();
        Drawable d = Drawable.createFromStream(is, "src name");
        return d;
    }
    catch (Exception e) 
    {
         return null;
    }
}

Gördüğünüz üzere metod String objesi alıyor, Drawable objesi dönüyor. Bu noktadan sonra yapmamız gereken şey elimizdeki Drawable objemizi ImageView'ımıza atamak. Bu işlemi OnCreate metodunda gerçekleştirmemiz gerekmektedir.
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ImageView imageview = (ImageView) findViewById(R.id.imageView1);
    Drawable drawable = LoadImageFromWebOperations("http://www.google.com/image01.png");
    imageview.setImageDrawable(drawable);
}

Böylelikle internette herhangi bir resmi ImageView'ınızdan gösterebilirsiniz. Aynı işlemi ImageButton içinde gerçekleştirebilirsiniz.