Server-client mimarisine sahip
programların birisi de Java Programlama diline ait veri tabanı uygulamaları
JDBC’dir.1980 yılı ve sonrası, Internet ve ağ uygulamaların da Java ve Java
uygulamaları büyük gelişme göstermiştir.JDBC veri tabanına bağlanmakta
kullanılan arayüzdür.
Java
programlama dilinde veri tabanına bağlantı için JDBODBC ara yüzü kullanılır.
Temel mantık ana server-client mimarisinde server üzerinde bağlantı
nesnelerinin oluşturulup, veri tabanında kayıtlara ulaşılması ve istenen
değişikliklerin yapılmasıdır.
JDBC,
ilişkisel veri tabanlarına ara yüz olarak tanımlanabilir. Java Veri tabanı
bağlantısı (JDBC) sınıfları SQL cümlelerini çalıştırarak ilişkisel veri
tabanlarına erişimi ve bu veriler üzerinde işlem yapmayı sağlar.
JDBC ile
veri tabanı bağlantısını sağlamak için server üzerinde bağlantı nesnesi
oluşturulur, JDBC sürücüleri yüklenir, SQL cümleleri ile veri tabanı üzerinde
istenen değişiklikler yapılır ve bağlantı kapatılır.
BÖLÜM 1
GİRİŞ:
Bilişim
teknolojilerinin gelişim hızı son 15 yılda inanılmaz bir ivme kazanmıştır. Bu
gelişimde bilişim sistemleri kuruluşlarının başarılarının büyük payı vardır.
Ancak bu gelişimle birlikte bu kurumlarının istek ve ihtiyaçları da
değişmiştir, artık bilişim dünyası ana bilgisayardan (Mainframe) istemci_sunucu
mimarisine geçiş gibi köklü bir
değişiklik yaşamaktadır. Bu gün artık ihtiyaçlar veri tabanları, işletim
sistemleri, bilgisayar ağları gibi varolan teknolojilerle uyumlu çalışabilecek
ve aynı zamanda yeni teknolojilerin kullanılmasına olanak verebilecek
mimarilerin geliştirilmesine yol açmıştır.
Bilişim teknolojilerinde ana
bilgisayar tabanlı uygulamaların sakıncalarında dolayı ilişkisel veri tabanları
ve istemci/sunucu modeline geçilmiştir. Bilindiği gibi ana bilgisayar tabanlı
uygulamalarda depolanan bilginin paylaştırılması büyük bir sorun olmaktaydı ve
bu yöntem verimsizdi. Geliştirilen istemci/sunucu modelinde, uygulamalar
istemci ve sunucu tarafında iki ayrı tek parçalı uygulama modelinin çıkmasına
yol açmıştır. Ancak bu modelde, uygulamalarda değişiklik ya da geliştirmeler
yapılmasını kolaylaştıran “kodun yeniden kullanılabilmesi özelliği” özelliğinin
uygulanması, çoğu zaman ayrı ayrı ele alınması gereken bir çok program
modülünün ortaya çıkmasına sebep olarak işlemi güçleştirir.
İşte
yukarıda sayılan bu sebeplerden dolayı, dağıtık bilgi işlem modeli,CORBA ve
IIOP’ nin geliştirilmesini sağlamıştır. 1980 yılında standart olarak kabul
edilen bu teknolojide zamanla ortaya çıkan bir sorun, birbirlerinden kesin
olarak çizilmiş sınırlarla ayrılmış ara yüzlerle etkileşim içerisinde olan ve
tekrar kullanılabilen küçük yazılımlar modülü, nesneye yönelik programlama yaklaşımı ile çözülmüştür.
Dağıtık
bilgi işleme modeli, farklı bilgisayar ağları ve farklı işletim sistemlerinde
çalışabilir. Farklı programlama dillerinde yazılmış olan uygulamalar birbirleriyle
sorunsuz olarak çalışabilmektedir.
İşte burada
asıl konumuz olan Java veri tabanı uygulamaları geliştirme ara yüzü olan JDBC
ortaya çıkmıştır. Birbirinden bağımsız olarak geliştirilmiş CORBA(Common Object
Request Broker) ve Java dili yukarıda sayılan güçlüklerin aşılmasını
sağlamıştır. Java farklı işletim sistemleri ve ağlar üzerinde sorunsuz
çalışmasını, ortamdan bağımsız olması yani, diğer programlama dilleri gibi
işletim yada donanım üzerinde çalışmak yerine, Java Sanal Makinesi (Java
Virtual Machine JVM) adı verilen bir teknolojiyle sağlamıştır.
AMAÇ
Bu
çalışmada Java programlama dili kullanılarak ağ ortamında çalışabilecek veri
tabanı uygulamaları geliştirilmesi amaçlanmaktadır. Bu yüzden öncelikle veri
tabanı uygulamaları geliştirebilecek yeterliliği sahip olmak için Java proglama
dili veri tipleri, sınıf yapısı ve sınıf oluşturma, uygulamaların görsel olması
için grafik kütüphanesi ve grafik uygulamaları, en son olarak da veri tabanı
uygulamaları anlatılmıştır. Uygulamaların çalıştırılmasında herhangi bir Web
Browser ‘a (Web tarayıcısı) bağlı kalmadan Java ile birlikte hazır olarak gelen
Appletviewer kullanılmıştır.
BÖLÜM 2
2.1 JAVA NEDİR?
JavaTM platformu güçlü ağ uygulamaları için
geliştirilmiş ve değişik bilgisayarlarda çalışabilen bir programlama dilidir.
,JavaTM
teknolojisi ile aynı uygulamaları bir kişisel bilgisayar, Macintosh
bilgisayarda, ağ bilgisayarında ve görüntülü Internet telefonu gibi bir çok
yeni teknolojide kullanabilirsiniz. (www.java .sun.com)
2.2 JAVA PROGRAMLAMA DİLİNİN ÖZELLİKLERİ
2.2.1 Her ortamda çalışabilir
Java
teknolojisinin en önemli özelliği her ortamda, en küçük bilgisayarlardan super
bilgisayarlara kadar, çalışabilmesidir. Java teknolojisi bileşenleri nasıl bir
bilgisayar, telefon, televizyon, veya işletim sistemi olduğuna bakmaksızın Java
platformunu destekleyen her türlü
ortamda çalışır. Java teknolojisinin yaratılış amacı daha önce hiç kolay
olmadığı kadar kolay bir şekilde bilgisayar ve diğer iletişim araçları arasında
etkileşim kurmaktır. Java ilk ortaya çıktığında asıl amacı elektronik ev
aletlerinin birbirleriyle iletişim kurabilmesini sağlamaktır. Java hızlı bir
şekilde gelişerek bu gün ki halini almıştır.
2.2.2 Basit
Java ile
program hazırlamak oldukça kolay ve zevklidir. Daha önce bir programlama dili
ile çalışmış veya en az bir nesneye programlama dili ile çalışmak yeterlidir.
Ayrıca Java programlama dilinin C++ programlama diline olan benzerliği
sebebiyle C++ programlama dili çalışmış
olanlar için çok zevkli yeni bir deneyim olacaktır.
2.2.3Object – Oriented
Giriş bölümünde bahsedildiği gibi
nesneye dayalı bir programlama dilidir. İleri ki bölümlerde anlatılacağı gibi
sınıf ve nesne yapılarıyla daha kolay, defalarca kullanılabilen modüller
yaratılabilir.
2.2.4 Güvenli
Java programlama dili hazırlanan
programlar bugün güveliğin çok önemli üst düzey devlet kuruluşlarında ve NASA
da kullanılmaktadır. Java ile hazırlanan programlara virüslere ve hackerlara
karşı geliştirilen en güvenli programlar olarak düşünülmektedir.
2.2.5 Yüksek Performans
2.2.6 Server Üzerine Az Yük
Java diğer Web tabanlı programlama dillerine
göre bilgisayara daha az yük getirmektedir.
2.3 JAVA VE CGI KARŞILAŞTIRMASI
2.3.1 İnteraktif Standartların Savaşı :CGI ve JAVA
İnternet üzerinde veri işlemeye
yönelik bir çok standart vardır. Bunlardan biride CGI (Commom Gateway
Interface) ‘dır. CGI global değişkenler ve dosyaları kullanmak gibi programlama
dili özelliklerini kullanarak istemci ve
ana bilgisayar arasında veri değişimi sağlayan başarılı bir standarttır.
CGI standardı basit çözümü olan
uygulamalarda kullanılır. Örneğin; “Ben sana adımı ve e-mail adresimi
göndereceğim, sen bu bilgiyi al,sakla ve bana bu bilgileri aldığını bildir”
tarzında uygulamalar için kullanılır. Bu seviyenin üzerindeki uygulamalar ise
Java programlama dilinin yeteneklerine ihtiyaç duyarlar. Örneğin İnternet
üzerinde kullanılan bir satranç oyunu. Kullanıcıların her hamlesinde CGI
standardı yeni istek ve cevap nesnesi oluşturması gerekirken Java programlama
dili bunu oyunu girişte kullanıldığı tek bir applet ile sağlamaktadır.
Java programlama dili ile CGI
standardı arasındaki diğer önemli fark ise CGI ‘ın ortama bağımlı olmasıdır.
Yani CGI scriptlerinin istemci bilgisayarda çalışması için uygun bir işletim
sisteminin ana bilgisayardaki scripti destekler olması gerekmektedir. Halbuki
Java uygulamaları ‘Java-awere’ destekleyen herhangi bir browser da sistemden
bağımsız olarak çalışabilmektedir.(Manger,1988)
2.4 JAVA PROGRAMLAMA DİLİYLE İLGİLİ SIKÇA SORULAN SORULAR
2.4.1 Programla ilgili sorular
2.4.1.1 Niçin Java ismi?
Neden Java
olmasın? Java ismi Web de insanların aklında hemen yerleşebilecek bir kelimenin
arandığı beyin fırtınasında ortaya çıkmıştır. İlk olarak HotJava ve Java
isimleri akla gelmiştir. Daha Java ile ilgili her programa kahve isimleri
verilmiştir. Bu yüzden ki Java’nın sembolü kahvedir.
2.4.1.2 Java platformuna nasıl ulaşabilirsiniz?
Eğer
İnternet ulaşabiliyorsanız muhtemelen Java ya da ulaşabilirsiniz. Java Web
tarayıcılarıyla uyumludur.
Bunun
yanında Java platformu yeni nesil her türlü telefon, internete bağlanabilen
televizyon, akıllı kartlar ve diğer internet cihazlarıyla uyumlu olarak
çalışabilmektedir.
2.4.2 JDK ( Derleyici ) ile ilgili sıkça sorulan sorular:
2.4.2.1 Tam olarak JDK nedir?
Jdk (Java
geliştirme kiti), Java dilinde yazılan programları geliştirme araçlarını içinde
barındıran bir programdır. Java derleyicisi ( Java.exe), Java yorumlayıcısı
(Javac.exe ) ve appletleri test etmemizi sağlayan (Appletviewer.exe)
içermektedir.
2.4.2.2 Applet derleyicisi olan Javac.exe’ yi nasıl kullanabilirim?
Çalıştırmak
istediğiniz applet adı ve uygulama adı ile kullanılarak programlarımızı
derleyebiliriz. Javac.exe ile hem Appletviewer hem de Netscape 2.0 da
çalışabilecek bir class dosyası yaratılır.
Javac Murat.java
Javac.exe
Ms-dos komut isteminde ad vererek veya Windows ortamında çalışabilir.
2.4.2.3 Java yorumlayıcısı olan Java.exe’yi nasıl kullanabilirim?
Bu uygulama
yalnızca Java uygulamalarında kullanılabilir, Java appletlerinde kullanılamaz.
Java yorumlayıcısı dosyanın derlenmesinden sonra oluşan .class dosyası ile
kullanılır. Dikkat dosya adından sonra .class yazılmaz. Örneğin Murat.java
dosyasının derlenmesinden sonra oluşan Murat.class dosyasını yorumlamak için
Java Murat
komut satırı yeterli olacaktır.
Javac.exe
Ms-dos komut isteminde ad vererek veya Windows ortamında çalışabilir.
2.4.2.3 Java uygulamalarını Appletviewer ile görüntüleyebilir miyim?
Hayır ,
çünkü Java uygulaması static void main
(args [0] ) metodu ile program kod satırları başlatılır. Bir applet ise
main uygulama bloğu ile başlar.
2.4.2.4 Java Applet ve Java uygulamaları arasındaki fark nedir?
Applet, Netscape 2.0 web browser’ ı ile
kullanılabilen çalıştırılabilir dosyalardır. Java uygulamaları benzer olmasına
rağmen, browser gibi, Dos kabuğunda tek başına çalışan uygulamalarla
çalıştırılabileceği gibi Java yorumlayıcısı ile de çalışabilir. Appletler çalıştırılabilmesi
için Netscape 2.0 gibi web browser ‘ına ihtiyaç duymalarına rağmen, uygulamalar
Java.exe yorumlatıcısıyla çalışabilir. Appletler bunu yanın da Appletviewer
gibi araçlar ile de çalıştırılabilir.
2.4.2.5 Awt nedir?
Awt, Java
uygulamalarında ve Java appletlerinde grafik uygulamalarını gerçekleştirmek
için kullanılan bir araçtır. Awt bileşenleri denilince butonlar, pencereler,
checkbox lar , pull-down mönüler akla gelmelidir.
2.4.2.6 Java programlarıma kullanıcı bilgilerini nasıl iletebilirim?
Java
appletlerinde Awt uygulamalarını (text kutusu) kullanarak bunu
gerçekleştirebiliriz. Böylece kullanıcı giriş bilgileri programımıza aktarılmış
olur. Awt kullanmadan bunu gerçekleştirmek için klavyeden giriş bilgilerini
okuyan read( ) komutunu kullanabiliriz.
2.4.2.7 Applet ve uygulamalarına kullanıcı tanımlı parametreler nasıl aktarılır?
Appletler tag ını kullanarak değerleri alabilirler. Applet ‘in
getParameter ( “ad”) parametre nesnesini kullanarak, ad adlı değeri applet ‘e alırlar. HTML dosyaları tagları
arasında applete değer gönderirler. (Manger,1988)
BÖLÜM 3
SINIF VE
NESNELER
Nesneye
dayalı programcılık son yıllarda çok büyük gelişme gerçekleştirmiştir. Bu
konunun anlaşılması belki de seneler alabilir. Bilinmesi gereken bazı noktalar;
·
Sınıf ve nesne kavramı ve bunların birbirleriyle
ilişkisi,
·
Sınıf ve nesnelerin davranışları ve bunlara ait
sınıflar,
·
Sınıfa ait miras ve program dizaynı üzerine etkisi,
·
Paket ve ara yüz kavramlarına ait temel bilgiler.
Nesneye
dayalı programlama birbiriyle uyumlu bağımsız modüllerden oluşan yapı anlamına
gelir.
Sınıf ve
diğer sınıf kavramlarının
anlatılmasından önce standart kavramlarının Türkçe karşılıklarının
verilmesi yararlı olacaktır.
Class (sınıf): Ana nesne kökenli programlama
elemanı.
Object (nesne): Sınıf (Class) yapıları
bilgisayar belleğinde bir işlem için kullanıldığında aldıkları (özel) isim.
New :Sınıfların kurucu metodunu
çağırıp nesne tanımını ve bilgisayar adreslerini oluşturan deyim
Method (metot): Sınıfların içindeki
işlevsel program parçacıkları.
Constructor (kurucu metot): Nesne ilk defa
oluşturulurken hangi sınıf değişkenlerinin hangi değerleri alacağını belirten
metot.
3.1 Sınıflar ve Nesneler
Sınıf benzer özellikteki nesnelerin
oluşturduğu yapıya verilen addır. Nesne denince de gerçek dünyada olduğu gibi
diğer nesnelerden oluşan yapılar akla gelebilir.
Nesneye
dayalı programlamada nesne değil nesnenin ait olduğu sınıf özellikleri göz
önünde tutulur. Aynı bilgisayarlar da olduğu bilgisayar işlemci hızı ve ana
bellek kapasitesi göz önüne alınmaz, bilgisayar deyince bilgisayar sınıfının
özellikleri belirtilir. Her bilgisayar da bulunan monitör, klavye, mouse
bilgisayar sınıfının özellikleridir.
Sınıf
örneği, güncel nesne için kullanılan bir başka deyimdir. Sınıf nesne için
kullanılan genel terim ise; örnek, seçilmiş bir nesneyi belirten terimdir.
Sınıf
örneği ve nesne deyince aynı şey akla gelmelidir. Bir buton sınıfı ele alalım.
Programcının yapması gereken programın gereği buton özelliklerini ( buton
rengi, şekli vb.) belirlemek ve butona
ihtiyacı olduğunda bu sınıfı çağırmaktır. Sınıf deyince C+ programlama
dilindeki struct ve typedef tanımlamaları akla gelebilir, ama unutulmamalıdır
ki sınıf bunun çok ilerisindedir.
3.1.1 Davranış ve sınıflar
Java da
oluşturulan her sınıf iki özellikten oluşur;
1. Sıfat,
2.
Davranış.
Sıfatlar
Sıfatlar
nesneleri birbirinden ayırmamızı sağlayan özelliklerdir. Bilgisayar örneğimize devam edelim.
İşlemci
hızı:Pentium 166 Mhz, Pentium 350 Mhz, Pentium 1000 Mhz
Marka:
Escort, Vestel, Toplama bilgisayar
Ana bellek:
16 MB Edo Ram, 64 MB Sd Ram, 256 MB Sd Ram
Sıfatlar
durumla ilgili bilgi de verebilir. Örneğin bilgisayarın çalışıp çalışmadığı
durumu da bir sıfat.
Sıfatlar
için değişkenler tanımlanır. Sıfatlar nesneye ait global değişkenler olarak da
tanımlanabilir. Sıfatlar her örnekte değişiklik gösterebildiği için örnek
değişkenleri veya örneğe ait değişkenler olarak ta tanımlanabilir. (
Çoban,2000)
3.1.1.1 Davranış
Sınıf davranışları, sınıfa ait
hangi örneklerin durumunun ne şekilde değiştirebileceklerini gösterir.
Bilgisayar örneğimize devam edersek şu davranışlar örnek verilebilir.
Bilgisayarı
çalıştır
Bilgisayarı
durdur.
Bilgisayarı
düşük güce geçir.
3.1.1.2 Sınıf oluşturulması
Eğer
herhangi bir editörde şu örneği yazarsak
class
Bilgisayar{
String
marka;
Int hız;
Boolean
bildurumu;
}
Böylece Bilgisayar sınıfı
oluştrulmuş olur. Bu sınıfa ait özellikler string tipinde marka, int tipinde
hız, mantıksal değişkenler (true, false) bildurumu tanımlanmıştır.
void
bilcalistir( ){
if (bildurumu= =true)
System.out.println(“Bilgisayar
çalışıyor”);
else{
bildurumu=true;
System.out.println(“Bilgisayar
şimdi çalıştırldı”);
}
}
Yazdığımız program parçası
bilgisayarın çalışıp çalışmadığı kontrol ediliyor. Eğer çalışıyorsa “Bilgisayar
çalışıyor” mesajı veriliyor, aksi durumda bilgisayar durumu değişkeni true
yapılarak bilgisayar çalıştırılıp, “Bilgisayar şimdi çalıştırıldı” mesajı
verdiriliyor.
void
ozelliklerebak( ){
System.out.println(“Bu
bilgisayar” + marka + ” “ +hız);
if
(bildurumu= = true)
System.out.println(“Çlışyor”)
;
else
System.out.println(“Duruyor”);
}
Yukarıdaki
program parçası bilgisayarın markasını, hızını ve çalışıp çalışmadığını
gösterir. Bu program yazılıp Javac Bilgisayar.java komutu ile derlendiğinde
tanımladığımız sınıf bir ana programdan çalışmadığı için ;
In class Bilgisayar: void main( String argv ( J ) is
not defined hatası verir.
Bu yüzden
önce Bilgisayar sınıfını kullanan bir program yazmamız gerekir.
|
class Bilgisayar{
String marka;
int hiz;
boolean bildurumu;
void bilcalistir( ){
if (bildurumu==true)
System.out.println("Bilgisayar alisiyor");
else{
bildurumu=true;
System.out.println("Bilgisayar simdi alistirildi");
}
}
void ozelliklerebak(){
System.out.println("Bu bilgisayar" + marka
+ " " +hiz);
if (bildurumu==true)
System.out.println("Çalisiyor") ;
else System.out.println("Duruyor");
}
public static void main(String args[]){
Bilgisayar m=new Bilgisayar();
m.marka="Vestel";
m.hiz=667;
System.out.println("™zelliklere
bak");
m.ozelliklerebak();
System.out.println("___________");
System.out.println("Bilgisayar
çalistiriliyor");
m.bilcalistir();
System.out.println("___________");
System.out.println("™zellikler
bak");
m.ozelliklerebak();
System.out.println("___________");
System.out.println("Bilgisayar
çalistiriliyor");
m.bilcalistir();
}}
Şekil 1
Programdaki
void kısmında m=new Bilgisayar( ) ile Bilgisayar sınıfı özelliklerine sahip m
adlı bir değişken tanımlanmış olur.
3.2 Miras Ara yüz ve Paket kavramları
Miras ile
anlatılmak istenen yeni bir sınıf oluşturulduğunda diğer sınıflardan farkının
belirtilmesidir. Her sınıfa ait bu sınıfın özelliklerini taşır.
Bir sınıfın
daha üstünde bulunan sınıfa o sınıfın süper
sınıfı, altında bulunana ise alt
sınıf denir. Alt sınıflar üstünde bulunan sınıfın özelliklerini taşır, bu
yüzden süper sınıfın değişkenlerini alt sınıfta yeniden tanımlamaya gerek
yoktur. Çoğu kez bir sınıf oluşturmak için varolan diğer sınıfların
özelliklerine yenilerini eklemeye gidilir. Yapacağımız işe uydun buton sınıfını tanımlamaka için varolan buton
sınıfından yaralanılır. Buton sınıfına yeni özellikler eklenerek yeni bir buton
sınıfı oluşturulabilir.
Eğer yeni
bir sınıf bir sınıf oluşturmak istersek, tıpkı Bilgisayar sınıfında olduğu
gibi, var olan bir sınıftan yararlanacağımız için Java bu sınıfı nesne
altındaki bir sınıf olarak kabul eder.
3.2.1 Sınıf hiyerarşisi:
Yeni bir
sınıf oluşturulurken yapılacak en mantıklı şey sınıf hiyerarşisini kontrol
etmektir. Bu da sınıfın hangi sınıfların alt sınıfları olabileceği ve bunun
bize ne avantaj sağlayacağıdır.
Sağlanabilecek
en önemli avantajlar:
1.
Yukarıdaki sınıflara ait bilgileri alt sınıflarda
istenildiği kadar kullanabilmek.
2.
Bir sınıfın hiyerarşi içindeki yerini değiştirerek
yeniden derlemeye gerek kalmadan davranışını değiştirebilmektir.
Bilgisayar
sınıfına bir alt sınıf oluşturmak istediğimizde bir laptop bilgisayar uygun
olabilir. Her şeyden önce her ikisi de bilgisayardır. İkisinin de benzer
özellikleri (marka, hız) vardır. Ancak bir çamaşır makinesinin bilgisayar
sınıfının alt sınıfı olmasıyla bize ne yarar sağlayacağı konusu üzerinde fazla
düşünmeye gerek yoktur.
Şekil 2
3.2.2 Alt sınıf oluşturma
Alt
sınıfların en çok kullanıldığı Java programları Java Appletlerdir. Bu sayede
Applet sayfa içinde istenen yere kolaylıkla yerleştirilebildiği gibi sistemle
etkileşimi de kolaylıkla sağlanabilir.
Örnek olarak kendimizi tanıtan bir applet
oluşturalım.
public class Murat extends java.applet.Applet{
}
bu komut satırıyla applet
sınıfın alt sınıfı olan Murat adında bir alt sınıf oluşturduk. Komut
satırındaki bir diğer önemli nokta ise public kelimesidir. Public kelimesi bu
sınıfın diğer sınıflar tarafında kullanılabileceği anlamına gelmektedir. Applet
özellikleri gereği public tanımlanmak zorundadır.
}
imlecinden sonra
Font yeni =
new Font(“Time Roman”, Font.BOLD,50);
Komut
satırını eklemek ile java.awt sınıfına sahip Font fonksiyonu ile 50 puntoda,
Times New Roman stilinde, Bold olan yeni adlı bir nesne tanımlamış olduk.
Diğer metot
da painttir. Bu metot tek başına bir şey yapmamasına rağmen applet sınıfı
içinde kullanarak yazılan metinin rengi vb. özelliklerinin belirlenmesinde kullanılır.
public void
paint( Graphic g){
g.setFont
(yeni);
g.setColor(Color,
red);
g.drawString(“Merhaba
ben Murat Çatmalı”,5,25);
Paint(
) sınıfı global olarak tanımlanmıştır.
Bu komut satırlarıyla yapılan;
1.
Graphics nesnesine fontlar için erişeceği yer
belirtilmiştir.
2.
Graphics nesnesine kullanacağı renk belirtilmiştir.
3.
Merhaba ben Murat Çatmalı yazısı 5 satır, 25. Sütuna
yazdırılmıştır.
public
class Murat extends java.applet.Applet{
Font yeni =
new Font(“Time Roman”, Font.BOLD,50);
public void
paint( Graphic g){
g.setFont
(yeni);
g.setColor(Color,
red);
g.drawString(“Merhaba
ben Murat Çatmalı”,5,25);
}
appletimizi bu şekilde yazıp derlediğimizde bir hata ile karşılaşırız.
Şekil 3
MuratApplet.java: 7:Class Graphic not found in type
declaration.
Bu hatanın
sebebi kullanılan sınıfların tanımlanmamasıdır. Default olarak sadece java.lang
paketi program tarafından içerilir.
Bizim ise
örneğimizde üç sınıfımız vardır: Graphics, Font ve Renk.
Programımızın
en son hali:
|
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;
public class Murat extends java.applet.Applet{
Font yeni=new
Font("TimesRoman",Font.BOLD,36);
public void paint(Graphics g){
g.setFont(yeni);
g.setColor(Color.red);
g.drawString("Merhaba ben Murat
atmali",5,25);
}
|
}
Şekil 4
3.3 Kurucu (Costructor) Metot ve New( ) deyimi
Konumuzu
bir örnek üzerinde anlatmaya çalışalım. Bu örneğimizde kisitesti adlı bir sınıf tanımlayalım. kisitesti sınıfında ad
ve soyad adlı değişkenleri
tanımlayalım.
|
import java.io.*;
class kisitesti
{
String ad;
String soyad;
}
class
kisi
{
public
static void main(String args[])
{
kisitesti benim=new kisitesti();
benim.ad="Murat";
benim.soyad="Catmali";
System.out.println("Benim adim: "+benim.ad);
System.out.println("Benim soyadim: "+benim.soyad);
}
} Şekil
5
Bu
programda kisitesti sınıfında tanımlanan ad ve soyad değişkenlerine ilk değer
atamak yerinde iki defa çağrıldığını düşünelim. Bu kadar kısa bir program kısa
bir program bile gereksiz yere çok uzayacaktır. Bu iş için Java programlama
dilinde kurucu sınıfı kullanılmıştır. Bu metot diğer metotlardan biraz farklıdır. Önce metot önüne
metot değişken türü gelmez ve metot dışında hiçbir değişken göndermezler.
İsimleri de her zaman sınıf ismiyle aynı
olur. Şimdi aynı örneği kurucu metodu kullanarak yapalım.
|
import java.io.*;
class kisitesti
{
String ad;
String soyad;
kisitesti(String a,String b)
{
ad=a;
soyad=b;
}
}
class kisi1
{
public
static void main(String args[])
{
kisitesti benim=new kisitesti("Murat","Catmali");
System.out.println("Benim adim: "+benim.ad);
System.out.println("Benim soyadim: "+benim.soyad);
}
}
Şekil 6
3.3.1 This deyiminin kullanımı
Bir metodun
ait olduğu sınıftan yaratılacak nesneyi veya o nesnenin bir alt değişkenini
tanımlamak gerekir. Nesne daha tanımlanmadığından direk olarak nesne ismini
kullanamayız. Bunun yerine Java this deyimini
kullanılır. this deyimi özellikle sınıfa ait değişken
isimlerinin aynısı metotta kullanılmışsa işe yarar. Bu durumda değişkenler this.değişken_adı komutu çağırabilir.
|
import java.awt.Graphics;
import java.applet.Applet;
public class deyim extends Applet
{
//bu degiskeler tum sinifa aittir
double x;
int y;
void metot1(Graphics g)//metota hi‡bir degisken
girmiyor
{
double x;
int y;
x=5.5;
y=4;
//tum sinifa ait degiskenler this kelimesi ile
birlikte kullanlabilir
g.drawString("metot 1 in dis degiskenleri this
ile ulasimi:x="+this.x+"y="+this.y,25,25);
g.drawString("metot 1 in ic
degiskenleri:x="+x+"y="+y,25,40);
}
public void paint(Graphics g)
{x=2.5;y=3;
metot1(g);}}
BÖLÜM 4
SEQUENTITIAL (ARDAŞIK) DOSYALAR
Bu
dosyalarda veriler arka arkaya okunan byte blokları olarak kabul edilir. Her
dosya dosya-bitiş işaretiyle sonlandırılır. Yeni bir dosya açıldığında bu
dosyayı temsil eden bir nesne oluşturulur.
Dosya
sınıfı, giriş çıkış işlemlerini sağlamanın yanı sıra dosya isimleri ve
bulundukları dizinlerle ilgili bilgi verir. Kurucu metodları bir örnekte
açıklamaya çalışalım.
(
Çoban,2000)
|
import
java.io.*;
class
dosyaTesti
{
public static void main(String args[])
{
(1) File dosya=new File("buton.java");
(2) System.out.println("Dosya
ismi:"+dosya.getName());
(3)
System.out.println("Dizin ismi:"+dosya.getPath());
(4)
System.out.println("Mutlak dizin
ismi:"+dosya.getAbsolutePath());
(5) System.out.println("šst
dizin ismi:"+dosya.getParent());
(6)
System.out.println(dosya.exists()? "Mevcut":"Mevcut
degil");
(7)
System.out.println(dosya.canWrite()?
"Yazilabilir":"Yazilamaz");
(8)
System.out.println(dosya.canRead()? "Okunabilir":"Okunamaz");
(9)
System.out.println(dosya.isDirectory()? "Dizin":"Dizin
degil");
(10)
System.out.println(dosya.isFile()? "Dosya":"Dosya
degil");
(11)
System.out.println(dosya.isAbsolute()? "Mutlak dizin
ismi":"Mutlak dizin ismi degil");
(12)
System.out.println("Son değişiklik
tarihi:"+dosya.lastModified());
(13) System.out.println("Dosya
boyutu:"+dosya.length()+" byte");
}
}
Şekil 7
1.File değişken adı : Dosya sınıfında yeni bir dosya tanımlamak için
kullanılır. dosya adında bir
değişkene tanımlanmış, buton.java dosyası bu değişkene atanmıştır.
2. getName( ): Dosyanın ismini verir.
3. getPath( ): Dosyanın ismini ve içinde bulunduğu dizinin ismini
verir.
4.getAbsolutePath( ):Dosyanın tam dizinini ve dosya ismini verir.
5. getParent( ):Dosyanın içinde bulunduğu dizinin ismini verir.
6. exists( ): Dosyanın mevcut olup olmadığını kontrol eder.
7. canWrite( ): Tanımlanan dosyaya bilgi yazılabildiğini kontrol
eder.
8. canRead( ): Tanımlanan dosyadan bilgi olunabildiğini kontrol
eder.
9. isDirectory( ): Verile ismin bir dizin olup olmadığını kontrol
eder.
10. isFile( ): Verilen ismin bir dosya olup olmadığını kontrol
eder.
11. isAbsolute( ): Dosya isminin mutlak isim olup olmadığını kontrol
eder. ( Eğer dosya ismi co/java/prog/Buton.java olarak verilmişse true değeri
döndürür.)
12. lastModified( ): Dosyanın en son değiştirildiği tarihi verir.
13.length( ): Dosyanın boyutunu Byte olarak verir.
Bunun
yanı sıra kullanılan diğer dosya fonksiyonları:
delete( ): Dosya siler.
equals(nesne): nesne de verilen dosya adıyla, dosya ismini
karşılaştırır.
list( ): Verilen dizinin içindeki dosyaların listesini
verir.
mkdir( ): Yeni bir dizin oluşturur.
mkdirs( ): o anda tanımlı olan dizin içinde bir alt dizin
olşturur.
renameTo( dosya) : Dosyanın ismini değiştirir.
toString( ): Dosya ve dizin topluğunun String değişkeni
içerisindeki eşdeğerini verir.
Bir girdi-çıktı akış nesnesi (dosya) ouşturmak
istediğimizde FileInputStream veya FileOutputStream sınıfında bir nesne
oluştururuz. Eğer değişkenleri byte byte yerine Double veya Integer veri
tipinde okumak istersek DataInputStream veya DataOutputStream nesnelerini
kullanmamız gerekir. Aşağıdaki Java programı sequential tipte bir dosya
yaratır.
|
(1)Giriş-çıkış ve grafik fonksiyonların içeren
kütüphaneler programa dahil ediliyor.
(2) dosyayarat adlı bir sınıf tanımlanıyor.
(3) hisim, ,isim, soyisim, hesap adlı metin kutuları
tanımlanıyor.
(4) enter,done adlı butonları tanımlanıyor.
(5) io sınıfı nesnelerinden DataOutputStream ile
dosyamıza veri yazılmasında kullanılacak nesne tanımlanıyor ve adı cikti
veriliyor.
(6) H,I,S,P adlı etiketler tanımlanıyor.
(7) dosyayarat adlı tanımladığımız fonksiyon kodları
yazılmaya başlanıyor.
(8) ("Musteri dosyasi Ac") başlıklı bir üst sınıf tanımlanıyor.
(9) musteri.txt adlı dosya açılmaya çalışılıyor.
(10) Eğer dosya açılmamışsa kullanıcıya mesaj verilerek
programdan çıkılıyor.
(11) Formumuzun boyutları ve ızgara boyutları
tanımlanıyor.
(12) H adlı etiket içeriği “Hesap numarasi” oluyor.
(13) hisim adlı tanımladığımız text nesnesi oluşturuluyor.
(14) I adlı etiket içeriği “İsim” oluyor.
(15) isim adlı tanımladığımız text nesnesi oluşturuluyor.
(16) S adlı etiket içeriği “Soyisim” oluyor.
(17) soyisim adlı tanımladığımız text nesnesi
oluşturuluyor.
(18) P adlı etiket içeriği “Hesap” oluyor.
(19) hesap adlı tanımladığımız text nesnesi
oluşturuluyor.
(20) enter adlı tanımladığımız “Gir” etiketli buton
oluşturuluyor.
(21) done adlı tanımladığımız “Çıkış” etiketli buton
oluşturuluyor.
(22) Formumuzun görünür olması sağlanıyor. (Visible
özelliği false yapılarak formumuzun görünmemesini sağlayabiliriz.)
(23) hesapekle adlı fonksiyon kodalrı başlıyor.
(24) Değişkenlerimiz tanımlanıyor.
(25) Eğer hismi adlı text nesnesi boş değilse yani bu
alana veri girilmişse,
(26) Hesap alanı 0 dan farklı bir değer ise,
(27) Veriler dosyaya yazılıyor.
(28) Veri girişi yapılan alanlar bir sonraki kullanım
için boşaltılıyor.
(29) Eğer hesap numarası alanı tamsayı girilmediyse
kullanıcıya hata mesajı verdiriliyor.
(30) Dosyaya verileri yazarken hata oluşmuşsa
kullanıcıya mesaj verdiriliyor.
(31) Tanımladığımız kullanıcı fonksiyonları çağrılıyor,
buraya anlatılan kontroller yaptırılıyor.
(32) Dosya kapatılıyor.
(33) Eğer dosya kapatılırken hata oluşmuşsa kullanıcıya
mesaj verdiriliyor.
(34) Oluşturduğumuz fonksiyon ana programdan çağrılıyor.
(1)import java.io.*;
import java.awt.*;
import java.awt.event.*;
(2)public class dosyayarat extends Frame implements
ActionListener
{
(3)
private TextField hismi,isim,soyisim,hesap;
(4) private
Button enter,done;
(5)
private DataOutputStream cikti;
(6)
private Label H,I,S,P;
(7) public
dosyayarat()
{
(8)
super("Musteri dosyasi Ac");
(9) try
{
cikti=new DataOutputStream(new
FileOutputStream("musteri.txt"));
}
catch(IOException e)
{
(10)
System.err.println("Dosya dogru acilamadi\n"+e.toString());
System.exit(1);
}
(11)
setSize(300,150);
setLayout(new GridLayout(5,2));
(12) H=new
Label("Hesap numarasi");
add(H);
(13)
hismi=new TextField();
add(hismi);
(14) I=new
Label("Isim");
add(I);
(15)
isim=new TextField(20);
add(isim);
(16) S=new
Label("Soyisim");
add(S);
(17)
soyisim=new TextField(20);
add(soyisim);
(18) P=new
Label("Hesap");
add(P);
(19) hesap=new
TextField(20);
add(hesap);
(20)
enter=new Button("Gir");
enter.addActionListener(this);
add(enter);
(21)
done=new Button("Cikis");
done.addActionListener(this);
add(done);
(22)
setVisible(true);
}
(23) public
void hesapekle()
{
(24) int
accountNumber=0;
Double d;
(25)
if(!hismi.getText().equals(""))
{
try
{
accountNumber=Integer.parseInt(hismi.getText());
(26)
if(accountNumber!=0)
{
(27)
cikti.writeInt(accountNumber);
cikti.writeUTF(isim.getText());
cikti.writeUTF(soyisim.getText());
d=new Double(hesap.getText());
cikti.writeDouble(d.doubleValue());
}
(28)
hismi.setText("");
isim.setText("");
soyisim.setText("");
hesap.setText("");
}
catch(NumberFormatException nfe)
{
(29)
System.err.println("Hesap numarasi tamsayi degisken
olmalidir");
}
catch(IOException io)
{
(30)System.err.println("Dosyaya yazarken hata
olustu\n"+io.toString());
System.exit(1);
}
}
}
(31) public
void actionPerformed(ActionEvent e)
{
hesapekle();
if(e.getSource()==done)
{
try
{
(32)
cikti.close();
}
catch(IOException io)
{
(33)
System.err.println("Dosya kapatilamadi\n"+io.toString());
}
System.exit(0);
}
}
(34) public
static void main(String args[])
{
new dosyayarat();
}
}
Şekil 8 Şekil 9
Şekil 10 Şekil
11
Eğer
hesap numarasını bir tamsayı değişken girmezsek yukarıdaki gibi bir hata
mesajıyla karşılaşırız.
Bu
Java programı ise yarattığımız sequentitial dosyadan verileri okumamızı sağlar.
|
(1)Giriş-çıkış ve grafik fonksiyonların içeren
kütüphaneler programa dahil ediliyor.
(2) dosyaoku adlı bir sınıf tanımlanıyor.
(3) hisim, ,isim, soyisim, hesap adlı metin kutuları
tanımlanıyor.
(4) next,done adlı butonları tanımlanıyor.
(5) io sınıfı nesnelerinden DataInputStream ile
dosyamızın okunmasında kullanılacak nesne tanımlanıyor ve adı oku veriliyor.
(6) H,I,S,P adlı etiketler tanımlanıyor.
(7) dosyaoku adlı tanımladığımız fonksiyon kodları yazılmaya
başlanıyor.
(8) ("Musteri dosyasi oku") başlıklı bir üst sınıf tanımlanıyor.
(9) musteri.txt adlı dosya açılmaya çalışılıyor.
(10) Eğer dosya açılmamışsa kullanıcıya mesaj verilerek
programdan çıkılıyor.
(11) Formumuzun boyutları ve ızgara boyutları
tanımlanıyor.
(12) H adlı etiket içeriği “Hesap numarasi” oluyor.
(13) hisim adlı tanımladığımız text nesnesi
oluşturuluyor.
(14) I adlı etiket içeriği “İsim” oluyor.
(15) isim adlı tanımladığımız text nesnesi oluşturuluyor.
(16) S adlı etiket içeriği “Soyisim” oluyor.
(17) soyisim adlı tanımladığımız text nesnesi
oluşturuluyor.
(18) P adlı etiket içeriği “Hesap” oluyor.
(19) hesap adlı tanımladığımız text nesnesi
oluşturuluyor.
(20) next adlı tanımladığımız “İleri” etiketli buton
oluşturuluyor.
(21) done adlı tanımladığımız “Çıkış” etiketli buton
oluşturuluyor.
(22) Formumuzun görünür olması sağlanıyor. (Visible
özelliği false yapılarak formumuzun görünmemesini sağlayabiliriz.)
(23) kayitoku adlı fonksiyon kodları başlıyor.
(24) Değişkenlerimiz tanımlanıyor.
(1)import java.io.*;
import
java.awt.*;
import
java.awt.event.*;
(2)public class dosyaoku extends Frame implements
ActionListener
{
(3) private
TextField hismi,isim,soyisim,hesap;
(4) private
Button next,done;
(5) private
DataInputStream oku;
(6) private
Label H,I,S,P;
(7) public
dosyaoku()
{
(8)
super("Musteri dosyasi oku");
(9) try
{
oku=new DataInputStream(new
FileInputStream("musteri.txt"));
}
catch(IOException e)
{
(10)
System.err.println("Dosya dogru acilamadi\n"+e.toString());
System.exit(1);
}
(11)
setSize(300,150);
setLayout(new GridLayout(5,2));
(12) H=new Label("Hesap numarasi");
add(H);
(13) hismi=new
TextField();
add(hismi);
(14) I=new
Label("Isim");
add(I);
(15) isim=new
TextField(20);
add(isim);
(16) S=new
Label("Soyisim");
add(S);
(17)
soyisim=new TextField(20);
add(soyisim);
(18) P=new Label("Hesap");
add(P);
(19) hesap=new
TextField(20);
add(hesap);
(20) next=new
Button("ileri");
next.addActionListener(this);
add(next);
(21) done=new
Button("cikis");
done.addActionListener(this);
add(done);
(22)
setVisible(true);
}
(23) public void
kayitoku()
{
(24) int
account;
String first,last;
double balance;
try
{
account=oku.readInt();
first=oku.readUTF();
last=oku.readUTF();
balance=oku.readDouble();
hismi.setText(String.valueOf(account));
isim.setText(first);
soyisim.setText(last);
hesap.setText(String.valueOf(balance));
}
catch(EOFException eof)
{
dosyakapat();
}
catch(IOException io)
{
System.err.println("Dosya okurken
hata olustu\n"+io.toString());
System.exit(1);
}
}
public void actionPerformed(ActionEvent
e)
{
if(e.getSource()==next)
kayitoku();
else
dosyakapat();
}
private void dosyakapat()
{
try
{
oku.close();
System.exit(0);
}
catch(IOException e)
{
System.err.println("Dosya Kapama
Hatasi olustu\n"+e.toString());
System.exit(1);
}
}
public static void main(String args[])
{
new dosyaoku();
}
}
Şekil 12 Şekil
13
Yazdığımız Java programı derlendiğinde
yukarıdaki form ile dosyadan verilerimizi okuyabiliriz.
BÖLÜM 5
RANDOM (RASGELE ERİŞİMLİ) DOSYALAR
Java
programlama dilinde kullanılan bir diğer dosya tipi de random (rasgele erişimli
) dosyalardır. Bu dosyaların sıralı dosyalardan farkı erişilmek istenen kayıta,
kayıt numarası verilerek erişilebilmesidir. Halbuki sıralı dosyalarda, istenen
kayıta ulaşmak için diğer kayıtlar üzerinden kontrol edilerek geçilmesidir, bu
da tabii ki zaman kaybına yol açmaktadır.
Aşağıdaki
Java programı random dosyaya kayıt girilmesi sırasında kullanılacak metotların
tanımladığı kısımlardır. Bu program diğer Java programlarında sınıf olarak
kullanılıp, burada tanımlanan metotların diğer programlarda da kullanılması
sağlanmıştır. ( Çoban,2000)
|
import
java.io.*;
public class kayit
{
private int hesap;
private String soyisim;
private String isim;
private double hesaptakipara;
public void oku(RandomAccessFile dosya)
throws IOException
{
hesap=dosya.readInt();
char first[]=new char[15];
for(int
i=0;i
{first[i]=dosya.readChar();}
isim=new String(first);
char last[]=new char[15];
for(int
i=0;i
{last[i]=dosya.readChar();}
soyisim=new String(last);
hesaptakipara=dosya.readDouble();
}
public void yaz(RandomAccessFile
dosya) throws IOException
{
StringBuffer buf;
dosya.writeInt(hesap);
if(isim!=null)
buf=new StringBuffer(isim);
else
buf=new StringBuffer(15);
buf.setLength(15);
dosya.writeChars(buf.toString());
if(soyisim!=null)
buf=new StringBuffer(soyisim);
else
buf=new StringBuffer(15);
buf.setLength(15);
dosya.writeChars(buf.toString());
dosya.writeDouble(hesaptakipara);
}
public void yazhesap(int
a){hesap=a;}
public int okuhesap(){return
hesap;}
public void yazisim(String
f){isim=f;}
public String okuisim(){return
isim;}
public void yazsoyisim(String
f){soyisim=f;}
public String okusoyisim(){return
soyisim;}
public void
yazhesaptakipara(double b){hesaptakipara=b;}
public double
okuhesaptakipara(){return hesaptakipara;}
public static int boyut(){return
72;}
}
Aşağıdaki
program random tipli bir dosyayı bellekte yaratmak için kullanılır. kayit
isimli biraz önce tanımladığımız sınıfın import edilip, sahip olduğu metotların
kullanıldığına dikkat ediniz.
|
import
java.io.*;
import
java.awt.*;
import
java.awt.event.*;
import
kayit;
public class rasdosyarat
{
private kayit hesapdosyasi;
private RandomAccessFile girdi;
public rasdosyarat()
{
hesapdosyasi=new kayit();
try{
girdi=new RandomAccessFile("musteri1.dat","rw");
for(int i=0;i<100 i="" o:p="">100>
{hesapdosyasi.yaz(girdi);}
}
catch(IOException e)
{
System.err.println("Dosya a‡ma
hatas\n"+e.toString());
System.exit(1);
}
}
public static void main(String args[])
{
rasdosyarat H=new rasdosyarat();
}
}
Aşağıdaki
program bir form ara yüzü tanımlanarak random dosyaya bilgi girişi yapılmasını
sağlar.
|
import
java.io.*;
import
java.awt.*;
import
java.awt.event.*;
import
kayit;
public class dosyaz extends Frame
implements ActionListener
{
private TextField
hesapalani,isimalani,soyisimalani,hesaptakiparaalani;
private Button birsonraki,kapat;
private RandomAccessFile girdi;
private kayit hesapdosyasi;
public dosyaz()
{
super("Dosyaya Yaz");
hesapdosyasi=new kayit();
try
{
girdi=new
RandomAccessFile("musteri1.dat","rw");
}
catch(IOException e)
{
System.err.println("Dosya
Acma Hatas\n"+e.toString());
System.exit(1);
}
setSize(300,150);
setLayout(new GridLayout(5,2));
add(new Label("Hesap
numarasi"));
hesapalani=new TextField();
add(hesapalani);
add(new Label("˜sim"));
isimalani=new TextField(20);
add(isimalani);
add(new
Label("Soyisim"));
soyisimalani=new TextField(20);
add(soyisimalani);
add(new Label("Hesaptaki
Para"));
hesaptakiparaalani=new
TextField(20);
add(hesaptakiparaalani);
birsonraki=new
Button("Gir");
birsonraki.addActionListener(this);
add(birsonraki);
kapat=new
Button("€kŸ");
kapat.addActionListener(this);
add(kapat);
setVisible(true);
}
public void eklekayit()
{
int accountNumber=0;
Double d;
if(!hesapalani.getText().equals(""))
{
try
{
accountNumber=Integer.parseInt(hesapalani.getText());
if(accountNumber<=100)
{
hesapdosyasi.yazhesap(accountNumber);
hesapdosyasi.yazisim(isimalani.getText());
hesapdosyasi.yazsoyisim(soyisimalani.getText());
d=new
Double(hesaptakiparaalani.getText());
hesapdosyasi.yazhesaptakipara(d.doubleValue());
girdi.seek((long)(accountNumber-1)*kayit.boyut());
hesapdosyasi.yaz(girdi);
}
hesapalani.setText("");
isimalani.setText("");
soyisimalani.setText("");
hesaptakiparaalani.setText("");
}
catch(NumberFormatException nfe)
{
System.err.println("Hesap
numaras tamsay de§iŸken olmal");
}
catch(IOException io)
{
System.err.println("Dosyaya
yazarken hata oluŸtu\n"+io.toString());
System.exit(1);
}
}
}
public void
actionPerformed(ActionEvent e)
{
eklekayit();
if(e.getSource()==kapat)
{
try
{girdi.close();}
catch(IOException io)
{
System.err.println("Dosya
kapatlamad\n"+io.toString());
}
System.exit(0);
}
}
public static void main(String
args[])
{
new dosyaz();
}
}
Şekil 14 Şekil
15
dosyaz
adlı Java programı derlendiğinde random tipli dosyaya veri girişi yapılması
sağlayan yukarıdaki form ekrana gelir.
BÖLÜM 6
JDBC
Bundan sonraki
iki bölümde JDK ile gelen sınıflar sayesinde, ilişkili veri tabanlarına veya
SQL(Yapısal sorgulama dili) ile ulaşılan veri tabanlarına göz atacağız.
İlk olarak
veri tabanlarının veri nasıl depoladıklarını öğrenelim. Java bunu basit olarak
SQL, veri tabanlarının yönetimi ve sorgulanmasında kullanılan dil, ile yapar.
Daha sonra da Java Database Connectivity (JDBC) –Java veritabanı bağlantısı-
,verilerin sunulması ve alınmasında kullanılan standart, sınıflarına göz
atacağız. Bir kere veri tabanına bağlandıktan sonra, artık SQL dilini
kullanarak verilere işleyebilirsiniz.
Bu bölümde işleyeceklerimiz
özeti, SQL ve JDBC dir. Bir sonraki
bölümde ise JDBC ile sağlanan özellikle ve veri tabanı sunumunun nasıl
yapılacağını öğreneceğiz.bu bölümde öğreneceklerimiz:
·
Veri tabanı nedir?
·
Basit SQL cümlecikler nelerdir ve bunları nasıl
uygularız.
·
JDBC ile veri tabanı bağlantısı nasıl
gerçekleştirilir?
·
JDBC programları nasıl yazılır?
·
JDBC uygulamalarındaki anahtar noktalar
nelerdir?
(www.java.sun.com)
6.1 JDBC İçeriği ve Terminolojisi
İlk olarak
veri tabanı terminolojisine bakalım. Veri tabanına ulaşma, uzaktaki veya yerel
bir veri tabanına ulaşıp, buradaki verilerin alınması veya işlenmesi anlamına gelir. Veri tabanları ilişkisel
olmak zorunda değildir. Bir çok değişik formda veri tabanları olabilir,
bunlardan bazıları;
Uzaktan
erişimli ilişkisel server üzerinde bulunan veri tabanları; örneğin SQL Server.
Yerel
bilgisayarınızda bulunan ilişkisel veri tabanları; örneğin Personal Oracle veya
Microsoft Access.
Bilgisayarınızdaki
metin dosyaları.
Tablolama
programları.
Uzaktan veri
erişimine izin veren mainframe bilgisayarlar.
Canlı bilgi
sevisleri; örneğin Dow Jones vb.
JDBC,
ilişkisel veri tabanlarına ara yüz olarak tanımlanabilir. JDBC ilişkisel veri
tabanlarına ulaşmada kullanılabilmesine rağmen ben bu bölümde ve bir sonraki
bölümde JDBC ile ilişkisel veri tabanlarına ulaşmayı anlatacağım. Eğer daha
önce ilişkisel veri tabanlarıyla ilgilenmediyseniz, şu tavsiyeleri dinlemelisiniz. İlişkisel veri
tabanları mantıksal olarak öğrenmesi oldukça kolay ve zevklidir.
Java Veri
tabanı bağlantısı (JDBC) sınıfları SQL cümlelerini çalıştırarak ilişkisel
ver,tabanları erişimi ve bu veriler üzerinde işlem yapmayı sağlar. JDBC nesneye
dayalı, veri tabanına erişim için geliştirilen uygulama programları ara yüzü
(Application Programming Interface - API), ve Java geliştiricileri ve veri
tabanları için standart olarak geliştirilmiştir.
JDBC, diğer
bir veri tabanı ara yüzü olan, X/Open SQL CLI( Call Level Inteface),
özellikleri temel alınarak geliştirilmiştir. Fakat bu standardın bilgisine
sahip olmak , JDBC öğrenmek için yeterli değildir. Buna rağmen, veri tabanına
ulaşmak için yazılmış bir veri tabanı programınız varsa, JDBC ye kullanmadan önce bu deneyime sahip
olmanız sizin için çok iyi olacaktır.
Java.sql
paketi, veri tabanına ulaşmada kullanılan API ler içeren sınıflar
barındırmaktadır.
Aşağıdaki şekil technical_library veritabanı ( Wrox Web sitesinden ulaşılabilir) temel bileşenlerini göstermektedir. Bu şema bu sonraki anahtar noktaların anlatmakta ve örneklerde kullanılacaktır.
Şekil 16
Bu tablo basit bir veri tabanı örneğidir. Sizde bunun
benzer, ilişkili veri tabanları
yaratabilirsiniz.
İlişkisel
veri tabanlarını üzerinde yapacağınız her türlü işlem, SQL (Structed Query
Language –Yapısal Sorgulama Dili) ile sağlanacaktır. SQL Java gibi uygulama
dili değildir. SQL daha çok sorgulama ve deklare için kullanılır. Bu da veri
tabanı sunucusuna ne yapmak istediğini söylemesi fakat bunu nasıl yapılacağını
söylememesi anlamına gelir. Her bir SQL
cümleciği veri tabanı sunucusu tarafından analiz edilir, işlemler bu tanımlama
doğrultusunda parçalara ayrılarak veri tabanı motoru tarafından sağlanır. Veri
tabanı motoru çeşitli istekleri birleştirir. Değişik kurumsal veri tabanı
istekleri genel veri tabanı motorlarını kullanabilir.
6.2 Tablolar
İlişkisel veri
tabanları tablolardan oluşur. Tablo, yukarıdaki authors adlı tabloda olduğu
gibi, ilişkiyi sağlayan bir adet primary (birincil) veritabanı olacaktır. Her
hangi bir zamanda yapacağınız Define, create, update, delete işlemlerinde tablo
içerisindeki verilerle çalışacaksınız.
Bir veri
tabanında tablo yarattığınızda, verilerinizi içerecek dikdörtgen şekilli bir
ızgara yaratmış olacaksınız. Kısacası tablo satır ve sütunlardan oluşan veri
tabanı yapısıdır. Her bir satır, birbirleriyle ilişkili verileri içerir,
kısacası veri nesneleri arasında bağlantıyı sağlar.
Satırlar
için teknik terim tuple dir. Her bir
sutun satırı alan denilen bölümlere ayırır, ve bu sütunlar, satırlardaki
nesneler ait özellikler olarak tanımlanır. Böylece tabloda bir çok sütun
karışık halde yerleştirilmiştir.
Şekil 17
Mantıksal
olarak tablo, satır ve sütunlardan oluşan bir yapı olsa da aslında fiziksel
olarak böyle değildir. Ama biz verilere ulaşırken bu yapı ile
karşılaşacağımızdan bu kadarını bilmemiz yeterlidir.
6.2.1 Tablo sütunları
Daha öncede
söylediğim gibi, tablolar dikdörtgen şekilli hücrelerden oluşan ızgaralar
olarak düşünülebilir. Izgara keyfi olarak verilebilecek sayıda satır ve sütuna
bölünebilir. Izgara içerisindeki, her bir sütundaki hücre çeşitli veriler
içerir. Sadece çeşitli tipte veri içermez, aynı zamanda alana isimlerine
kategorilere ayrılmış verilerde içermiş olur. Örneğin bir önceki şekildeki lastname adlı adlı alan authors adlı
tablodaki üç alandan biridir.
6.2.2 Tablo satırları
Tablo
içerisindeki her bir satır, tuple olarak adlandırılan ilişkili verilerin
oluşturduğu yapıdır. Bazı veri tabanlarında her bir satıra kayıt denir.
Author adlı tablodaki bir satır (kayıt).
Şekil 18
6.3 SQL ile tanışalım
Yapısal sorgulama dili (Structed Query Language) ilişkisel veri tabanlar için geliştirilmiş bir standart olarak kabul edilmektedir. SQL dilinin ilişkisel veri tabanları için sorgu dili olarak kabul edilmesi 1980 li yıllarda istemci/sunucu mimarisinin ortaya çıkmasıyla kabul görmüştür.
SQL dilinde ilginizi çekecek ilk özellik kolay okunabilmesidir. Her bir sorgulamadaki yapı İngilizce diline çok yakındır. Syntax çok kaolay öğrenilebilir ve anlaşılabilirdir. İkinci olarak, SQL de kullandığınız komutlar veri tabanında en çok kullanacağınız sorgulamalar için geliştirilmiştir. Veri tabanına isteğinizle ilişkili bir sorgu gönderirsiniz, veri tabanı size bir sonuç gönderir veya bir işlem gerçekleştirir.
6.4 Veri tabanı tabloları geliştirme
Daha önce
örnek verdiğimiz, technical_library tablosunda
aşağıdaki alanları oluşturmak isteyelim.
·
Books
·
Article
·
Authors
·
Publishers
Bu
alanlarında aşağıdaki bilgileri içereceği düşünelim.
Books
·
ISBN
·
Kitap adı
· Yazarlar
Publishers
· Yazarlar
·
Başlık
·
Yayım tarihi
Authors
·
Soyadı
·
Adı
·
Yayımlanan kitapları
·
Yayımlanan makaleleri
Yayımcı
·
Yayımcı kodu
·
Adı
(www.java.sun.com)
Şimdi veri
tabanındaki tabloları oluşturmaya başlayalım. Bu tablomızın adına authors
diyelim. Bu tablodaki sütunlar ise aşağıdaki şekilde olsun.
Sütun başlığı
|
Açıklaması
|
Authid
|
Bir çok
yazar aynı isme sahip olabilir.
|
Lastname
|
Aile adı
|
Firstname
|
İlk adı
|
Address1
|
Adres
için ilk satır
|
Address2
|
Adres
için ikinci satır
|
City
|
Şehir
|
State_prov
|
Devlet
|
Postcode
|
Postakodu
|
Country
|
Ülke
|
Phone
|
Telefon
|
Fax
|
Fax
|
Email
|
Email
adresi
|
Tablo 1
Şimdi
yapmamız gereken her sütunun başlığını uygun bir veri tipi seçmektir. Tabii ki
burada geçerli olan SQL dili Java programlama dilinin kullandığı değişken
yapılarıdır. Tanımlanan bu veri tipleri SQL tarafından kabul edilir ve işleme
konulur. Şimdi SQL in desteklediği bir kaç veri tipine bakalım.
SQL Veri
Tipleri
|
Tanımlama
|
CHAR
|
Değişebilen
uzunluktaki string
|
VARCHAR
|
Değişebilen
uzunluktaki string
|
SQL Veri
Tipleri
|
Tanımlama
|
BOOLEAN
|
Mantıksal
değerler –true veya false
|
SMALLINT
|
Küçük
tamsayı değeri, -127 +127
|
INTEGER
|
Büyük
tamsayı değeri, -32767 +32767
|
NUMERIC
|
Noktalı
sayılar
|
FLOAT
|
Kayan
noktalı sayılar
|
CURRENCY
|
Para
birimi
|
DOUBLE
|
Yüksek
duyarlıklı kayan noktalı sayılar
|
DATE
|
Tarih
|
TIME
|
Zaman
|
DATETIME
|
Tarih ve
zaman
|
RAW
|
Binary
veri(nesneleri veri tabanında tutar)
|
Tablo 2
Şimdi de
oluşturacağımız tablodaki alanların veri tiplerini belirleyelim.
Sütun adı
|
Veri tipi
|
Authid
|
INTEGER
|
Lastname
|
VARCHAR
|
Firstname
|
VARCHAR
|
Address1
|
VARCHAR
|
Address2
|
VARCHAR
|
City
|
VARCHAR
|
State_prov
|
VARCHAR
|
Pzpcode
|
VARCHAR
|
Country
|
VARCHAR
|
Phone
|
VARCHAR
|
Sütun adı
|
Veri tipi
|
Fax
|
VARCHAR
|
Email
|
VARCHAR
|
Tablo 3
6.4.1 Tablomuz nasıl çalışacak
Sütun adları
alan içerisinde saklanacak bilgi hakkında bilgi verir, fakat bilgisayar alan
adlarından hangi tip verilerin saklanacağını anlayamaz. İşte bunu belirlemek
için her bir alan bir veri tipine sahiptir
Books tablosu
Sütun başlığı
|
Açıklaması
|
Isbn
|
Kitap
için global bir tanımlama
|
Title
|
Kitabın
adı
|
Pub_code
|
Kitabın
yayımlayıcısının kodu
|
Tablo 4
Sütun adı
|
Veri tipi
|
Isbn
|
VARCHAR
|
Title
|
VARCHAR
|
Pub_code
|
CHAR(8)
|
Tablo 5
6.4.2 Tabloların dizayn edilmesi ve ilişkilendirilmesi
Author tablosu
ile book tablolarının isbn(kitap tanımlayıcısı) ve authid alanlarıyla
ilişkilendirildiği görmek çok da zor değildir. Ancak bu iki alanın birbiriylr
ilişkili olabilmesi için veri tiplerinin de aynı olması gerekmektedir.
Şekil 19
Yukarıdaki
oluşturulan auth_books tablosuna kesişim tablosu denir. Şimdi tablolarımızı
oluşturduğumuza göre artık SQL cümleleri kullanarak veri tabanımızdaki
tablolara bilgi girişi yapabiliriz.
6.5 SQL Yapıları
Çoğu SQL
yapıları 2 grupta toplanır.
·
Veri
tanımlama dili(DDL-Data Definition Language) :Tablo ve
içindeki verileri tanımlamada kullanılır.
·
Veri işleme
dili(DML-Data Manupiliting Language):Veriler üzerinde işlem yapmakta
kullanılır.
a. SELECT cümleciği: Bir dizi sonuç çevirir.
b. Everything else cümleciği: Sonuç
çevirmez
Tablo
oluşturmak için, örneğimizde DDL kullanacağız .DDL CREATE TABLE ve ALTER TABLE
gibi SQL cümleleri içermektedir. Projemizin ilerleyen kısımlarında DML
yapılarını kullanarak tablolarımıza veri ekleme,veri arama gibi işlemler
yapacağız.
DDL için
bir örnek:
CREATE
TABLE authors{
authid INT
NOT NULL PRIMARY KEY,
lastname
CHAR(15) NOT NULL,
firstname
CHAR(15),
address1
CHAR(25),
address2
CHAR(25),
city
CHAR(25),
zipcode
CHAR(10),
country
CHAR(15),
phone
CHAR(20),
fax
CHAR(20),
email
CHAR(25));
SQL
cümleciklerinin büyükle yazıldığına dikkat ediniz. Daha kullanışlı olması
açısından VARCHAR veri tipi tanımlaması yerine CHAR veri tipi tanımlanmıştır.
NOT NULL
PRIMARY KEY söz dizimi veri tabanına iki ey belirtmektedir. Birincisi authid
sütunundaki, her bir satırdaki alanın değeri NULL olamaz. Her bir satırda bu
alanın bir değeri girilmelidir. İkinci olarak, PRIMARY KEY açıklaması bu alanın
tabloda index alanı olacağı anlamına gelmektedir. Bu alan için girilen kayıt
veri tabanında sadece bir adet olabilir. Yani authid alanındaki değer başka bir
kayıtta tekrarlanamaz.
Bu
anlattıklarım, veri tabanın index alanının en önemli özelliklerindendir. Create
deyimiyle veri tabanının oluşturduktan sonra sırada INSERT deyimiyle tabloya
veri girmeye gelmiştir.
6.5.1 INSERT Cümleciği
Insert
cümleciği için 3 önemli bölüm vardır.
·
Veri eklenecek hedef tablo belirlenir.
·
Verilerin atanacağı sütunlar belirlenir.
·
Bu sütunlar için kullanılacak veriler belirlenir.
Insert
cümleciği INSERT INTO, kelimeleriyle
başlar ve hedef tablo adıyla devam eder.
INSERT INTO authors
Daha sonra
hedef tabloda verilerin atanacağı sütun adları belirtilir.
(authid,lastname,firstname,email)
Son olarak
bu sütunlara atanacak verileri belirlemeye sıra gelmiştir.
VALUES (99,’catmali’,’murat’,’catmali@hotmail.com)
Böylece
INSERT cümleciği tamamlanmış oldu.
INSERT INTO
authors (authid,lastname,firstname,email) VALUES ‘99,’catmali’,’murat’,’catmali@hotmail.com)
6.5.2 SELECT Cümleciği
Veri tabanından verileri almak için kullanılır. SELECT cümleciği için 4 önemli bölüm vardır.
Hangi verilerin alınacağı belirlenir.
Verilerin
nereye alınacağı belirlenir.
Şartlar ve
filtereler belirlenir.
Hangi sırayla
verilerin alınacağı belirlenir.
Select cümleciğinden sonra ikinci sırada
hangi sürunların alınacağının karar vermektedir.
SELECT firstname, lastname,authid
Şimdi de
verilerin hangi tablodan alacağımıza karar vermeliyiz. Belki bir kaç tabloda
aynı alanlar olabilmesi olasılığı vardır. Burada FROM deyiminden sonra tablo
adı belirtilerek bu sorun aşılabilir.
FROM authors
Sonuç
olarak ;
SELECT firstname, lastname,authid FROM authors
Veri
tabanından aldığımız alanlara takma isim (alias) verebiliriz. Böylece birden
fazla alanı tekbir alan altında toplayabiliriz.
Örneğin;
SELECT firstname, lastname,authid AS author_id FROM authors
Bu örnekte veri tabanından alınan üç alan author_id alanında birleştirilmiştir.
Eğer
tablodaki bütün alanları seçmek istersek;
SELECT * FROM authors cümleciği
işimizi görecektir.
İstediğimiz
bir özellikteki alanlardaki kayıtları seçebileceğimiz SQL SELECT cümleciği
örneği;
SELECT lastname,firstname FROM authors WHERE country=’UK’
Bu cümleyle
country=’UK’ olan kayıtlardaki lastname,
firstname alanları authors adlı tablodan seçilmektedir.
6.5.3 UPDATE Cümleciği
Bu SQL
cümleciği, tablodaki varolan veriyi değiştirmek için kullanılır. Update
cümleciğinden önce işlem yapılacak alanın SELECET cümleciği ile seçilmesi
gerekmektedir. Update kelimesini işlem yapılacak tablo adı takip eder.
UPDATE authors
Set
kelimesiyle belirtilen tablodaki alanın yeni değerini belirlenebilir.
SET lastname=’catmali’
Son olarak da
filtre (şart) verilerek hangi kayıtın UPDATE işleminden etkileneceği belirlenir.
WHERE authid=27
Bu cümleyle
authid alanı 27 olan kayılar UPDATE cümleciğinde belirtilen işleme tabi
tutulur.
Sonuç olarak
UPDATE cümleciğinin son hali;
UPDATE authors
SET lastname=’catmali’ WHERE authid=27
6.5.4 DELETE Cümleciği
Veri
tabanındaki herhangi bir tablodan istenilen şarta uygun kayıtların silinmesinde
kullanılır. DELETE cümleciği DELETE, FROM, WHERE anahtar kelimelerinden
oluşmaktadır.
DELETE FROM books WHERE isbn=’015415454’
Bu SQL
cümleciği ile books adlı tablodan isbn alanı 015415454 olan kayıtlar
silinmektedir.
6.6 JDBC Paketi
JDBC paketi
SQL cümlelerini alıştırmak için hazırlanmış yüksek seviyeli bir veri erişim ara
yüzüdür. Yani, JDBC veri tabanı satır ve sütun işlemlerini otamatik olarak
düzenlemek üzere geliştirilmiş bir ara yüzdür. JDBC uygulamaları değişik veri
tabanları için geliştirilmiştir. Bu yüzden diğer veri tabanlarına geçiş hiç de
Şekil 20
zor
olmayacaktır.
Kullanıcı için
JDBC java uygulamaları üstte görüldüğü gibidir.
JDBC veri
tabanı yönetimini her bir veri tabanı sürücüsüne JDBC ara yüzü ile ilişki
kurarak yapmaktadır. Bu sayede JDBC sınıfları veri tabanı alarak diğer Java
sınıfları tarafından işlenmesine olanak vermektedir. Bundan noktadan sonra bu
konu üzerinde durulacaktır.
6.6.1 JDBC ve ODBC ilişkisi
JDBC
uygulamalarının bu kadar pratik
olmasının ana nedeni diğer veri tabanı uygulamalarıyla uyumlu olmasıdır. JDBC
ve ODBC ‘nin ortak yanı da, daha önce bahsedildiği gibi ikisinin de SQL X/Open
CLI tabanlı olmasıdır.
Bu noktadan
sonra kullanılacak bazı teknik terimlerin açıklanmasında yarar vardır.
6.6.2 Sürücü yöneticisi (Driver manager):
Veri tabanı sürücülerini yükler, ve uygulama ile sürücü arasındaki bağlantıyı
yönetir.
6.6.3 Sürücü (Driver): Uygulama veri
tabanıyla ilgili isteklerini, veri tabanının anlayacağı çağrılara dönüştürür.
6.6.4 Bağlantı (Connection): Uygulama ve veri tabanı arasındaki oturum.
6.6.5 Cümle (Statement): Sorgulama ve güncelleme işlemlerinin yapılmasında kullanılan SQL cümleleri
6.6.6 Metadata: Veri, veri tabanı ve sürücü hakkında alınan
bilgiler.
6.6.7 Sonuç seti (Result Set) : SQL cümlelerin işlenmesi sonucu ortaya çıkan, mantıksal satır ve sütun yapıları.
6.6.1.1 JDBC Temelleri
Bu bölümde
buraya kadar anlattıklarımı ve gerekli sürücülerin bilgisayarınızda yüklü
olduğu kabul edilmektedir.
·
Gerekli olan sınıfları yükleyin.
·
JDBC sürücüsünü yükleyin.
·
Veri tabanını belirleyin.
·
Nesne ile bağlantıyı sağlayın.
·
SQL cümleciği ile bağlantıyı sağlayın.
·
SQL cümleciğini kullanarak sorguyu çalıştırın.
·
Sonuç seti ile verileri alın.
·
Sonuç setini kapatın.
·
SQL cümleciğini kapatın.
·
Bağlantı nesnesini kapatın
JDBC mimarisi
Java ara yüzleri ve sınıfları sayesinde veri tabanıyla iletişim kurup, SQL
cümlecikleri sayesinde veri tabanında
Create,
Execute gibi işlemleri yerine getirmeye dayanmaktadır.
Bu işlemler
aşağıdaki şemada gösterilmektedir.
|
|
|
Şekil 21
Her bir kutu
veri tabanına erişimde ve verilerin sunumunda kullanılan ana noktalardır; JDBC
sınıfları, ara yüzleri vb. JDBC ile ilgili bütün işlemlerde ilk kullanılan
Sürücü yöneticisi sınıfıdır. İlk olarak technical _library veri tabanına
bakarak başlangıç noktamızı belirleyelim.
6.6.1.1.1 Veri tabanın hazırlanması
Sürücü
yöneticisinin öğrenilmesinden önce incelenmesi gereken önemli bir nokta, JDBC sürücülerinin
kodlarının kullanılarak bağlanılacak veri tabanının belirlenmesidir.
Technical_library adlı veri tabanımız, teknik kitaplarla ilgili bilgilerin
saklandığı Ms Access veri tabanı osun. Bu veri tabanı Wrox Web sitesinden
download edilebilir.
Windows
işletim sisteminde, Start->Settings->ControlPanel den ODBC Data Sources
ile kullanılacak veri tabanının bağlantısının yapılması gerekmektedir. Bir
sonraki bölümde bu konu ayrıntılı olarak işlenmiştir.
Eğer veri
tabanıyla bağlantı sağlandıysa Java sınıfları, build tables, tablo yaratmak
içiçn kullanılabilir.
java build_tables buildlibrary_access.sql
Bundan
noktadan sonraki bütün örneklerde JDBC-ODBC köprüsü
sun.jdbc.odbc.JdbcOdbcDriver ile sağlanacaktır.
6.6.2 DriverManager (Sürücü Yöneticisi)
Jdbc veri
tabanı sürücüleri sürücü ara yüzlerini içeren sınıflar tarafından
tanımlanmıştır. DriverManager JDBC sürücüleri sayesinde veri tabanı kaynağı ile
bağlantıyı kuran sınıftır. Eğer her
hangi bir Jdcb sürürücüsü “jdbc.drivers” olarak bilgisayerınızın sistem
özellikerinde kabul edilmişse, DriverManager sınıfı bu veri tabanı alıp
yükleyecektir.
Sistem
özellikleri genel olarak Properties sınıfında kayıtlıdır. Properties sınıfı
jva.util paketi içerisindedir. Bu sınıfın özellikleri ayrıntılı olarak bir
sonraki bölümde incelenecektir.
Sistem
özellikleri System sınıfının setProperty ( ) metodu ile “jdbc.drivers” olarak
düzenlenebilir.
System.setProperty(“jdbc.drivers”,”sun.jdbc.odbc.JdbcOdbcDriver”);
Birinci
parametre özelliklerin set edilmesi için, ikinci değer ise değeri gösterir. Bu
ifade system property nesnesinde JDBC ODBC sürücüsü tanımlar. Bu sürücü ODBC
destekli bütün veri tabanları tarafından destekler. Eğer birden fazla sürücü
kullanmak istersek, birden fazla sürücü ismi ifadede arka arkaya yerleştirilir.
Eğer
sistem yöneticiniz izin verirse,
getProperties( ) metodu ile Properties nesnesi hakkında bilgi edinebilirsiniz.
Properties( ) sınıfı, List ( ) metodu
ile aşağıdaki gibi sistem özelliklerini listeler;
System.getProperties( ).list(System.out
);// bütün özellikleri listeler
Kullanacağınız
sürücü adını belirlemek için;
Class.forName(“sun.Jdbc.Odbc.JdbcOdbcDriver”
);//ODBC sürücüsünü yükler.
kullanılır.
forName( )
bloğunda belirtilen sürücünün açılamaması durumunda try-catch bloğu içerisinde
hataya ilişkin mesaj kullanıcıya verilir. Artık bir JDBC sürücüsüne bağlanmak
istediğinizde yeniden bağlantı nesnesini oluşturmanıza gerek yoktur.
DriverManager sınıfı bu işlemi sizin için yerine getirecektir.
6.6.4 Veri tabanına bağlantıyı kurma
Bir SQL
cümleciğini çalıştırmadan önce yapmanız gereken, bir Connection (bağlantı)
nesnesi yaratmaktır. Connection nesnesi veri tabanıyla bağlantıyı sağlayarak,
SQL cümleciğinin çalıştırılması için ortam hazırlar. Bunun yanında, Connection(
) nesnesi, veri tabanı (metadata), kullanıma uygun olan tablolar, satırlar ve
sütunlar hakkında bilgi almamızı sağlar.
Connection( )
nesnesi veri tabanıyla aşağıdaki şekilde bağlantıyı kurar;
Connection
databaseConnection=DriverManager.getConnection(source);
Source olarak
belirtilen kısım, veri tabanının bilgisayardaki yerini (URL) gösteren String
tipi ifadedir.
6.6.4.1 URL ve JDBC
Veri
tabanına bağlantıyı sağlamak için
kullanılan URL, WWW da, FTP server da veya ağ üzerindeki veri tabanın
elektronik olarak yolunu gösterir.
Jdbc:://
Bu kod satırı
JDBC veri tabanın yolunu tanımlar. Sub protocol ile gösterilen kısım
kullanılacak JDBC sürücüsünü tanımlar. Örneğin JDBC-ODBC köprüsü odbc
sürücüsünü kullanır.
Daha önceden
tanımladığımız, technical_library veri tabanı için kullanılacak URL formatı;
jdbc:odbc:technical_library.
6.6.4.2 Bağlantıyı kuralım
Aşağıdaki jdbc programı Connection nesnesi sağlar. URL ile veri tabanına bağlantı gerçekleştirilmiştir.
Örneğimiz nasıl çalışır:
Doğal olarak
JDBC kütüphanelerinin, sınıflarının ve ara yüzlerinin yüklenmesi gerekmektedir.
Bu sınıflar java.sql paketinde tanımlanmıştır. main( ) bloğunun vaşında forName
( ) metoduyla programımız için gerekli olan, JDBC sürücüsü için sınıfları
yüklenir. Daha önce de belirtildiği gibi, forName( ) metoduyla belirtilen
sürücü sınıfının bulunamaması durumunda
ClassNotFoundException ile
kullanıcıya hata mesajı verdirilir. Çoğu JDBC metodu hata kontrolünü
SQLException, hata tespitiyle sağlarlar.
6.6.4.3 Complex bağlantılar
Eğer veri
tabanına bağlantı için kullanıcı adı ve
şifresi gerekiyorsa, getConnection( ) ikinci metodu kullanılır.
DatabaseConnection=DriverManager.getConnection(URL,UserName,Password);
Belirtilen
bütün parametrelerin tipi String ifadedir.
Aşağıdaki program ODBC için JDBC sürücü bağlantısını gerçekleştirir.
6.6.4.4 Bağlantı kesilme süresinin tespiti:
DriverManager
sınıfı, login timeout (bağlantı kesim süresi) periyodunu belirler. Bu metot
saniye olarak bağlantı süresinin belirlenmesini sağlar. Bu süre içerisinde veri
tabanına bağlantının sağlanması gerekir.
public static void setLoginTimeout(int
saniye)
public static void getLoginTimeout(int
saniye)
Bu metodlar veri tabanına uzaktan bağlantı sırasında, server makinenin meşgul olması ihtimaline karşı tanımlanmıştır. Eğer belirtilen sürede veri tabanına bağlanılamazsa bağlantı girişiminin askıya alınması gerekir. Aşağıdaki program 60 saniye içerisinde veri tabanına bağlantı sağlanamaması durumunda bağlantı girişimini askıya alır.
6.6.3 Sürücü çeşitleri
DriverManager
sınıfı yüklendikten sonra bir çok çeşit sürücü ile veri tabanına
bağlanılabilir.
Bunlar;
·
JDBC-ODBC köprü sürücüsü;
·
Yerel uygulama bölümü-Java
·
Bütün ağ protokolleri-Java istemci
·
Bütün yerel protokoller-Java
Sürücülerinin
nasıl çalıştığı hakkında bir mantık gelişmesi için yukarıda belirtilen sürücüler kısaca
anlatılacaktır.
6.6.3.1 JDCB-ODBC köprü sürücüsü (JDCB-ODBC Bridge Driver)
JDCB-ODBC
köprüsü- “sun.jdbc.odbc.JdbcOdbcDriver” ile birlikte JDK içerisinde
gelmektedir. Bu sürücü sayesinde ODBC standardına uygun olarak Java
uygulamalarının veri tabanına bağlanması sağlanır. Sürücü kullanıma uygun olan veri tabanlarına ulaşım için kullanılır.
Bu sürücünün
en büyük avantajı çok sayıdaki ODBC sürücüsüne sorunsuz oalrak bağlanmasıdır.
Dezavantajı ise sadece Microsoft Windows ve Sun Solaris işletim sistemleriyle
uyumlu olarak çalışmasıdır.
6.6.3.2 Yerel uygulama bölümü Java sürücüleri (Native API)
Bu sürücü
köprü sürücüsüne çok benzemektedir. Yerel bir ağdaki veri tabanına ulaşmada
kullanılan sınıfları içeren Java program kodlarından oluşur.
6.6.3.3 Bütün ağ protokolleri-Java istemci (Net Protocol All Java Client)
Bu sınıf
sürücüsü genellikle TCP/IP protokollerini kullanarak ağ uygulamalarında,
istemci JDBC isteklerini dağıtık veri tabanına iletmede kullanılır.
6.6.3.4 Bütün yerel protokoller-Java (Native Protocol All Java)
Server
makinenin yerel ağ protokollerini kullanarak veri tabanına erişimde kullanılan
sürücülerdir. Bir önceki sürücü tipinin tersine herhangi bir dönüşümü gerek
yoktur. İstemci direk olarak veri tabanına erişebilmektedir. Eğer sürücü sınıfı
uygunsa, kullanılması gereken tek sürücü tipidir.
Gerekli olan
JDBC sürücüleri http://www.javasoft.com/jdbc.drivers.html
adresinden download edilebilir.
6.6.5 SQL cümleleri nesneleri (Statement Objects)
Statement
nesneleri, Statement ara yüzünü geliştirmek için kullanılan sınıfları kullanır.
Statement nesnesi yaratıldığında SQL cümleciklerin çalıştırılması, sorgulanması ve sonuçlarının
geri çevrilmesi için bir alan yaratır.
Statment
nesnesi, createStatement( ) metoduyla oluşturulur. Statment nesnesi bir kere
oluşturulmasıyla, SQL cümleciklerinin çalıştırılması için gerekli olan
executeQuery( ) metodu ile sorgulamalar yapılabilir.
Sorgulama
sonuçları ResultSet (Sonuç kümesi) nesnesi şeklinde geri döner. Eğer Statment
nesnesine sahip olmak istiyorsanız aşağıdaki sintaksı kullanmalısınız.
Resulset results=statement.executeQuery
(“SELECT lastname, firstname FROM authors“)
6.6.7 Sonuç kümesi nesneleri( ResultSet Objects)
SQL cümlesinin çalıştırılması
sonucu oluşturulan tablo sonuçlarını içeren ara yüzdür. ResultSet nesnesi ile
elde edilen sonuçlara uygun olarak imleç veri tabanı kayıtları üzerinde
dolaşır. First ( ) ve last( ) metotları kullanılarak ilk ve son kayıtlara
konumlanır. Bunun yanında beforeFirst( ), beforeLast( ) ve previous( ) gibi bir
çok metot seçeneğimiz vardır.
Çoğu zaman veri tabanı kayıtları
üzerinde ileri ve geri hareket etmemiz gerekebilir. Bu gibi durumlarda
aşağıdaki kod satırları kullanılabilir.
while(resultset..next( ) )
{
//kayıt işlemleri
}
bunun yanında ilk ve son
kayıtlarda olduğumuz kontrol etmemiz için kullanılan isLast( ) ve isFirst( )
metotları da vardır.
6.6.7.1 Resultset nesnesindeki verilere ulaşma
Resultset nesnesi kullanılarak
kayıtların kendisine veya kayıt numarasına ulaşılabilir. Bunun yanında
sütunlardaki veri tipleri sütun sayıları gibi bilgilere de ulaşabiliriz.
Resultset nesnesi sütun ve satır veri tipleri için aşağıdaki temel metotlara
sahiptir.
GetAsciiStream( ) GetTimestamp( ) GetTime( )
GetBoolean( ) GetBinaryStream( ) GetString( )
GetDate( ) GetBytes( ) GetByte( )
GetInt( ) GetFloat( ) GetDouble( )
GetShort ( ) GetObject( ) Getlong( )
Aşağıdaki örnekte
tchnical_library adlı veri tabanına bağlantıyı sağlamak için
MakingTheConnection adlı bir sınıf tanımlamıştır.
Yukarıdaki program tabloya
bağlantı kurulduktan sonra SQL sorgusu sayesinde lastname ve firstname alanları
authors adlı tablodan alıp, kayıtlardaki firstname ve lastname alanları ekrana
listelemektedir.
BÖLÜM 7
JDBC ve UYGULAMA PROGRAMLARI
Java veri
tabanı uygulamaları için Java Bin klasörün de JdbcOdbc.dll dosyasının bulunması
gerekir.
7.1 Jdbc nedir?
Jdbc,
Microsoft’un ODBC (open database connectivity- açık veri tabanı bağlantısı) ara
yüzünü taban alan SQL API’ lerinin bir kümesidir. Jdbc kullanılarak elde edilen
veriler SQL komutlarıyla süzgeçten geçirilerek istenilen amaca yönelik
kullanılabilir.
7.2 Java veri tabanı bağlantısının kurulması:
Java yı
yalnızca internette animasyon, buton hazırlamakta hazırlanmasında kullanılan
bir dil olarak düşünmek yanlış olur. Java SQL komutları sayesinde veri tabanı
bağlantısı gerçekleştirerek istenilen fonksiyonları gerçekleştiren bir dildir.
7.2.1 Access Veri Tabanı İle Jdbc Kullanımı:
Örneğimiz
okulumuzun Bilgisayar Eğitimi bölümü öğrencilerine yönelik kayıt
ekleme,düzeltme,silme kısımlarından oluşacaktır. İncelenecek konunun okuyucu
açısından anlamlı olması öğrenmeyi kolaylaştırıp kalıcı olacağı unutulmamalıdır.
Tezimin bir amacıda benden sonraki arkadaşlarımın yararlanabileceği bir kaynak
yaratmaktır.(Grup Java,2000)
İlk
örneğimiz için Access veri tabanı programı ile boş bir veri tabanı oluşturup,
bu boş veri tabanını ODBC nesnesi ile bağlantı oluşturacağız.
7.7.2.2 ODBC bağlantısının kurulması:
Adım1 :Microsoft Access programı ile OGR
isimli boş bir veri tabanı
oluşturuyoruz.
Şekil 22
Adım2:Boş veri tabanı ile ODBC bağlantısının oluşturulması.
Denetim
Masası altında ODBC nesnesi açılarak System dns sekmesinden Add butonu ile daha
önceden oluşturmuş olduğumuz veri tabanını bağlayalım. Data Source Name alanına
isim verirken dikkatli olalım, çünkü bu isim daha sonra programlarda
kullanacağımız veri tabanı dosyası adı olacaktır
Veri
tabanımızı bağladıktan sonra artık ilk örneğimizi yapabiliriz.
Şekil 23
Şekil 24
Aşağıdaki program Java programı -veri tabanı arası
bağlantıyı kurara .mdb dosyasında bir tablo oluşturur.
|
import java.sql.*;
public class giris{
public
static void main(String args[]){
String url="jdbc:odbc:ogr";
Connection con;
String createString;
createString = "create table KIMLIK"+
"(NO varchar(11)," +
"AD varchar(15)," +
"SOYAD varchar(15)," +
"BOL_KOD varchar(3)," +
"DONEM varchar(2),"+
"D_TAR int)";
Statement
st;
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
System.out.println("Veri
tabanina baglananildi");
}catch(java.lang.ClassNotFoundException
e){
System.err.print("ClassNotFoundException:
");
System.err.println(e.getMessage());
}
try{
con=DriverManager.getConnection(url,"Murat","Murat");
st=con.createStatement();
st.executeUpdate(createString);
System.out.println("Tablo
yaratildi");
st.close();
con.close();
}catch(SQLException
ex){
System.err.println("SQLException:"
+ ex.getMessage());
}
}
}
Şekil 25
Aşağıdaki program .mdb dosyasına kayıt eklemek için
kullanılır. Önce veri tabanı bağlantısı kurulduğuna ve bu bundaki önce bölümde
anlatılan bağlantı nesnelerinin yaratıldığına dikkat ediniz.
|
import java.sql.*;
public class ogrekle{
public static void main(String args[]){
String url="jdbc:odbc:OGR";
Connection con;
Statement stmt;
String query="select * from
KIMLIK";
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}catch(java.lang.ClassNotFoundException
e){
System.err.print("ClassNotFoundException:");
System.err.println(e.getMessage());
}
try{
con=DriverManager.getConnection(url,"Murat","Murat");
stmt=con.createStatement();
stmt.executeUpdate("INSERT
INTO KIMLIK values('1','murat','catmali','240','8','1979')");
stmt.executeUpdate("INSERT
INTO KIMLIK values('2','deniz','kivrak','240','8','1979')");
ResultSet
rs=stmt.executeQuery(query);
System.out.println("OGRENCI LISTES˜");
while (rs.next()){
String s1=rs.getString("NO");
String
s2=rs.getString("AD");
String
s3=rs.getString("SOYAD");
String
s4=rs.getString("BOL_KOD");
String
s5=rs.getString("DONEM");
int n=rs.getInt("D_TAR");
System.out.println(s1 +" "+s2+" "+s3+"
"+s4+" "+s5+" "+n);
}
stmt.close();
con.close();
}catch(SQLException ex){
System.err.println("SQLException:"+ex.getMessage());
}
}
}
Şekil 26
Şekil 27
Aşağıdaki
örnek .mdb dosyasına bir form ile bilgi
girişini sağlar.
|
import java.awt.*;
import java.awt.event.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.Dimension;
import java.sql.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import java.text.*;
import java.util.*;
import java.util.Vector;
public class giris1 extends JInternalFrame{
JButton Bkaydet,Biptal;
JTextField Tbarkod,Tadi,Tadet,Tfiyat;
JLabel Lbarkod,Ladi,Ladet,Lfiyat,Lcinsi;
JComboBox Ccinsi;
Connection con1;
ResultSet rs;
PreparedStatement sorgu,urunInsert,stokInsert;
Statement cinsbul;
String[] cinsler;
public giris1(){
super("šrn GiriŸi",
false,
true,
false,
false);
Container contentPane = getContentPane();
contentPane.setLayout(null);
Bkaydet=new JButton("Kaydet");
contentPane.add(Bkaydet);
Bkaydet.setMnemonic('K');
Bkaydet.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
kaydet();
try{
rs.close();
cinsbul.close();
urunInsert.close();
stokInsert.close();
con1.close();
dispose();
}catch(SQLException ex){
System.err.println("Kaytta Hata Var");
System.err.println(ex);
}
}
});
Biptal=new JButton("˜ptal");
contentPane.add(Biptal);
Biptal.setMnemonic('˜');
Biptal.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
rs.close();
cinsbul.close();
urunInsert.close();
stokInsert.close();
con1.close();
dispose();
}catch(SQLException ex){
System.err.println("Iptalde Hata Var");
System.err.println(ex);
}
}
});
Tbarkod=new JTextField(20);
contentPane.add(Tbarkod);
Tbarkod.addActionListener(new
ActionListener(){
public void
actionPerformed(ActionEvent e){
Tadi.requestFocus();
}
});
Tadet=new JTextField(5);
contentPane.add(Tadet);
Tadet.addActionListener(new
ActionListener(){
public void
actionPerformed(ActionEvent e){
if(Tadet.getText().length()==0){
Tadet.setText("0");
Bkaydet.requestFocus();
}
else
Bkaydet.requestFocus();
}
});
Tfiyat=new
JTextField(11);
contentPane.add(Tfiyat);
Tfiyat.addActionListener(new
ActionListener(){
public void
actionPerformed(ActionEvent e){
if(Tfiyat.getText().length()==0)
JOptionPane.showMessageDialog(getContentPane(),
"Ltfen Fiyat
Giriniz.","Uyar",
JOptionPane.ERROR_MESSAGE);
else
Tadet.requestFocus();
}
});
Tadi=new
JTextField(11);
contentPane.add(Tadi);
Tadi.addActionListener(new
ActionListener(){
public void
actionPerformed(ActionEvent e){
Ccinsi.requestFocus();
}
});
Lbarkod=new JLabel("Bar
kod");
contentPane.add(Lbarkod);
Ladi=new JLabel("Adi");
contentPane.add(Ladi);
Lcinsi=new
JLabel("Cinsi");
contentPane.add(Lcinsi);
Lfiyat=new
JLabel("Fiyat");
contentPane.add(Lfiyat);
Ladet=new JLabel("Adet");
contentPane.add(Ladet);
cinsler=new String[15];
DBBaglan();
Ccinsi=new JComboBox(cinsler);
contentPane.add(Ccinsi);
Lbarkod.setBounds(30,30,70,25);
Ladi.setBounds(30,60,70,25);
Lcinsi.setBounds(30,90,70,25);
Lfiyat.setBounds(30,120,70,25);
Ladet.setBounds(30,150,70,25);
Tbarkod.setBounds(105,30,110,25);
Tadi.setBounds(105,60,110,25);
Ccinsi.setBounds(105,90,110,25);
Tfiyat.setBounds(105,120,110,25);
Tadet.setBounds(105,150,110,25);
Bkaydet.setBounds(40,195,80,25);
Biptal.setBounds(140,195,80,25);
setSize (260,270);
setLocation (160,70);
Tbarkod.setRequestFocusEnabled(true);
Tbarkod.requestFocus();
}
protected void DBBaglan(){
i=1;
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con1=DriverManager.getConnection("jdbc:odbc:mal","DEN˜Z",
"DEN˜Z");
cinsbul=con1.createStatement();
rs=cinsbul.executeQuery("SELECT cins
FROM cins");
while(rs.next()){
cinsler[j]=rs.getString("Cins");
j++;
}
sorgu=con1.prepareStatement("SELECT adi,adet,fiyati"+
"FROM urun,stok"+
"WHERE urun.Barkod =
?"+
"AND stok.Barkod = ?");
urunInsert=
con1.prepareStatement("INSERT INTO urun"
+"VALUES(?,?,?,?)");
stokInsert=con1.prepareStatement("INSERT INTO stok"
+"VALUES(?,?)");
}catch(ClassNotFoundException
ex){
System.err.println("Veri
tabani srcleri bulunamad.");
System.err.println(ex);
}catch(SQLException ex){
System.err.println("Veri
tabanna baglanlamad");
System.err.println(ex);
}
}
protected void kaydet(){
if(Tfiyat.getText().length()==0||
Tbarkod.getText().length()==0){
JOptionPane.showMessageDialog(getContentPane(),
"Fiyat ve Barkod alani
mutlaka doldurulmalisiniz!",
"Hatal Giris",
JOptionPane.ERROR_MESSAGE);
}
else{
try{
String u1=Tbarkod.getText();
String u2=Tadi.getText();
String
u3=(String)Ccinsi.getSelectedItem();
tmp4=Integer.valueOf(Tfiyat.getText());
int fiyat1=tmp4.intValue();
urunInsert.setString(1,u1);
urunInsert.setString(2,u2);
urunInsert.setString(3,u3);
urunInsert.setInt(4,fiyat1);
if(Tadet.getText().length()==0)
Tadet.setText("0");
stokInsert.setString(1,Tbarkod.getText());
tmp4=Integer.valueOf(Tadet.getText());
int adet1=tmp4.intValue();
stokInsert.setInt(2,adet1);
urunInsert.executeUpdate();
stokInsert.executeUpdate();
}catch(SQLException ex){
System.err.println("šrn
giriŸinde hata var");
System.err.println(ex);
}//try
}//else
}//kaydet
String adi,barkod,tmp1;
int fiyat,adet,i=0,j=0;
int fiyat1,adet1;
String tmp3;
Integer tmp4;
public static void main(String args[])
{
new giris1();
}
}
Özet
JDBC,
ilişkisel veri tabanlarına ara yüz olarak tanımlanabilir. Veri tabanına ulaşma,
uzaktaki veya yerel bir veri tabanına ulaşıp, buradaki verilerin alınması veya
işlenmesi anlamına gelir. Peki bu işlemi
Java programlama dili nasıl gerçekleştirmektedir.
Java Veri
tabanı bağlantısı (JDBC) sınıfları SQL cümlelerini çalıştırarak ilişkisel veri
tabanlarına erişimi ve bu veriler üzerinde işlem yapmayı sağlar. JDBC nesneye
dayalı, veri tabanına erişim için geliştirilen uygulama programları ara yüzü
(Application Programming Interface - API), ve Java geliştiricileri ve veri
tabanları için standart olarak geliştirilmiştir.
JDBC
uygulamalarının bu kadar pratik
olmasının ana nedeni diğer veri tabanı uygulamalarıyla uyumlu olmasıdır. JDBC
ve ODBC ‘nin ortak yanı da, ikisinin de SQL X/Open CLI tabanlı olmasıdır.
JDBC ile veri
tabanı bağlantısını sağlamanın temel noktaları;
·
Gerekli olan sınıfları yükleyin.
·
JDBC sürücüsünü yükleyin.
·
Veri tabanını belirleyin.
·
Nesne ile bağlantıyı sağlayın.
·
SQL cümleciği ile bağlantıyı sağlayın.
·
SQL cümleciğini kullanarak sorguyu çalıştırın.
·
Sonuç seti ile verileri alın.
·
Sonuç setini kapatın.
·
SQL cümleciğini kapatın.
·
Bağlantı nesnesini kapatın