Вы находитесь на странице: 1из 228

YAZILIM VE VERTABANI

C# ve T-SQL
Gelitiriciler iin Java
ve Oracle
Yaln Kaya

Editr C. Banu ncolu

19-0
C# ve T-SQL Gelitiriciler iin Java ve Oracle
Yaln Kaya

Editr: C. Banu ncolu

Kapak Tasarm: Melih Sancar

Grafik Tasarm: Tuna Erkan

Grafik Uygulama: Soner Ik

Genel Yayn Ynetmeni: Mehmet mleki

1. Basm: ubat 2008

Bilge Adam Yaynlar: 21

Eitim Yaynlar Dizisi: 21

ISBN: 978-605-5987-19-0

Copyright 2007, Bilge Adam Bilgisayar ve Eitim Hizmetleri San. ve Tic. A..

Eserin tm yayn haklar Bilge Adam Bilgisayar ve Eitim Hizmetleri San. ve Tic. A..ye aittir. Yaynevinden yazl izin
alnmadan ksmen ya da tamamen alnt yaplamaz, hibir ekilde kopya edilemez, oaltlamaz ve tekrar yaymlanamaz.
Bilge Adamn rencilerine cretsiz armaandr, para ile satlamaz.

Bilge Adam Bilgisayar ve Eitim Hizmetleri San. ve Tic. A..


19 Mays Mahallesi, 19 Mays Caddesi, UBM Plaza, No: 59-61, Kat: 4-7; ili, stanbul
Telefon: (212) 272 76 00 (212) 217 05 55 Faks: (212) 272 76 01
www.bilgeadam.com - info@bilgeadam.com

Tantm nshasdr, para ile satlamaz.


indekiler
Javaya Giri3

Java Nedir? 3

Windows Ortamnda Java Kurulumu3

Java Uygulamalar Nasl alr? 7

Basit Veri Tipleri 9

Ondalkl Tipler11

Mantksal Tip11

Karakter Tipi11

Aritmetik lemler ve Tama11

Javada Operatrler 14

Kaydrma (Shift) lemleri15

lemlerde Parantez Kullanm16

Karar Vermek ve Koullu fadeler16

Dngler23

While Dngs 23

do Dngs 24

for Dngs 24

break ve continue Deyimleri 25

Niteleyiciler (Modifiers)29

Access Modifiers (Eriim Niteleyicileri) 29

Niteleyicilerde Metod Ezme (Access Modifiers Overriding) 30

Dier Niteleyiciler 30

Casting ve Conversion35

Basit Tiplerde Conversion 36

Basit Tiplerde Conversion: Atama36

Basit Tiplerde Conversion: Metod arma38

Basit Tiplerde Conversion: Aritmetik Ykseltme 38

Basit Tiplerde Casting39

Referans Tiplerde Conversion  40

Referans Tiplerde Conversion: Atama 40

Referans Tiplerde Csonversion: Metod arma 41


IV indekiler

Yapsal Programlama45

Yapsal Programlama Nedir? 45

Nesne Ynelimli Programlamanin Temel Bileenleri45

Nesne Ynelimli Programlamann Temel Kavramlar 51

Kapslleme (Encapsulation) 51

Swing67

Swinge Giri 67

JButton68

JLabel69

JTextField70

Event Handling Mekanizmas71

JTextArea74

JOptionPane75

JCheckBox77

JRadioButton79

JComboBox81

JList 83

Mouse Eventlerinin Ynetilmesi:89

Klavye Eventlerinin Ynetilmesi 94

JDBC103

Veritaban Balantsnn Kurulmas 108

Veri Deitirme Komutlar (insert, update, delete) 109

Veri Sorgulama Komutlar (Select) 110

Parametreli SQL fadelerinin altrlmas112

Stored Procedurelerin altrlmas113

JSP123

JSP Teknolojisinde Kullanlan Etiketler 128

JSP Direktifleri128

JSP Script Etiketleri129

Form Verilerinin Kullanlmas 129

Durum Ynetimi  131

JAVA I/O 143

Dosyalar ve Dizinler  143


indekiler 

FilterInputStream Snflar145

FileInputStream ve FileOutputStream Snflarnn Kullanm146

Reader ve Writer Snflar: 150

Standart Giri-k Biriminin Kullanlmas:154

Java ile A Programlama:  155

Oracle Veritaban Ailesi161

Oracle zerinde Uygulama Gelitirme 161

Oracle Veri Taban Sisteminin Kurulmas161

Tablespace167

Undo Tablespace167

Oracleda Veri Taban Oluturmak168

Temel Veri Tipleri179

Oracleda Kullanc Ynetimi ve Gvenlik179

Oracle zerinde Programlama185

PL/SQL Nedir? 185

SQL Plus185

TOAD187

PL/SQL ile Programlama189

PL/SQLde Kontrol Yaplar191

PL/SQLde Alfanmerik Tipler201

PL/SQLde Mantksal Tipler207

PL/SQLde Tarih ve Zaman Tipleri207

Referans Tipleri213

LOB (Large Object) Tipleri216

PL/SQLde Dng Yaplar216


1 Javaya
Giri
1 Javaya Giri
Java Nedir?

Java Uygulamalar Nasl alr?

Basit Veri Tipleri

Javada Operatrler
Javaya Giri
Blm Hedefleri:

Java platformu zerinde Java diliyle basit uygulamalar yazmak.


Temel veri tiplerini tanmak.

Java Nedir?
Java, ilemci mimarisinden ve iletim sisteminden bamsz olarak tasarlanm bir platformdur.
Ayn zamanda da bu platform zerinde uygulama gelitirilen dilin addr. Microsoft .NET plat-
formuyla karlatrdmzda .NET platformuna karlk gelen yapnn ad Java olduu gibi C#
.NET, Visual Basic .NET gibi .NET dillerine karlk gelen dilin ad da Javadr. Bu aklamadan
anlalaca gibi Microsoft .NET platformundan farkl olarak Java platformunda uygulama geli-
tirilebilecek tek dil vardr. Java platformu pek ok ynden Microsoft .NET platformuna benzedii
gibi Java dili de yetenekleri balamnda C# diline ok benzer.

Java platformu da Microsoft .NET platformu ve modern nesne ynelimli diller gibi geni bir snf
ktphanesine sahiptir. Yine .NET platformuna benzer olarak bir Java uygulamasnn almas
iin dorudan iletim sistemi kullanlmaz. Bu sebeple bir Java uygulamas, iletim sistemine ve
mimari platforma gre gelitirilmi olan JVM (Java Virtual Machine) araclyla altrlr.

Java ile uygulama gelitirme iin kullanlan ortamlar (IDE Integrated Development Environment),
.NET iin kullanlan ortamlara gre ok daha fazla saydadr ve kolaylk olarak farkllk gsterir.
Yaygn olarak kullanlan btnleik gelitirme ortamlarndan (IDE) biri Eclipsetir. Eclipsei http://
www.eclipse.org adresinden indirebilirsiniz. Kitaptaki rnekleri gerekletirmek iin herhangi bir
btnleik gelitirme ortam indirmenize gerek yoktur, btn rnekleri Windows zerinde Notepad
ya da herhangi bir metin editr ile gerekletirebilirsiniz.

Windows Ortamnda Java Kurulumu


Java platformunu Windows iletimi zerinde kurmak ve uygulamalar yazabilir hale gelmek iin
ncelikle Java Development Kiti (JDK) bilgisayarnzda kurmalsnz. JDKnn srmlerini http://
www.javasoft.com adresinden indirebilirsiniz. ndirdiiniz dosyay Windowsun tm srmlerinde
kurabilirsiniz.

Kurulumu gerekletirdikten sonra Windows ortamnda evre deikenleri (environment variab-


les) zerinde ilem yapmamz gerekir. Komut satrnda herhangi bir noktadan derleme ve al-
trma programlarn kullanabilmek iin Path deikenine Javay kurduumuz dizinin iindeki bin
dizinini eklemelisiniz.
 Blm 1

Uygulama 1.1:

Windows XP:

1 ekil 1de gsterilen, Bilgisayarm (My Computer) ikonunu sa tklayn. Alan mende zel-
likler (Properties) esini sein.

ekil 1

2. ekil 2de gsterildii gibi, alan pencerede Gelimi (Advanced) sekmesini tklayn.
3 ekil 2de gsterildii gibi, gelen pencerede evre Deikenleri (Environment Variables) bu-
tonuna tklayn.

ekil 2

4. ekil 3te gsterilen, Sistem Deikenleri (System Variables) iinde Pathi bulun ve en sonuna
; ekleyin.
Javaya Giri 

ekil 3

5. ekil 4te olduu gibi, sonuna da <Javayi kurduunuz yer>\<JDKxxx>\bin yazn.

ekil 4

Windows Vista:

1 eki 5daki gibi, Bilgisayarm (My Computer) ikonunu sa tklayn. Alan mende zellikler
(Properties) esini sein.

ekil 5
 Blm 1

2. ekil 6de gsterilen, Tasks blmnden Advanced System Settings linkine tklayn.

ekil 6

3 ekil 8de gsterildii gibi, gelen pencerede evre Deikenleri (Environment Variables) bu-
tonuna tklayn.

ekil 7
Javaya Giri 

4. ekil 8da gsterildii gibi, Sistem Deikenleri (System Variables) iinde Pathi bulun ve en
sonuna ; ekleyin.

ekil 8

5. ekil 9daki gibi, sonuna da <Javayi kurduunuz yer>\<JDKxxx>\bin yazn.

ekil 9

Java Uygulamalar Nasl alr?


Bir Java uygulamasnn makinenizde almas iin JVMin kurulu olmas gerekir. JVM Microsoft
.NET platformunun IL (Intermediate Language - MSIL) zerinden almas mantna benzer
bir mantkla alr. Java tarafnda ILe karlk gelen yap bytecodedur. JVM sadece bytecode
zerinden alr. Bu sebeple yazm olduunuz Java kaynak kodunu ncelikle Java derleyicisiy-
le derleyerek bytecodea evirmelisiniz. Bununla birlikte dikkat edilmesi gereken bir nokta da bir
Java snfnn derlenebilmesi iin kaynak kodu tutan .java uzantl dosyann adnn, iindeki public
snfn adyla ayn olmas gerektiidir.

rnek Uygulama 1.1:

1 public class IlkJavaUygulamasi


2 {
3 public static void main( String[] args)
4 {
5 System.out.println(Ilk Java Uygulamasi);
6 }
7 }
 Blm 1

lem admlar:

rnekleri kolaylk asndan Windowsta oluturacanz bir dizin iinde toparlamanz faydal ola-
caktr.

1 Yukardaki kodu herhangi bir metin editrnde yazn ve IlkJavaUygulamasi.java adyla kay-
dedin.
2. Command Promptu an.
3 Dosyay kaydettiiniz dizine girin.
4. javac IlkJavaUygulamasi.java ifadesini altrn.
5. Eer hata almazsanz IlkJavaUygulamasi.class dosyasnn kaynak kodla ayn yerde olutu-
unu grmelisiniz.
6. Java IlkJavaUygulamasi ifadesini altrdnzda komut satrnda Ilk Java Uygulamasi ifa-
desini grmelisiniz.
Uygulamann aklamas: 1 numaral satrda C#ta olduu gibi IlkJavaUygulamasi adnda bir
snf tanmlanr. Java dilinde de, C#ta olduu gibi kod bloklar snflarn iinde yer almaldr. 2
numaral ve 4 numaral satrlarda { (kme parantezi, curly brace) iareti aynen C#ta olduu gibi
blok ba iaretidir. 2 numaral satrdaki { snf iin tanmlanan bloun balangcyken 4 numaral
satrdaki { iareti de main metodunun balangcdr.
6 numaral ve 7 numaral satrlardaki } iareti blok sonu iaretidir. 6 numaral satrdaki } iareti
main blounun sonuyken, 7 numaral satrdaki } iareti snf iin alan bloun sonudur.
Blok ba ve blok sonu ifadelerinde dikkat etmeniz gereken en nemli nokta son alan blok her
zaman ilk kapatlan bloktur ve her alan blok mutlaka kapatlmaldr.
3 numaral satrda aynen C#ta olduu gibi main metodunun tanmn grebilirsiniz. public
static void ifadelerinin anlamlar C# ile ayn olmakla birlikte daha sonra detayl olarak ince-
lenecektir. Main metodunun parametresi olan String[] args de metodun parametre olarak
bir String dizisi aldn belirtir. Main metodu, Javada da konsol uygulamalarnn otomatik olarak
alan ilk metodudur.
5 numaral satrda main metodu altnda ne yapacan gsterir. System.out.println();
ifadesi C#taki Console.WriteLine() ifadesine karlk gelir. Burada System.out standart
kt birimini temsil eder. Varsaylan olarak kullandnz ekrandr. println() metodu, kendisine
parametre olarak verilen ifadeye yazar ve sonundaki ln (line) ksmndan dolay bir satr aaya
geer. fadenin sonundaki ; iareti Javada da C#taki her ifadenin sonunda mutlaka bulunmas
gereken satr sonlandrcsdr.
Bu basit uygulamaya bakarak C# dili ile Java dilinin birbirine pek ok noktada benzediini g-
rebilirsiniz. Bundan sonraki pek ok aamada C# dili ile Java dili arasndaki benzerliklere tank
olacaksnz.
lk uygulamada konsola System.out.println() yazdrdmz ifadeyi bir mesaj kutusunda
yazdrmak istersek bir miktar deiiklik yapmamz gerekecektir.
rnek Uygulama 1.2a:

1 public class MesajKutusu


2 {
3 public static void main( String[] args)
4 {
5 javax.swing.JOptionPane.showMessageDialog(null, Ilk Java
Uygulamasi);
6 }
7 }
Javaya Giri 

Uygulamann aklamas: Bu uygulamann 5 numaral satr dndakiler nceki uygulamadan


farkl deildir. 5 numaral satrda da C#taki MessageBox.Show() metodunun Javadaki benzeri
olan JoptionPane.showMessageDialog() metodu kullanlmtr. Bu kodun bandaki ja-
vax.swing de JOptionPane snfnn iinde bulunduu pakettir. Javadaki paketleri .NETteki
assemblyler gibi dnebilirsiniz. Dolaysyla C#taki using ifadesinin karl olarak import
ifadesini kullanarak kodumuzu aadaki ekilde gncelleyebiliriz.

rnek Uygulama 1.2b:

1 import javax.swing.JOptionPane;
2 public class MesajKutusu
3 {
4 public static void main( String[] args)
5 {
6 JOptionPane.showMessageDialog(null, Ilk Java
Uygulamasi);
7 }
8 }

Bu rnekte 1 numaral satrdaki import ifadesi javax.swing paketindeki JOptionPane snf-


nn yklenmesini salar. Bir kere yklendikten sonra tekrar paket adnn kod iinde kullanmamza
gerek kalmaz. Burada yaplan ykleme ilemi, .NETteki gibi, yklenen paketin ierdii kodu,
oluturulan .class dosyasnn iine eklemez, sadece o pakete eriimi salayacak kodu oluturur.

Uygulama 1.2bdeki 6 numaral satrda JOptionPane snfnn Javada commentlerin kullan-


showMessageDialog metodunun ilk parametresi swing paketi- m C# ile ayndr. // Satr com-
ment. /* */ Blok comment.
nin detaylarna gelene kadar srekli null olarak kullanlacaktr. 2.
parametre de tahmin edebileceiniz gibi mesaj kutusunda yazdr-
lacak ifadedir.

Basit Veri Tipleri


Javadaki basit (primitive) veri tipleri .NETteki basit veri tipleriyle ok benzerdir. Herhangi bir veri
tipinin tanmlanmas C#takinden farkl deildir. Bununla birlikte Javadaki saysal tiplerin hepsi
iaretlidir (signed hem negatif hem de pozitif saylar tutar), iaretsiz veri tipi yoktur. ncelikle
tam saysal veri tiplerinden balayalm:

byte: Adndan da anlalabilecei gibi 1 bytelk, tam say tutan veri tipidir. C#ta sbytea, .NET
CTSte System.SBytea karlk gelir. Herhangi bir byte deiken tanmlamas aadaki e-
killerde yaplabilir:

byte yas; //ilk deer verilmeden.


byte yas = 67; //ilk deer verilerek.

short: 2 bytelk, tam say tutan veri tipidir. C#ta shorta, .NET CTSte System.Int16ya
karlk gelir. Herhangi bir short deiken tanmlamas aadaki ekillerde yaplabilir:

short derinlik; //ilk deer verilmeden.


short derinlik = 23245; //ilk deer verilerek.

int: 4 bytelk, tam say tutan veri tipidir. C#ta inte, .NET CTSte System.Int32ye karlk
gelir. Herhangi bir int deiken tanmlamas aadaki ekillerde yaplabilir:
10 Blm 1

int sayi; //ilk deer verilmeden.


int sayi = 12; //ilk deer verilerek.

long: 8 bytelk, tam say tutan veri tipidir. C#ta longa, .NET CTSte System.Int64e karlk
gelir. Herhangi bir long deiken tanmlamas aadaki ekillerde yaplabilir:

long GNP; //ilk deer verilmeden


long GNP = 1234567890; //ilk deer verilerek

Bunlarn dnda basit veri tipi olmamakla birlikte u aamada bilmeniz gereken bir veri tipi daha
var: String. String tipi referans zerinden alan bir veri tipidir. Yani, aslnda basit veri tip-
lerinden farkl olarak bir nesne zerinden alrlar; fakat tanmlamas u ana kadar bahsedilen
veri tiplerinden farkl deildir. Stringin detaylarna ilerleyen blmlerde deineceiz. Burada
dikkat etmemiz gereken nokta Javada kk harf s ile balayan string tanmnn olmamasdr.
Herhangi bir String veri tanmlamas aadaki ekillerde yaplabilir:

String Ad; //ilk deer verilmeden


String Ad = Yalcin; //ilk deer verilerek

Artk kullancdan 2 say alp bunlar matematiksel herhangi bir ilem iinde kullanabilecek hemen
her eye sahibiz. Tek eksiimiz bu saylar kullancdan nasl alacamz. Matematiksel ilemlerin
nasl yapldna gelirsek, ileride farkllklarna deineceemizi belirterek C#taki yazllarndan
u an iin hibir fark yoktur diyebiliriz. imdi bunu rnekleyelim:

rnek Uygulama 1.3:

1 import javax.swing.JOptionPane;
2 public class MesajKutusu
3 {
4 public static void main( String[] args)
5 {
6 String birinciSayi, ikinciSayi;
7 int toplam, sayi1, sayi2;
8 birinciSayi = JOptionPane.showInputDialog(Birinci
sayiyi giriniz:);
9 ikinciSayi = JOptionPane.showInputDialog(Ikinci
sayiyi giriniz:);
10 sayi1 = Integer.parseInt(birinciSayi);
11 sayi2 = Integer.parseInt(ikinciSayi);
12 toplam = sayi1 + sayi2;
13 JOptionPane.showMessageDialog(null, toplam);
14 }
15}

Kod Aklamas: 6 numaral satrda String tipinde 2 deiken tanmlanmtr. Unutmayn ki bu


2 deiken de basit veri tipi deil referans tipli deikenlerdir. Bu deikenler JOptionPane sn-
fnn showInputDialog metodunun dndrd deerleri tutmak iin kullanlmtr. 7 numaral
satrda 3 tane tam say tanmlanmtr. toplam adl deiken JOptionPane.showInputDia-
log() metoduyla aldmz deerlerin sayya dntrlm hallerini toplamak iin kullanlm-
tr. sayi1 ve sayi2 deikenleri de JOptionPane.showInputDialog() metoduyla aldmz
Javaya Giri 11

deerlerin sayya dntrlm hallerini tutacaktr. 8 ve 9 numaral satrlarda JOptionPane.


showInputDialog() metodlaryla, yukarda tanmladmz Stringlerin iine, kullancnn gi-
recei deerler alnmaktadr. Burada dikkat etmemiz gereken nokta, rakamlar dnda deerler
girdiimizde 10 ve 11 numaral satrlarda dntrme hatasyla karlama durumumuzdur. Bu
satrlarda kullanc tarafndan girilmi olan Stringler Integer snfnn parseInt() aracl-
yla inte evrilmeye allr. Integer snf .NETteli System.Int32 snfna karlk gelen
snftr ve terimsel olarak wrapper class olarak geer. parseInt() metodu da Int32 snfnn
Parse() metoduyla ayn ekilde alr. Eer kendisine gnderilen parametre inte evrilemi-
yorsa NumberFormatException oluturur. Bunun iin de C#taki gibi istisna ynetimi (excep-
tion handling), yani try-catch-finally bloklarn kullanabiliriz.

10 ve 11 numaral satrlarda eer herhangi bir exception olumazsa, yani bir intin alabilecei
deer almazsa 12 numaral satr alr. Eer 2 deerin toplam bir intin alabilecei en byk
deeri ayorsa toplam deikeninin alaca deer negatif bir sayya dnecektir. nk Java, C
geleneinden dolay saylar kontrol etmez. Bu durumu daha kk bir tam say tipi olan byte
zerinden Uygulama 1.4te aklayacam.

13 numaral satrda bir nceki rnekte kullandmz JOptionPane.showMessageDialog()


metoduyla toplam deikeninin deerini yazdryoruz. Snf adyla kullanlmas sebebiyle show-
MessageDialog() metodunun JOptionPane snfnn static bir metodu olduunu anlaya-
bilirsiniz.

Ondalkl Tipler
double: 8 bytelk ondalkl veri tipidir. Tanmland standart (IEEE 754) erevesinde yk-
sek doruluk isteyen ilemlerde kullanlmamaldr; ancak ondalkl ksmda yksek younluk ok
nemli deilse kullanlabilir. C#ta floata, .NET CTSte System.Singlea karlk gelir.

float: 4 bytelk ondalkl veri tipidir. Hem tanmland standart erevesinde hem de double
veri tipine gre daha kk bir veri tipi olmas sebebiyle yksek doruluk isteyen ilemlerde kulla-
nlmamaldr; ancak ondalkl ksmda yksek younluk ok nemli deilse kullanlabilir. Eer bel-
lek yetersizlii ile ilgili bir problem yoksa float yerine double tercih edilmelidir. C#ta doublea,
.NET CTSte System.Doublea karlk gelir.

Her 2 ondalkl veri tipinin yerine java.math paketinde bulunan BigDecimal snf kullanlabi-
lir.

Mantksal Tip
boolean: true ya da false deerlerinde birini tayabilen basit veri tipidir. Tad veri sade-
ce 1 bit ile gsterilebiliyor olsa da kaplad alan 1 bit deildir. C#ta boola, .NET CTSte Sys-
tem.Booleana karlk gelir.

Karakter Tipi
char: 2 bytelk Unicode karakter olarak herhangi bir karakter bilgisini tutmak iin kullanlr. C
ailesi geleneinden dolay iaretsiz tam saysal veri tipi olarak deerlendirilebilir. C#ta chara,
.NET CTSte System.Chara karlk gelir.

Aritmetik lemler ve Tama


Javada tam saysal aritmetik ilemler, ileme giren deerlerin tipleri eer birer int deilse inte
dntrlerek yaplr. Eer ileme giren tiplerden en az biri long ise longa dntrlerek
yaplr.

Eer tipler ondalkl ise ilemler, ileme giren tipler doublea dntrlerek yaplr. Dolaysyla
aadaki rnekleri dikkatle incelemek gereklidir:
12 Blm 1

rnek Uygulama 1.4a:

1 public class TipDonusumleri1


2 {
3 public static void main( String[] args)
4 {
5 byte sayi1 = 120;
6 byte sayi2 = 110;
7 byte toplam = sayi1 + sayi2;
8 }
9 }

Bu rnekte 7 numaral satrda sayi1 + sayi2 ifadesi, ilem int zerinden yapldndan al-
acaktr; ancak toplam deikeninin tipi byte olduu iin derlenemeyecektir ve possible loss of
precision (deer kayb ihtimali) hatas verecektir. Bunun sebebi toplanan byte tipindeki dei-
kenlerin deerlerinin toplamnn, byte tipindeki bir alana smamas deildir. (120 + 110 = 230,
byte tipinin alabilecei en byk deer ise 127dir). Bunu sayi1in deerini 12, sayi2nin deerini
11 yaparak grebilirsiniz. Possible loss of precision hatasn bu durumda da alacaksnz. (12 +
11 = 23, byte tipinin iine sar). Dolaysyla bu hatann sebebi, sayi1 + sayi2 ileminin int ze-
rinden yaplmasdr. Bunu anlamak iin 7 numaral satrda tanmlanan toplam deikeninin tipini
bytetan shorta evirip tekrar derleyerek de grebilirsiniz. Bu durumda 120 ile 110un toplam
olan 230 deeri short tipine sacak bir deer olmasna ramen possible loss of precision ha-
tasn yine alrsnz; ancak toplam deikeninin deerini int ya da long yaparak bu hatadan
kurtulabilirsiniz.

Uygulama 1.4a rnei zerinde dndmzde yaplan ilem anormal gelmemelidir. nk


burada 2 tane byte tipli deikenin toplamnn deerinin byte tipine smamas ihtimali yk-
sektir. Bu durumda, eer bu ilemi byte tipi zerinden gerekletirmek istersek ne yapmalyz?
Bunun cevabn da Uygulama 1.4bde grebilirsiniz.

rnek Uygulama 1.4b:

1 public class TipDonusumleri2


2 {
3 public static void main( String[] args)
4 {
5 byte sayi1 = 12;
6 byte sayi2 = 11;
7 byte toplam = (byte)(sayi1 + sayi2);
8 System.out.println(toplam);
9 }
10}

rnek Uygulama 1.4bde 7 numaral satrda yaptmz ilem bir explicit cast (gstererek dn-
trme) ilemidir. Uygulama 1.4ada inte dntrme ise implicit cast (gizli dntrme) ilemi
olarak adlandrlr. Daha sonra bu ilemleri farkl isimlerle tekrar deerlendireceiz. Burada sayi1
+ sayi2 ilemi nce yine int zerinden yaplr ve sonra bytea dntrme yaplr. Bu ekilde
12 ile 11in toplam olan 23 deerini byte olarak elde edebilirsiniz. Buraya kadar herey g-
zel; ancak bu noktada Uygulama 1.3deki tama problemimize geri dnelim ve 5 ve 6 numaral
satrlarda tanmladmz byte tipli deikenlerimizin deerlerini srasyla 120 ve 110 yapalm.
Yeni deerlerin her ikisi de byte tipine sabilirler; fakat toplamlar olan 230 deeri byte tipine
Javaya Giri 13

smaz. Java uygulamas bu durumda hata vermeyecektir ve 8 numaral satrdaki System.out.


println()den dolay konsola -26 yazacaktr. Bunu detayyla u ekilde aklayabiliriz:

Bildiiniz gibi gncel bilgisayar sistemleri 2lik (binary) sistemle alrlar, yani herey 1 ve 0 ile
ifade edilir. Dolaysyla sayi1 ve sayi2 deikenlerimizin 2lik sistemdeki karlklar u ekildedir:

sayi1 = 120 = (01111000)2


sayi2 = 110 = (01101110)2

Saylarn 2lik sistemdeki karlklarnn bandaki 0, byte tipinin 1 bytelk yani 8 bitlik olma-
sndan dolay sayy 8 bite tamamlamak iindir; ancak en baa eklediimiz bu 0n tad ok
daha farkl bir anlam vardr, Bu ilk deer saynn pozitif ya da negatif olmasn belirler. Eer 0 ise
arkasndan gelen tm bitler pozitif sayya gre yorumlanacaktr, eer 1 ise negatif sayya gre
yorumlanacaktr. imdi de saylar toplayalm:

sayi1 + sayi2 = 120 + 110 = 230


sayi1 + sayi2 = (01111000)2 + (01101110)2 = (11100110)2
toplam = (11100110)2

Az nce bahsettiimiz iaret biti durumundan dolay 2lik saynn en bandaki deer olan 1, ge-
risindeki 7 bitin negatif sayya gre yorumlanacan gsterir. Dolaysyla Javada tamsaylarn
tmnde say deeri en soldaki bitin pozitif ya da negatif olmas durumu netletikten sonra ortaya
kar. rnek olarak u saylar ele alalm:

5 = (00000101)2

En bataki 0 saynn pozitif olduu anlamna gelir. Devamndaki 0000101de de ilk 1e kadar olan
0larn bir anlam yoktur. Bylece elimizde (101)2 kalr. Bunun da karl 10luk sistemde 5tir.
Alm ise u ekildedir.

1 x 20 = 1
0 x 21 = 0
1 x 22 = 4
1 + 0 + 4 = 5

Bu noktadan sonra eer saymz negatif ise durumun deitiini greceiz. rnek olarak -1i ele
alacaz.

Eer 1 = (00000001)2 ise; -1 = (11111110)2 + (00000001)2dir. Yani (11111111)2dir. Bu ynteme


2nin tamlayan yntemi denir. (11111110)2 de (00000001)2nin bire tamlayandr. Burada niin bu
kadar dolandrlm diye dnebilirsiniz; ancak unutmayn ki gndelik hayatta kullandmz gibi
bir - iaretine sahip deiliz. Bu durumu -1 ile 1i toplayarak deneyelim:

(00000001)2 + (11111111)2 = (100000000)2

Elimizde 9 bitlik bir veri olutu; ancak byte veri tipi 8 bitlik bir veri tipiydi. Bu durumda en bataki
1 deeri hibir deerlendirmeye katlmadan son 8 bit deerlendirilir; yani (00000000)2 deeri kul-
lanlr. Burada ilk bit 0 olduu iin say pozitiftir diyebiliriz. Geri kalan 7 bit de 0 olduu iin say
10luk sistemdeki 0a karlk gelir. Bu durumda aklnza taklabilecek olan soru 0n pozitiflii ya
da negatiflii olabilir. 0 says matematikte ne pozitif tam saylar kmesinin ne de negatif tamsay-
lar kmesinin bir yesidir; ancak programlama dillerinde 0 deeri pozitiftir.
14 Blm 1

Sonu olarak bilgisayar iin negatif bir saynn 2lik sistemde nasl yazldn bulmak istiyorsak u
ekilde bir ilem gerekletirmeliyiz:

Sayy 2lik sistemde pozitif olarak yazn.

Oluan saydaki 0lar 1, 1leri 0 yapn.

Sayya 2lik sistemde 1 ekleyin.

rnek olarak -5e ulamaya alalm:

5 = (00000101)2
1 e tamlayan = (11111010)2
2ye tamlayan = (11111011)2

Bylece Uygulama 1.4bnin aklamasnda elde ettiimiz (11100110)2 deerini irdeleyebilir duru-
ma geldik. Yukardaki ilemi tersten yaptnzda da sayya ulaabilirsiniz.

(11100110)2 (00000001)2 = (11100101)2


1e tamlayan = (00011010)2
(00011010)2 = 26

Dolaysyla elimizdeki say 10luk sistemdeki -26ya karlk gelir. Bu detaylar bilmemeniz halinde
basit bir saysal problem zerinde ok zaman harcayabilirsiniz. nk grdnz ekilde Java
aritmetik ilemlerde taan saylar iin hata vermez.

Javada Operatrler
Javada tipler zerinde ilem yapmak iin pek ok operatr bulunur. Bu operatrlerin ou C#ta
da ayn ekilde mevcuttur.

ncelik Sras
ne gelen (prefix) ++ifade, --ifade
Sona gelen (postfix) ifade++, ifade--
Tek ifade alan +ifade, -ifade, ~, !
arpmsal *, /, %
Toplamsal +, -
Kaydrma <<, >>, >>>
likisel <, >, <=, >=, instanceof
Eitlik ==, !=
Bit zerinde (bitwise) VE (AND) &
Bit zerinde zel VEYA (EX-OR) ^
Bit zerinde VEYA (OR) |
Mantksal VE (AND) &&
Mantksal VEYA (OR) ||
l ifade alan (ternary) operatr ?:
Atama =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=
Javaya Giri 15

Grdnz gibi Javadaki birka operatr dnda hemen hemen tm operatrler C# ile ayndr.
Bit zerinde ilem yapan operatrler kestirmeli (shortcut) operatrlerdir. Yani operandlarndan
(ileme giren deerlerinden) biri ilemin sonucunu kesin olarak ortaya koyuyorsa ilemin deva-
mndaki operand deerlendirilmez.

rnek Uygulama 1.5a:

1 public class Operatorler1


2 {
3 public static void main( String[] args)
4 {
5 int sayi, sonuc;
6 sayi = 5;
7 sonuc = sayi++ + ++sayi;
8 System.out.println(sonuc);
9 System.out.println(sayi);
10 }
11}

Bu uygulamada 8 ve 9 numaral satrlar ilendiinde ekranda yazacak deerlerin ne olduunu ve


7 numaral satrn nasl ilediine bakalm. 6 numaral satrda sayi deikeninin deeri 5 yapl-
dktan sonra 7 numaral satrda sonuc = sayi++ + ++sayi; ifadesi iletilmektedir. Bu satr
daha detayl inceleyelim:

sonuc = sayi++ + ++sayi; ifadesinde nce ++sayi ifadesi alacaktr ve sayi deike-
nine 1 ekleyerek deerini 6 yapacaktr. Daha sonra sayi++ ilemeden sayi deeri ile artrlm
sayi deerleri toplanarak sonuc deikenine atama yaplacaktr. Bylece 6 + 6 = 12 deeri so-
nuc deikeninin deeri olur. Bu atama yapldktan sonra sayi deikenine sayi++dan dolay
tekrar 1 eklenecektir ve sayi deikeninin deeri 7 olacaktr.

Kaydrma (Shift) lemleri


Kaydrma ilemleri genellikle sistem programlama, oyun programlama gibi uzmanlk gerektiren
alanlarda kullanlr. Deerimizi temsil eden 2lik say sistemindeki deeri saa ya da sola belirti-
len bit says kadar kaydrr ve kaydrlan alanlara 0 deerini koyar. aret bitiyle ilgili detaylar da
vardr. Bu sebeple bir rnekle gsterip detayl olarak anlatmayacam.

rnek Uygulama 1.5b:

1 public class Operatorler2


2 {
3 public static void main( String[] args)
4 {
5 int sayi;
6 sayi = 5;
7 sayi <<= 2;
8 System.out.println(sayi);
9 }
10}

Bu rnekte 7 numaral satrda sayi deikeninin bitleri 2 kademe sola kaydrlmaktadr. Bu ilem
nasl yaplyor inceleyelim:
16 Blm 1

int 32 bit (4 byte) olduu iin 2lik say sisteminde aadaki gibi gsterilir.

sayi = 5 = 00000000 00000000 00000000 00000101

Bu deer sola 1 bir kaydrldnda;

sayi = 0 00000000 00000000 00000000 00001010 = 10

deeri elde edilir. En bataki 0 den bittir, ve en sondaki 101 deerleri sola kaydrlarak en sona
da 1 tane 0 eklenmitir.

sayi <<= 2 ifadesi sola doru 2 bitlik kaydrma ilemi olduu iin sayi 1 bit daha sola kaydrl-
maldr.

sayi = 00 00000000 00000000 00000000 00010100 = 20

Bylece sayi deikeninin deeri 20 olur. Dikkat ederseniz sola kaydrma 2 ile arpma gibidir.

lemlerde Parantez Kullanm


Matematiksel ya da mantksal ilemlerde parantezlerin iine alnan ifadelerin ncelii ilk sraya -
kar. Matematik bilgimizden tek fark kullandmz tek iaretin sadece normal parantez olmasdr,
keli parantez ya da kme parantezi kullanlmaz.

rnek: Bu ifadeyi matematiksel olarak yazmak istediimizde eer;

d = m * P / n * r * T;

eklinde yazarsak arpma ve blmenin nceliklerinin ayn olmas sebebiyle ilem soldan saa
srayla gerekleecektir. Byle olunca m ile P arpldktan sonra n ile blnecek, bunun sonucu
da r ile Tnin arpmyla arplacaktr. Oysa ifadenin gsterdii m ile Pnin arpmnn n, r ve Tnin
arpmna blnmesi eklindedir. Bu sebeple bu matematiksel ifadeyi;

d = m * P / (n * r * T);

eklinde yazmalyz.

Karar Vermek ve Koullu fadeler


Javada da C#taki gibi karar verme ve koullu ifade yazmak iin 2 ifade ve 1 operatr sz konu-
sudur. Bunlar:

1 if...else
2. l ifade alan operatr (? :)
3 switch...case

if...else Yaps
if... else yaps Javada da aynen C#taki gibi kullanlr. En basit yaps sadece ifin kullanld
eklidir. Koullu ifadelerde dikkat edilmesi gereken nokta koulun sonucunun true ya da false,
yani boolean bir ifade retmesi gerekliliidir. Bu ynyle C geleneiyle farkllar.
Javaya Giri 17

rnek Uygulama 1.6a:

1 import javax.swing.JOptionPane;
2 public class Kosul1
3 {
4 public static void main( String[] args)
5 {
6 int sayi1 = Integer.parseInt(JOptionPane.
showInputDialog(Birinci sayy giriniz));
7 int sayi2 = Integer.parseInt(JOptionPane.
showInputDialog(Ikinci sayy giriniz));
8 if( sayi1 < sayi2)
9 {
10 JOptionPane.showMessageDialog(null, sayi1 +
kucuktur + sayi2);
11 }
12 }
13}
8 numaral satrda yaplan karlatrmann sonucu, yani sayi1 deikeninin deerinin sayi2 dei-
keninin deerinden kk olma durumu true ya da false, daha genel bir ifadeyle boolean bir so-
nu retir. Eer karlatrmann sonucu true ise if blounun ii altrlr, if blou sonlandnda
da ak kald yerden devam eder; aksi takdirde if blounun ii altrlmadan programn ak if
blou yokmu gibi almaya devam eder. Koullar gibi bir sonraki blmde inceleyeceimiz dng ve
tekrarl yaplarda da kodun okunurluunu artrmak iin if blounun ii tek ifadeden olusa bile blok
parantezlerini, tek ifade iin art olmamasna ramen kullanmay alkanlk haline getirin.
rnek Uygulama 1.6b:

1 import javax.swing.JOptionPane;
2 public class Kosul2
3 {
4 public static void main( String[] args)
5 {
6 int sayi1 = Integer.parseInt(JOptionPane.
showInputDialog(Birinci sayy giriniz));
7 int sayi2 = Integer.parseInt(JOptionPane.
showInputDialog(Ikinci sayy giriniz));
8 if( sayi1 < sayi2)
9 {
10 JOptionPane.showMessageDialog(null, sayi1 +
kucuktur + sayi2);
11 }
12 else if( sayi1 > sayi2)
13 {
14 JOptionPane.showMessageDialog(null, sayi1 +
buyuktur + sayi2);
15 }
16 }
17}
18 Blm 1

Bu rnekteki alma ekli Uygulama 1.6adakiyle aslnda ayn ekildedir. Eer 8 numaral satr-
daki karlatrma true sonu vermezse ak 12 numaral satrdan devam edecektir. Bu blok da
else bloudur. else blou aslnda if bloundan sonraki akn ilk parasdr. else blounda
bir karlatrma daha yaplmaktadr. Bu karlatrmada da aynen 8 numaral satrdaki if blou
gibi bir alma mekanizmas sz konusudur. Eer karlatrma sonucu true ise else blou a-
lr; aksi takdirde else bloundan sonraki noktadan; yani 16 numaral satrdan itibaren alma
devam eder. Bu uygulamada, rnek Uygulama1.6aya gre farkllaan tek nokta eer 8 numaral
satrdaki karlatrma true sonu retirse 12 numaral satrdaki else blou, her ne kadar ken-
dinden sonra gelen ilk ifade olsa da almaz.

rnek Uygulama 1.6c:

1 import javax.swing.JOptionPane;
2 public class Kosul3
3 {
4 public static void main( String[] args)
5 {
6 int sayi1 = Integer.parseInt(JOptionPane.
showInputDialog(Birinci sayy giriniz));
7 int sayi2 = Integer.parseInt(JOptionPane.
showInputDialog(Ikinci sayy giriniz));
8 if( sayi1 < sayi2)
9 {
10 JOptionPane.showMessageDialog(null, sayi1 +
kucuktur + sayi2);
11 }
12 else if( sayi1 > sayi2)
13 {
14 JOptionPane.showMessageDialog(null, sayi1 +
buyuktur + sayi2);
15 }
16 else
17 {
18 JOptionPane.showMessageDialog(null, sayi1 +
esittir + sayi2);
19 }
20 }
21}

Bu uygulamada deien tek nokta 16 numaral satrdaki koulu olmayan else bloudur. Bylece
sayi1 deikenin deeri ile sayi2 deikeninin deeri arasnda yaplan karlatrmada durum
ne olursa olsun, bir exception retilmedii srece, bu 3 bloktan birinin almas kesindir. 16 nu-
maral satrdaki else blounun almas iin 8 ve 12 numaral satrlardaki karlatrmalardan
false retilmesi gerekir. Bu rnekte bu durum 2 sayy karlatrrken, iki saynn birbirine eit
olmas durumudur. Bu bloklardan hangisi alrsa alsn, ak 20 numaral satrdan devam
edecektir.
Javaya Giri 19

rnek Uygulama 1.6d:

1 import javax.swing.JOptionPane;
2 public class Kosul4
3 {
4 public static void main( String[] args)
5 {
6 int sayi1 = Integer.parseInt(JOptionPane.
showInputDialog(Birinci sayy giriniz));
7 int sayi2 = Integer.parseInt(JOptionPane.
showInputDialog(Ikinci sayy giriniz));
8 if( sayi1 < sayi2)
9 {
10 JOptionPane.showMessageDialog(null, sayi1 +
kucuktur + sayi2);
11 }
12 else if( sayi1 < sayi2)
13 {
14 JOptionPane.showMessageDialog(null, sayi1 +
buyuktur + sayi2);
15 }
16 }
17}

Bu uygulamalarda gstermek istediim durum 8 ve 12 numaral satrlardaki karlatrmalarn


ayn olmasdr. Bu durumda eer 8 numaral satrdaki karlatrma true retirse 12 numaral
satr, ayn karlatrmay yapmasna ramen almayacaktr. Eer 8 numaral satrdaki karla-
trma false retirse 12 numaral satrdaki ayn karlatrma tekrar yaplacaktr ve doal olarak
o da false reteceinden else blou da almayacaktr. Bunun da anlam uygulamada durum
ne olursa olsun hibir zaman else blounun almayacadr.

Saysal karlatrmalardan sonra imdi mantksal ilemlere bakalm. Mantksal ilemler saysal
ifadelerden farkl olarak zaten boolean sonu retir. Mantksal ilemler AND (VE), OR (VEYA),
EX-OR (ZEL VEYA), NOT (DEL) ilemleridir. Mantksal ilemlerin kestirmeli ve kestirmesiz
olmak zere 2 ekli vardr. Kestirmeli (short-circuited) ilemler doruluu kontrol edilecek ifa-
denin iinde bulunan ifadelerden herhangi biri btn ifadenin sonucunu belirledii anda dier
ifadeler kontrol edilmez. Kestirmeli (short-circuited) ilemlerde, bir ifadenin iinde bulunan btn
ifadelerin doruluu kontrol edilir, sonu belirlense bile ilem sona ermez.
2 Dngler
2 Dngler
While Dngs

do Dngs

for Dngs

break ve continue Deyimleri


Dngler
Birok programlama dilinde olduu gibi, Java dilinde de dngler nemli bir yere sahiptir. Dng-
ler, yinelenen ilemler iin oluturulan kod blounun, belirli bir koula bal olarak tekrarlanmasn
salayan yaplardr.

Java dilinde 3 tip dng mevcuttur. Bunlar;

while
do
for
dngleridir.

Oluturulan dng yaplar birka farkllk dnda, iinde bulunan kod paracn batan belirle-
nen ya da program ak ierisinde belirlenen sayda tekrarlanmasn salar. Dngler belirli say-
da ilenmek zere kurulabilecei gibi kod blou ierisinde gerekletirilecek bir koul salanana
kadar tekrarlanmak zere de gerekletirilebilir.

Dnglerin oluturulmas srasnda dikkat edilmesi gereken en nemli noktalardan biri, dng
ierisinde ilenecek kod paracnn ilem saysdr. Belirli bir say ya da bir kontrol koulu ile
kurulmayan dngler, program aknn srekliliini bozarak alan kodu sonsuz dngye soka-
bilir.

Bir dngnn ilenmesi srasnda ya da sonsuz dng durumunda, kod blounun ierisinde m-
dahaleler gerekli olabilir. Bu mdahaler de break ve continue yaplar ile salanmaktadr.

While Dngs
while dngsnn genel yaps aadaki gibidir.

while( boolean_kontol_ifadesi) {
Tekrarlanan_Ifade(ler) ;
}

Bu ifadede yer alan boolean_kontol_ifadesi kontrolu sonrasnda boolean bir sonu veren her-
hangi bir ifade olabilir. Tekrarlanan_Ifade(ler) ise yinelenmesi istenen kod bloudur.

C ve C++ dillerinde farkl veri tipleri ile kontrol yaplabilirken, Java da farkl olarak buradaki kontrol
boolean bir ifade ile yaplabilir.

While dngsnde yineleme, belirlenen koulun salanmasna kadar devam edecektir. Yineleme
kontrolu evrimin banda yaplr. Kontol ifadesinin salanmamas halinde, dng ierisinde tek-
rarlanmas istenen kod parac hi almayabilir.

rnek uygulama 2.1:

1 int sayac=0;
2 while (sayac++ < 5) {
3 system.out.println(Merhaba Dnya)
4 }

Uygulama 2.1 i incelediimizde, ilk satrda, sayac adl bir deiken tanmlanarak 0 deeri atan-
mtr. Kontrol ifadesi, sayac++ ifadesiyle artrlan sayac deeri 5ten kk olduu srece Mer-
haba Dnya ifadesi yazdrlacaktr. Bu rnekte Merhaba Dnya ifadesi 5 kez yazlacaktr.
24 Blm 2

do Dngs
Genel yaps,

do {
Tekrarlanan_Ifade (ler) ;
} while (boolean_kontol_ifadesi)

eklindedir.

do dngs ileyi biimi olarak while dngsne benzer. Benzer ekilde bu yapda da boolean
bir koul ile dngnn yinelenmesi kontrol edilmektedir. do dngsnn en nemli fark, kontol
ifadesi bata deil sonda yapldndan tekrarlanan ifade(ler) en azndan bir kere ilenecektir.

for Dngs
Birok programlama dilindeki temel gereksinimlerden biri olan, bir deikenin belirli bir aralkta
artrlmas ile kurulan dng yaplarnn en ok kullanlan for dngsdr.

Genel yaps;

for(ifade; booelan_kontrol_ifadesi ; deyim) {


tekrarlanan_ifade(ler)
}
eklindedir.

ifade olarak adlandrlan kod, sra dngnn ilenmesine geldiinde ilk olarak alan ifadedir.
Henz dng ierisindeki kod parac almaya balamadan bir defaya mahsus olarak ala-
cak, sonraki iterasyonlarda bu ifade almayacaktr. ounlukla dngde kullanlacak deike-
nin balang deer atamasnda kullanlr.

boolean_Kontrol_ifadesi doru deerini verdii srece dngnn yinelenmesini salayan kon-


trol ifadesidir. while dngsnde olduu gibi koulun salanmamas durumunda for dngs
de hi almayabilir.

deyim ise dng blounun sonunda alr. ounlukla kullanlan deikenin arttrm bu blm-
de yazlan kod ile salanr.

rnek Uygulama 2.2:

1 For(int x=0; x < 10; x++) {


2 System.out.println(Deer= + x );
3 }

Uygulama 2.2de, dngde kullanlan saysal bir x deikeni ilk ifadede tanmlanm ve 0 deer
atamas yaplm, deyim blmnde ise arttrm gereklemitir. Kontrol ifadesi x deikeninin
10 dan kk olduu tm deerler iin dorulanacak ve dng aadaki sonucu retecektir:

Deer=0
Deer=1
.....
Deer=8
Deer=9
Dngler 25

for dnglerinde genellikle dngnn saylmas iin kullanlan bir deiken ihtiyac oldduun-
dan, ifade blmnde deiken tanmlamasna ve deer atamasna izin verilmektedir. Burada ta-
nmlanan deiken, sadece for dngs iinde geerlidir. Bylece dier ksmlarda tanmlanan
deikenler ile akma ihtimali engellenmektedir.

Dng blou (scope) ierisinde kullanlacak baka deikenler de yine ifade olarak adlandrlan
blmde tanmlanabilir. Bu ilem rnek Uygulama 2.3de belirtildii gibi, tanmlanacak deiken-
ler arasna virgl konularak yaplr.

rnek Uygulama 2.3:

1 int j,k;
2 For(j = 3, k = 6; j + k < 20 ; j++, k +=2 ) {
3 System.out.println( j deeri= + j + k deeri= + k);
4 }

break ve continue Deyimleri


break ve continue deyimleri Javada da C# ta olduu gibi kullanlr.

Dng yaplar ierisinde zaman zaman kod blounun ilenmesi ile ilgili mdahale ihtiyalar or-
taya kabilir. Belirli bir noktada dngden kmak ya da o anda ilenen evrimin sonlandrlmas
istenebilir. Bu ihtiyalar break ve continue deyimleri ile salanr.

break deyimi, kod blounda kullanld yerde dngnn tamamen sonlandrlmasn salar. An-
cak dikkat edilmesi gereken en nemli nokta, iie (nested) yaplar kullanldnda break sadece
bulunduu dng blounun sonlandrlmasn salar, bir st dng ilenmeye devam edecektir.
3 Niteleyiciler
(Modifiers)
3 Niteleyiciler (Modifiers)
Access Modifiers (Eriim Niteleyicileri)

Niteleyicilerde Metod Ezme (Access


Modifiers Overriding)

Dier Niteleyiciler
Niteleyiciler (Modifiers)
Niteleyiciler derleyiciye, kod blou iinde oluturulan snf ve snf elemanlar ile ilgili bilgi sala-
yan anahtar kelimeler grubudur.

En sk kullanlan niteleyiciler eriim niteleyicileridir. Bunlar;

public
protected
private
Eriim niteleyicileri dnda belirli bir biimde kategorize edilemeyen niteleyiciler de bulunmakta-
dr. Bunlar ise;

final
abstract
static
transient
synchoronized
volatile
Tanmlama srasnda bir niteleyici ile belirlenmeyen snf elemanlar default olarak belirlenir. De-
fault kod ierisinde kullanlan bir anahtar kelime olmayp, bir niteleyici saptanmamasn ortadan
kaldrmak iin otomatik olarak atanr.

Access Modifiers (Eriim Niteleyicileri)


Eriim niteleyicileri olarak adlandrlan niteleyiciler, snf ve snf elemanlarnn (deiken, method)
eriim seviyeleri ile ilgili kstlama salar.

Snf, deiken ya da metodlarn tanmlamalarnda kullanlan bu anahtar kelimelerle eriim kst-


lamalar belirlenerek oluturulan kodun gvenlii artrlr.

Baz istisnalar dnda eriim niteleyicileri tarafndan kontrol edilebilen deikenler snf seviyesi
deikenlerdir. Bir snfn ierisinde tanmlanan deikenler eriim niteleyicileri ile belirlenmemi
olabilir. Bir metod deikeni sadece o metodun ierisinde kullanlr.

public
Bir Java programnda public olarak tanmlanan bir snf, deiken ya da metod herhangi bir k-
stlama olmakszn kullanlabilir. Bir uygulamann main() metodu, tm Java runtime ortamlarndan
arlabilmesi iin public olarak tanmlanr.

st snflarda (top-level class) kullanlabilen tek eriim niteleyicisi publictir. st snflarda pri-
vate ya da protected tanmlamas yaplmamaktadr.

private
private olarak tanmlanan deiken ya da metodlar, sadece bulunduu snf iinde kullanlabi-
lir. Tanmland snf dndan eriimi mmkn deildir.

protected
Sadece deiken ve metodlar protected olarak tanmlanabilir. protected snf elemanlar bu-
lunduklar paket (package) ierisinde eriilebilir durumdadr. Bu zelliiyle default yapsnda ben-
zemekle beraber, yer ald snfn alt snflar (sub classes) tarafndan da eriilebilir durumdadr.
protected olarak tanmlanan snf eleman, bulunduu snfn inherit edildii bir baka package
ierisinden de eriilebilir durumdadr.
30 Blm 3

Niteleyicilerde Metod Ezme (Access Modifiers Overriding)


Niteleyici olarak adlandrlan snf elemanlarnda overriding aada belirtilen biimlerde gerek-
leir.

Geerli Overriding
ekil 1:

private default protected public

private olarak tanmlanan bir metod; private, default, protected ve public metod-
lar tarafndan override edilebilir.
Default bir metod; default, protected ve public metodlar tarafndan override edilebilir.
protected bir metod; protected ve public metodlar tarafndan override edilebilir.
public bir metod ise sadece public bir metod tarafndan override edilebilir.

Geersiz Overriding
ekil 2:

public protected default private

Default bir metod; private bir metod tarafndan override edilemez.


protected olarak tanmlanan bir metod; default ve private metodlar tarafndan override
edilemez.
public bir metod ise; protected, default ve private metodlar tarafndan override edile-
mez.

Dier Niteleyiciler
Javada kullanlan dier niteleyicilerin tanmlanmasnda sra nem tamaz. rnein public
final tanmlamas ile final public tanmlamas birbirinden farkl deildir. Yine ptotected
static ile static protected tanmlamalar ayn ekilde geerli olacaktr.

final
final niteleyicisi, snf, metod ve deikenlere uygulanmaktadr. final olarak belirlenen bir
snf eleman deitirilemez.

rnein,

class SubMath extends java.lang.Math { }

ifadesi derlendiinde, Cant subclass final classes. hatas verecektir.

Dikkat edilmesi gereken nemli noktalardan biri, final bir deiken bir nesneye refere edildi-
inde, deitirilemeyen nesnenin instance (rnek) deil, referans tipli deikendir. Bir baka de-
yile; final bir referans nesne deikeni deitirilemez ancak yaratlan instance bu kstlanmadan
etkilenmez. Final niteleyicisinin C#taki karl sealed anahtar kelimesidir.
Niteleyiciler (Modifiers) 31

abstract
abstract niteleyicisi snf ve metodlara uygulanmaktadr. abstract,. Microsoft .NET platfor-
mu zerinde kullanlan Visual Basic .NET dilinde abstract bir snf oluturmak iin kullanlan
anahtar kelime MustInherittir. Buradan anlayacanz gibi, abstract bir snftan mutlaka
tretme yaplmaldr ve tretilen snf kullanlmaldr.

Eer bir snf birden fazla abstract metoda sahipse, derleyici snfn abstract olar-
ak tanmlanmasn zorlar. Bu durum kullanlabilirlii artrr. Snf kullanrken, tretilen snf
kullanlmas gerektiini ya da rneklenebileceinin belirlenmesi iin baklmas gereken yer snfn
tanmlamasdr.

Aada belirtilen durumlardan en az birisi gereklendiinde, derleyici bir snfn abstract olarak
tanmlanmasn zorlayacaktr.

Snf birden ok abstract metoda sahipse


Snf implementasyon salamayan bir veya birden ok abstract metod inherit ediyorsa
Snf bir arayz (interface) implemente etmek zere tanmland halde, interfacein tm me-
todlar iin implementasyon salamyorsa

static
static niteleyicisi deikenler, metodlar hatta bir metodun paras olmayan kod bloklar iin
kullanlabilir. static olarak belirlenen snf elemanlar bir snfla balantl olmaktan ok snfa
ait olarak dnlebilir.

static olarak belirlenmi bir deikenin deeri, ne kadar instance (rnek) tretilmi olursa olsun
deerini koruyarak sabit kalacaktr.

static bir deikeni refere etmenin iki yolu vardr:

Snfn instancena referans verme yolu ile.


Snf ad ile.
Metodlar da static olarak tanmlanabilir. Snfn static verilerine ulaabildikleri ve snfn
dier static metodlarn arabildikleri halde, static metodlar snflarnn non-static (statik
olmayan) elemanlarn kullanamazlar.

Non-static metodlar this adl rtl (implicit) bir deikene sahiptir. Non-static metodlarda, hangi
nesnenin ya da metodun olduunu belirtmeden bir deiken veya metod arlabilir.

rnek Uygulama 3.1:

1 class Xyz
2 {
3 int ix;
4 void f1() {
5 ix++;
6 }
7 }

rnek Uygulama 3.1de tanmlanan ix deikeni, hangi nesne ya da metoda ait olduu belirtil-
meden ix++ ifadesi ile artrlmaktadr. Derleyici varsaylan olarak bu ifadeyi this.ix++ olarak
alglar ve doru bir biimde iler.

static metodlarda ise this yaps bulunmamaktadr. static bir metod ierisinden, bir baka
metod ulalmak ya da arlmak istendiinde Undefined variable:this hatas verecektir.
32 Blm 3

static bir metod, non-static bir deikene ulamak istediinde hangi snfn deikeni olduunu
ya da metodu altran snfn hangisi olduunu belirterek armak zorundadr.

static bir metod non-static olarak override edilemez. Bu durumda Static methods cant be
overriden hata mesaj verecektir.

transient
transient niteleyicisi sadece deikenler iin kullanlmaktadr. transient bir deiken kendi
objesinin srekli bir paras olarak tutulmaz.

synchronized
synchronized deikenler multithread programlarda, kritik kodlara eriimi kontrol etmek
amacyla kullanlr. Multithreading daha sonraki blmlerde detayl olarak incelenecektir.

volatile
volatile olarak belirlenen deikenler asenkron olarak deitirilebilen deikenlerdir. vola-
tile deikenler ok ilemcili ortamlarn konusudur.

Niteleyiciler ile ilgili zeti aadaki tabloda bulabilirsiniz.

ekil 3:

Niteleyici Snf Deiken Metod Constructor


public
protected
(Default)*
private
final
abstract
static
transient
volatile
synchronized

* default bir niteleyici deil, niteleyici belirlenmediinde varsaylan olarak kullanlan anahtar sz-
cktr.
4 Casting ve
Conversion
4 Casting ve Conversion
Basit Tiplerde Conversion

Referans Tiplerde Conversion


Casting ve Conversion
Java da, C# ve tm programlama dillerinde olduu gibi kullanlan her deikenin bir tipi vardr.
Bunlar int, long ve double gibi basit (primitive) deikenler olduu gibi, snf deikenleri (Ve-
ctor, Graphics vb) ya da arayzler (LayoutManager ve Runnable vb) olabilir.

Bu blmde, veri tipleri arasndaki dnmleri ele alacam.

Veriler gerek aka (explicitly) ya da rtl (implicitly) olarak dntrlebilir. Bir baka deyile
kendi bilgi ve isteimiz dahilinde ya da derleyici tarafndan otomatik olarak yaplan veri tipi dn-
mleri mmkndr.

Aka gerekletirilen veri tipi dnmleri casting olarak adlandrlr. Bu durumda kodlama es-
nasnda kendi isteimizle bir deikenin tipini deitiririz.

rnek Uygulama 4.1:

1 ix = (int) mylix;

rnek Uygulama 4.1de, mylix deikeni, int olarak ix deikenine casting yaplarak atan-
maktadr.

rtl olarak gerekleen veri tipi dnmleri ise, deiken atamalar srasnda derleyici tara-
fndan otomatik olarak yaplmaktadr. Ak olmayan, rtl dnmler conversion olarak adlan-
drlr.

rnek Uygulama 4.2:

1 int x, y;
2 double d;
3 x = 3;
4 y = 5;
5 d = x + y;

rnek Uygulama 4.2de double deikenine atanan tam say deerlerin toplam 8.000000... de-
erini alacaktr. Bu durumda gerekletirilen deiken tipi dnm derleyici tarafndan otomatik
olarak gerekletirilecektir.

Java programlama dilinde basit tipler ve referans tipleri olmak zere iki veri tipi kategorisi bulun-
maktadr.

Basit tipler olarak adlandrlan veri tipleri; boolean, char, byte, short, int, long, float,
doubledr. Referans tipleri ise; JDK tarafndan salanan birok snf, arayzn yansra, Java
gelitiricileri tarafndan gelitirilen snflardr.

Basit tipler ve referans tipleri olarak anlan tm veri tipleri arasnda, belirli kurallar dahilinde cas-
ting ve conversion mmkndr. Bu balamda, 4 eit veri tipi dnm ortaya kmaktadr:

Basit veri tipleri arasnda conversion


Basit veri tipleri arasnda casting
Referans tipleri arasnda conversion
Referans tipleri arasnda casting
36 Blm 4

Basit Tiplerde Conversion


Basit veri tiplerinin dnmnde 3 tip conversion karmza kar, bunlar:

Atama
Metod arma
Aritmetik ykseltme (arithmetic promotion)

Basit Tiplerde Conversion: Atama


Atama dnm, bir deikene orijinal deerinden farkl bir deer atamas yapldnda gerek-
leir.

rnek Uygulama 4.3:

1 int i;
2 double d;
3 i = 10;
4 d = i;

rnek Uygulama 4.3de tanmlanan i int, d ise double deikenlerdir. double bir deiken
tamsay ifade saklayamayacandan, d = i atamas yapldnda, d deikeninin saklad de-
er 10.000000... olacaktr.

Ancak baz atamalar yukarda verdiimiz rnekteki gibi geerli ifadeler olmayacaktr.

rnek Uygulama 4.4:

1 double d;
2 short s;
3 d = 1.2345;
4 s = d;

rnek Uygulama 4.4te yer alan atama, double bir ifadenin short veri tipine atanmas eklinde-
dir. short veri tipi double deerini saklayamaz. Bu kod ilenmeyecek, Incompitable type for=.
hatasn verecektir.

Daha byk deer saklayan deikenlerden daha kk deer tayan deikenlere dnm bir
iedeki svy kk bir bardaa tamaya benzer ancak explicit casting kullanlmaldr.

Basit tiplerde atamann genel kurallar u eklidedir:

boolean bir veri tipi dier veri tiplerine evrilemez.


Geniletme dnm (widening conversion) szkonusu ise, boolean olmayan (non-boole-
an) bir veri tipi, boolean olmayan bir veri tipine dntrlebilir.
Daraltma dnm (narrowing conversion) szkonusu ise boolean olmayan bir veri tipi,
boolean olmayan bir veri tipine dntrlemez.
Geniletme dnm, daha kk deerler saklayan veri tiplerinden daha geni deerler sakla-
yan veri tiplerine gerekletirilebilir. Bu durumda herhangi bir veri kayb olmayacaktr. Geniletme
Dnm;

byte veri tipinden; short, int, long, float veya double veri tiplerine,
short veri tipinden; int, long, float veya double veri tiplerine,
char veri tipinden; int, long, float veya double veri tiplerine,
Casting ve Conversion 37

int veri tipinden; long, float veya double veri tiplerine,


long veri tipinden; float veya double veri tiplerine,
float veri tipinden; double veri tipine
gerekletirilebilir.

ekil 4.1:

char

int long float double

byte short

ekil 1de belirtilen tm dnmler veri kayb yaanmakszn yaplan dnmlerdir. Yine e-
kilde belirtilen ok yn dnda gerekletirilecek dnmler ise daraltma dnm (narrowing
conversion) olarak tanmlanr. Bu tip conversionlarda veri kayb olabilir. Daraltma dnm ise;

byte veri tipinden; char veri tipine,


short veri tipinden; byte veya char veri tiplerine,
char veri tipinden; byte veya short veri tiplerine,
int veri tipinden; byte, short veya char veri tiplerine,
long veri tipinden; byte, short, char veya int veri tiplerine,
float veri tipinden; byte, short, char, int veya long veri tiplerine,
double veri tipinden; byte, short, char, int, long veya float veri tiplerine
gerekletirilebilir.

Java programlama dilinde ondalkl saysal deerler double, ondalksz saysal ifadeler inte-
ger veri tipindedir. Normal koullarda, integer ve double deerlerin daha kk deerler
tutan deikenlere atanmasnn derleyici hatasna sebep olacan dnebiliriz. Ancak Java bu
durumlar kendi iinde esneterek ve atamay hatasz olarak gerekletirir.

rnek Uygulama 4.5:

1 float f = 2.345;
2 byte b = 3;
3 short s = 5;
4 char c = 7;

rnek Uygulama 4.5te belirtilen atamalar hatasz olarak gerekleecektir. rnek Uygulama
4.6de belirtilen kodun ikinci satr ise saysal ifade atamas yaplmadndan derlenmeyecektir.

rnek Uygulama 4.6:

1 int i = 15;
2 byte b = i;
38 Blm 4

Basit Tiplerde Conversion: Metod arma


Metod arma dnm, belirli bir veri tipinde argman bekleyen bir metoda, farkl bir veri tipin-
de argman salandnda derleyicinin otomatik olarak gerekletirdii dnmdr.

rnek Uygulama 4.7:

1 float f;
2 double d;
3 f = 2.34567f;
4 d = Math.cos(f);

rnek Uygulama 4.7de belirtilen Math snfna ait cos() metodu, veri tipi olarak double bir
argman beklemektedir. f deikeninin float deeri cos() metodunda ilenmeden nce oto-
matik olarak double veri tipine dntrlecektir.

Metod arma dnmlerinde de atama dnmlerini belirleyen kurallar geerlidir. Derleyici


zamannda (compile time) geniletme dnmne izin verilirken, daraltma dnmne izin
verilmez.

Basit Tiplerde Conversion: Aritmetik Ykseltme


Aritmetik ykseltme, aritmetik ifadeler kullanlarak ilem yapldnda gerekleen dnm tipi-
dir.

rnek Uygulama 4.8:

1 short s = 5;
2 int i = 8;
3 float f = 13.2f;
4 double d = 13.2;
5 if ( s i <= f * d)
6 system.out.println( lk ilem kk veya eit;
7 else
8 system.out.println( lk ilem kk veya eit deil;

rnek Uygulama 4.8, if blounun iinde aritmetik ifadeler ile ilenen deikenler farkl veri tiple-
rindedir. Derleyici, aritmetik ilemleri anlaml bir biimde gerekletirmek iin gerekli dnmleri
otomatik olarak gerekletirecektir. Bu dnmlerin tamam daha nce belirttiimiz geniletme
dnm olacaktr.

Aritmetik ykseltme dnm kurallar tekli operatrler (unary operators) ve ikili operatrler (bi-
nary operators) iin farkllamaktadr. Tekli operatrler tek bir ilenen (operand) zerinde ilem
yaparken, ikili operatrler iki ilenen zerinde ilem yapmaktadr.

ekil 4.2:

Tekli
+ - ++ -- ~
operators

+ - * / % >> >>> <<


Binary
operators
& ^ |
Casting ve Conversion 39

Tekli operatrler iin uygulanan dnm kurallar aadaki gibidir;

Eer kullanlan ilenenin veri tipi byte, short ya da char ise; int veri tipine dntrlr.
(Eer kullanlan operatr ++ ya da -- ise dnm yaplmayacaktr)
Yukarda belirtilen dndaki veri tiplerinde dnm yaplmaz.
kili operatrler iin uygulanan kurallar ise aadaki ekilde belirlenmitir.
Eer ilenenlerden birinin veri tipi double ise, dier ilenen double veri tipine dntr-
lecektir.
Eer ilenenlerden birinin veri tipi float ise, dier ilenen float veri tipine dntrlecek-
tir.
Eer ilenenlerden birinin veri tipi long ise, dier ilenen long veri tipine dntrlecek-
tir.
Yukarda belirtilen dndaki veri tiplerinde int veri tipine dntrlecektir.

Basit Tiplerde Casting


imdiye kadar ele aldmz dnm tipleri rtl olarak gerekletirilen, Javann otomatik ola-
rak gerekletirdii dnmlerdi. Bu dnmler, aka bir kod yazmamz gerektirmeyen d-
nmlerdir.

Casting ise, Javaya bir dnm yapmasn sylemektir. Veri tipleri arasndaki dnm belir-
leyen, yazacamz kod olacaktr.

Geniletme dnm olarak belirttiimiz dnmlerde castinge ihtiya duyulmamakta, derleyi-


ci otomatik olarak yapmaktadr. Casting daha ok daraltma dnm olarak bilinen dnmler-
de kullanlmaktadr. Bu dnmlerde veride kayp riski bulunduundan, derleyici otomatik olarak
yapmamakta, riskin alnarak dnmn salanmas gerektii yazlacak kod ile belirtilmelidir.

rnek Uygulama 4.9:

1 short s = 362;
2 byte b = s;
3 system.out.println(s = + s + , b = + b )

rnek Uygulama 4.9da belirtilen ifade derlendiinde, 2. satrda derleyici hatas verecektir. nk
short veri tipinden daha dar bir veri tipi olan byte veri tipine atama yaplmak istenmektedir. Bu
dnm ekil 4.3 te belirtilmitir.

ekil 4.3:

0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0

b = (byte)s

Bu durumda derleyici aka dnm yaplmas gerektiini bildiren; Explicit cast needed to con-
vert short to byte uyars verecektir. rtl casting yaparsak aadaki durum oluacak ve veri
kayb szkonusu olacaktr.
40 Blm 4

rnek Uygulama 4.10:

1 short s = 362;
2 byte b = (byte)s;
3 system.out.println(b = + b )

b = 106 olarak yazlacaktr.

Basit veri tiplerinin casting yaplmasnda aadaki kurallar geerlidir.

Boolean olmayan herhangi bir veri tipi, boolean olmayan herhangi bir veri tipine dnt-
rlebilir.
Boolean bir veri tipi herhangi bir veri tipine, herhangi bir veri tipi boolean veri tipine dn-
trlemez.

Referans Tiplerde Conversion


Referans tipli deikenleri de basit veri tipleri gibi atama, metod arma ve casting ile dnt-
rlebilmektedir. Ancak eski ve yeni tipler arasndaki dnmlerde daha ok kombinasyon oldu-
undan daha karmaktr.

Referans tiplerinde conversion da basit tiplerde conversion gibi derleyici zamannda gerekle-
mektedir. Daha sonra belirteceimiz zere object casting iin ise bu geerli deildir.

Referans Tiplerde Conversion: Atama


Referans tiplerde atama, bir nesne referans deerini farkl bir veri tipindeki deikene atadmz-
da gerekleir. Genel notasyon olarak aadaki biimde uygulanmaktadr:

EskiTip x = new EskiTip();


YeniTip y = x;

Referans tiplerde conversionda, eskitip ve yenitip yeler (member) arasndaki dnm kombi-
nasyonlar ekil 4.4te belirtilmitir.

ekil 4.4:

Eski Tip

Snf (Class) Arayz (Interface) Dizi (Array)

Eskitip, Yenitipin Yenitip nesne


Snf Yenitip nesne olmaldr.
Yeni Tip

altsnf olmaldr. olmaldr.

Eskitip, Yenitipin
Eskitip, yenitipin
Arayz alt-arayz Yenitip cloneable ya da
arayzn
(Interface) (subinterface) serializable olmaldr.
implemente etmelidir.
olmaldr.

Eskitip, yenitipin dizisine


Derleyici hatas Derleyici hatas
Dizi (Array) dntrlebilecek bir dizi
oluacaktr. oluacaktr.
olmaldr.

Tm dnm kurallarna uygulanmasa da, genel bir bak as olarak, izin verilen referans tipi
dnmleri, miras hiyerarisinde (inheritance hierarchy) yukar doru olmaktadr. Yani, eskitip,
yenitipten miraslanmaldr.
Casting ve Conversion 41

Genel kurallar aadaki ekilde belirlenebilir:

Bir arayz sadece yine bir arayze ya da nesneye dntrlebilir. Eer yenitip bir arayz ise,
eskitipin alt-arayz olmaldr.
Bir snf yine bir snfa ya da arayze dntrlebilir. Bir snfa dntrldnde, yenitip
eskitipin alt-snf olmaldr. Bir arayze dntrldnde, eski snf arayz implemente
etmelidir.
Bir dizi, snf nesnesine ya da cloneable veya serializable bir arayze ya da diziye dntr-
lebilir. Sadece nesne referans tipinin dizisi bir diziye dntrlebilir ve eski eleman tipi yeni
eleman tipine evrilebilir olmaldr.

Referans Tiplerde Csonversion: Metod arma


Genel olarak referans tiplerde atama dnmnde tanmlanan kurallar bu dnm tipinde de
geerlidir. Bir spersnfa dnme izin verilirken, altsnfa dnme izin verilmez.

Genel kurallar aada belirtilmitir.

Bir arayz sadece yine bir arayze ya da nesneye dntrlebilir. Eer yenitip bir arayz ise,
eskitipin alt-arayz olmaldr.
Bir snf yine bir snfa ya da arayze dntrlebilir. Bir snfa dntrldnde, yenitip
eskitipin alt-snf olmaldr. Bir arayze dntrldnde, eski snf arayz implemente
etmelidir.
Bir dizi, snf nesnesine ya da klonlanabilir veya seriletirilebilir bir arayze ya da diziye d-
ntrlebilir. Sadece referans tipinin dizisi bir diziye dntrlebilir ve eski eleman tipi yeni
eleman tipine evrilebilir olmaldr.

Referans Tiplerin evrimi


Referans tiplerde evrim daha nce ele aldmz basit tiplerin evrimine benzer. Atama ve metod
arma yntemlerinde izin verilen tm ak evrimler (explicit casting) bu yntemde de kullan-
labilmektedir.
Referans tiplerin evriminde derleyici zamannda olduu gibi alma zamannda uygulanan ku-
rallar da bulunmaktadr. Bunu sebebi, referans tipli deikenlere ilikin baz bilgilerin derleyici
zamannda henz bilinmemesidir.
Referans tiplerin evrimi iin derleyici zaman kurallar ekil 4.5 te belirtilmitir.
ekil 4.5:
Eski Tip
Miras verebilir Miras veremeyen
Arayz
snf (non-final snf (final - sealed Dizi (array)
(interface)
class) class)

Miras verebilir
Eskitip, yenitipi Eskitip, yenitipi Herzaman Eskitip nesne
snf (non-
geniletmelidir geniletmelidir geerlidir olmaldr
final class)

Miras
Yeni Tip

Yenitip arayz
veremeyen Eskitip, yenitipi Eskitip ve Yenitip ayn Derleyici hatas
implemente
snf (final - geniletmelidir snf olmaldr. oluacaktr
etmelidir
sealed class)
Eskitip, Yenitipin
Arayz Herzaman Herzaman Derleyici hatas
arayznn
(interface) geerlidir geerlidir oluacaktr
implemente etmelidir
Eskitip, yenitipin
Yenitip nesne Derleyici hatas Derleyici hatas dizisine
Dizi (array)
olmaldr oluacaktr oluacaktr dntrlebilecek
bir dizi olmaldr
42 Blm 4

Eskitip ve Yenitip arasndaki dnmlerde derleyici zamannda geerli kurallar aada belirtil-
mitir.

Eskitip ve Yenitip dnmlerinde her ikisinin de snf olmas halinde, bir snf dierinin alts-
nf olmaldr.
Eskitip ve Yenitiplerin her ikisi de dizi ise, her iki dizi de referans tipi barndrmal ve eskitipin
bir elemannn yenitipin bir elemanna evrimi geerli olmaldr.
Bir arayz ile Miras verebilir snf (non-final class) arasnda herzaman evrim yaplabilir.
alma zamannda uygulanan kurallar ise;

Eer Yenitip bir snf ise, dntrlen ifadenin snf ya Yenitip olmaldr, ya da Yenitipten
miras alnmaldr.
Eer Yenitip bir arayz ise, dntrlen ifadenin snf Yenitipi implemente etmelidir.
olarak belirlenebilir.
5 Yapsal
Programlama
5 Yapsal Programlama
Yapsal Programlama Nedir?

Nesne Ynelimli Programlamann Temel


Kavramlar
Yapsal Programlama
Yapsal Programlama Nedir?
Yapsal programlamada uygulamann ak fonksiyonlara blnerek her bir fonksiyonun belirli
bir ii gerekletirmesi salanr. Yazlmn amac gerek dnyadaki i aklarnn bilgisayar orta-
mnda yrtlmesi olduu iin, modellenmesi istenen kavramlar fonksiyonlar ve deikenler kul-
lanlarak modellenmeye allmaktadr. Gerek dnyada fonksiyon ve deiken gibi kavramlar
yerine nesnelerin bulunmasndan dolay modelleme tam anlamyla gerekletirilememektedir.

Nesne Ynelimli Programlamanin Temel Bileenleri


Snf ve Nesne
Modellememiz gereken i aklarn yazlm ortamnda temsil etmek iin kullandmz temel bile-
en snflardr. Snf sadece bir modeldir, uygulama alrken fiziksel olarak oluturulmayan, kod
zerinde kalan soyut bir yapdr. Nesne ise uygulamann almas aamasnda fiziksel olarak
bilgisayarn belleinde oluan ve baka nesnelerle iletiim kurarak i aklarnn gereklemesini
salayan bir bileendir. C# .Net dilinde olduu gibi Java dilinde de yeni bir nesne oluturmak iin
new anahtar kelimesi kullanlr, new anahtar kelimesini kullandmz her kod paras uygulama-
nn almas srasnda bellek zerinde yeni bir nesne oluturur.
Nesne ynelimli programlamaya yeni balayan yazlm gelitiriciler snf ve nesne kavramlar ara-
sndaki fark anlamakta zorluk ekebilir, bunun sebebi uygulamann alma aamasnda snf
diye bir varln olmamas gibi gerek hayatta da snf diye bir varln bulunmamasdr.

Nitelikler (Attributes)
Bir snfn iinde bulunan ve o snftan oluturulacak olan nesnelerin zelliklerini tutan yaplar-
dr. Snflarn kodlanmas srasnda deikenler eklinde oluturulurlar ve snftan nesne rnei
oluturulduu anda bellek zerinde oluurlar. Gerek hayattaki nesnelerin eitli niteliklere sahip
olmas gibi yazlm ortamnda oluan nesneler de eitli niteliklere sahiptir.

rnek Uygulama 5.1:


1 public class Nokta
2 {
3 private int x;
4 private int y;
5 }
rnekte, nokta kavramnn yazlm ortamndaki modeli olan Nokta snf oluturulmutur ve bu
snftan oluturulacak olan nesnelerin x ve y koordinatlarn temsil etmek iin x ve y nitelikleri ola-
caktr. x ve y nitelikleri snfn iinde yer alsa da deerlerini Nokta snfndan bir nesne olutuktan
sonra ve oluan nesne zerinden alacaktr.

Davranlar
Yazlm ortamnda bellek zerinde oluan nesnelerin sergileyecei davranlar da nitelikler gibi
bu nesnenin modeli olan snf zerinde bulunur. Davranlar, snflarn kodlanmas srasnda me-
todlar eklinde oluturulur ve bir snfn iinde bulunan metodlar bu snftan oluturulacak olan b-
tn nesnelerin ortak davranlarn belirler. Gerek hayattaki nesnelerin eitli davranlara sahip
olmas gibi yazlm ortamndaki nesnelerin de eitli davranlar bulunur. Her bir nesnenin kendi
davrann modelleyen metodlara rnek metodu(instance method) ad verilir.

rnek Uygulama 5.2:

1 public class Nokta


2 {
46 Blm 5

3 private int x;
4 private int y;
5 public void YerDegistir(int yeniX, int yeniY)
6 {
7 x = yeniX;
8 y = yeniY;
9 }
10}

rnek Uygulama 5.1de oluturduumuz Nokta snfmza YerDegistir davrann ekledik.


Bu metod sayesinde Nokta snfndan oluan btn nesnelere iki boyutlu uzayda yer deitirme
kabiliyeti vermi olduk. YerDegistir metodumuz iki tane tam say cinsinden parametre alr ve
nesnemizin x ve y koordinat deerlerini yeni koordinat deerleriyle deitirir.

Nesnelere ait metodlar parametre olarak int, string gibi yerleik tiplerden deikenler alabile-
cekleri gibi kendi snf veya baka bir snf cinsinden nesneler de alabilir.

rnek Uygulama 5.3:

1 public class Nokta


2 {
3 private int x;
4 private int y;
5 public void YerDegistir(int yeniX, int yeniY)
6 {
7 x = yeniX;
8 y = yeniY;
9 }
10 public double UzaklikHesapla(Nokta ikinciNokta)
11 {
12 double uzaklik = Math.sqrt(Math.pow(x - ikinciNokta.
x, 2) + Math.pow(y - ikinciNokta.y, 2));
13 return uzaklik;
14 }
15}

Herhangi bir nokta nesnesinin baka bir nokta nesnesi ile arasnda olan uzakl bulmak iin bir
metod yazdk. UzaklikHesapla metodu parametre olarak bir Nokta nesnesi alyor ve zerinde
almakta olduu nesneyle parametreden gelen nesne arasndaki uzakl double cinsinden
hesaplayarak dndryor. Kare alma ve karekk hesaplama ilemleri iin yerleik Java snfla-
rndan biri olan Math snfn kullandk. Metod iinde kullanlan x ve y, davrann sahibi olan
nesneye ait x ve y deerleridir. Parametre olarak gelen ikinci nesneye ait x ve y nitelikleri ise
ikinciNokta.x ve ikinciNokta.y eklinde kullanlmtr.

Bir snfn iinde ayn isimli birden fazla metod tanmlanabilir. Bu durumda tek art tanmlanacak
olan metodlarn parametre saylarnn veya parametre tiplerinin farkl olmasdr, ayn tipten ayn
sayda parametre ieren ayn isimli birden fazla metod tanmlanrsa derleme hatas alrz. Bu i-
leme metodlarn ar yklenmesi (overloading) ad verilir. Bu mekanizma C# dilindekine benzer
bir mantkla gerekletirilebilir.
Yapsal Programlama 47

rnek Uygulama 5.4:

1 public class Nokta


2 {
3 private int x;
4 private int y;
5 public void YerDegistir(int yeniX, int yeniY)
6 {
7 x = yeniX;
8 y = yeniY;
9 }
10 public double UzaklikHesapla(Nokta ikinciNokta)
11 {
12 double uzaklik = Math.sqrt(Math.pow(x - ikinciNokta.
x, 2)
+ Math.pow(y - ikinciNokta.y, 2));
13 return uzaklik;
14 }
15 public double UzaklikHesapla(int ikinciNoktaX, int
ikinciNoktaY)
16 {
17 double uzaklik = Math.sqrt(Math.pow(x -
ikinciNoktaX, 2)
+ Math.pow(y - ikinciNoktaY, 2));
18 return uzaklik;
19 }
20}
Son durumda, Nokta snfmzn iinde ayn ii yapan ayn isimli iki tane metod var. lk yazdmz
metod parametre olarak bir Nokta nesnesi ile alyor, ikinci metod ise harici bir noktann x ve y
koordinat deerlerinin parametre olarak verilmesini bekliyor.

Snflarn iinde bulunan metodlar yine ayn snfn iinde bulunan baka metodlar da kullanabilir.
Nokta snfnda yazdmz UzaklikHesapla metodlar iinde ayn algoritmay iki kere yazdk.
Bunun yerine UzaklikHesapla metodlarndan birinin dier UzaklikHesapla metodunu kul-
lanarak hesaplama yapmasn aadaki gibi salayabiliriz. Bylece gereklememiz gereken bir
algoritmay veya i mantn bir kere gerekleyerek koddan tasarruf ettiimiz gibi uygulamamz
olas deiimler iin daha uygun hale getiririz.

rnek Uygulama 5.5:

1 public class Nokta


2 {

3 private int x;
4 private int y;
5 public void YerDegistir(int yeniX, int yeniY)
6 {
7 x = yeniX;
48 Blm 5

8 y = yeniY;
9 }
10 public double UzaklikHesapla(Nokta ikinciNokta)
11 {
12 return UzaklikHesapla(ikinciNokta.x, ikinciNokta.y);
13 }
14 public double UzaklikHesapla(int ikinciNoktaX, int
ikinciNoktaY)
15 {
16 double uzaklik = Math.sqrt(Math.pow(x -
ikinciNoktaX, 2)
+ Math.pow(y - ikinciNoktaY, 2));
17 return uzaklik;
18 }
19}

Yapc Metod (Constructor)


Uygulama iinde nesnelerin oluturulmas aamasnda otomatik olarak alan metodlara kurucu
veya yapc metodlar denir. Genelde nesnelerimizin iinde bulunan niteliklere ilk deerler atamak
iin kullanlr. Yapc metodlarla ilgili snrlamalar aadaki gibidir:

1 Yapc metodlar yeni nesne oluturulmasn salamaz, bir nesnenin oluma aamasnda a-
lr.
2. Yapc metodlarn isimleri snfn ismiyle ayn olmak zorundadr.
3 Yapc metodlarn geri dn deeri olamaz, geri dn deeri olan bir yapc metod tanm
yaparsak derleme hatas alrz.
4. Bir snf iinde birden fazla yapc metod bulunabilir. Parametre tiplerinin veya saylarnn
farkl olmas birden fazla yapc metod tanmlanabilmesi iin yeterlidir.
5. Java dilinde de .Net ortamnda olduu gibi varsaylan, parametresiz bir yapc metod vardr.
Snfmzn iinde parametreli veya parametresiz bir tane yapc metod oluturduumuzda
varsaylan yapc metod geersiz hale gelir.
6. New anahtar kelimesi ile snftan nesne oluturulmasna izin vermek istiyorsak yapc me-
todlar public olarak tanmlamamz gerekir. Snfn iinde bir tane yapc metod varsa ve bu
metodun eriim tipi private ise, bu snftan nesne oluturulamaz.
rnek Uygulama 5.6:

1 public class Nokta


2 {
3 private int x;
4 private int y;
5 public Nokta()
6 {
7 x = 0;
8 y = 0;
9 }
10}
Yapsal Programlama 49

Nokta snfmza parametresiz bir yapc metod ekleyerek yeni oluan her nesnenin x ve y koor-
dinatlarnn sfr deerine sahip olmasn yapc metod araclyla saladk. Snfmza bir tane de
parametreli yapc metod ekleyelim.

rnek Uygulama 5.7:


1 public class Nokta
2 {
3 private int x;
4 private int y;
5 public Nokta()
6 {
7 x = 0;
8 y = 0;
9 }
10 public Nokta(int x, int y)
11 {
12 this.x = x;
13 this.y = y;
14 }
15}
Son durumda iki tane yapc metodumuz oldu. Parametresiz yapc metod kullanlarak oluan
btn nesnelerin x ve y koordinatlar sfr deerini alyor, parametreli yapc metodumuz ise nes-
nenin olumas srasnda noktann farkl koordinat deerlerine sahip olmasn salyor.

Parametreli yapc metodumuzun gvdesinde yer alan this anahtar kelimesi, zerinde almak-
ta olduumuz nesneyi temsil eder. Nesne zelinde deerlendirilebilen nitelik ve metodlara this
anahtar kelimesi ile ulaabiliriz. Daha nceki rneklerde this anahtar kelimesini kullanmamza
gerek kalmamt, nk x ve y isimli birer tane deiken bulunuyordu. Son yazdmz metodda
ise biri parametreden gelen, dieri nesnenin sahip olduu nitelii temsil eden iki tane x deikeni
olduundan bu deikenleri biribirinden ayrabilmek iin nesneden gelen x deikeninin bana
this anahtar kelimesini ekliyoruz.

Yapc metodun parametrelerinden biri olan x deikeni ile nesne zerindeki nitelii temsil eden
x deikeni arasnda hibir organik ba yoktur, farkl isimlere sahip olsalar da uygulama istendii
ekilde alr. Aralarndaki iliki yapc metodumuzun iinde yaptmz deer atamas ile snrl-
dr. Parametreli yapc metodumuz ekil 5.8de belirtilen iki ekilde de yazlabilirdi:

rnek Uygulama 5.8:

1 public Nokta(int yeniX, int yeniY)


2 {
3 this.x = yeniX;
4 this.y = yeniY;
5 }
6 public Nokta(int yeniX, int yeniY)
7 {
8 x = yeniX;
9 y = yeniY;
10}
50 Blm 5

Nokta snfnn son halini ve bu snftan birka tane nesne oluturan ana program ekil 5.9daki
gibi yazabiliriz:

rnek Uygulama 5.9:


1 public class Nokta
2 {
3 private int x;
4 private int y;
5 public Nokta()
6 {
7 x = 0;
8 y = 0;
9 }
10 public Nokta(int x, int y)
11 {
12 this.x = x;
13 this.y = y;
14 }
15 public void YerDegistir(int yeniX, int yeniY)
16 {
17 x = yeniX;
18 y = yeniY;
19 }
20 public double UzaklikHesapla(Nokta ikinciNokta)
21 {
22 return UzaklikHesapla(ikinciNokta.x, ikinciNokta.y);
23 }
24 public double UzaklikHesapla(int ikinciNoktaX, int
ikinciNoktaY)
25 {
26 double uzaklik = Math.sqrt(Math.pow(x -
ikinciNoktaX, 2)
+ Math.pow(y - ikinciNoktaY, 2));
27 return uzaklik;
28 }
29}

30 public class AnaProgram


31{
32 public static void main(String[] args)
33 {
// Parametresiz yapc metodla bir Nokta nesnesi
oluturuldu
34 Nokta nokta1 = new Nokta();
35 nokta1.YerDegistir(3, 5);
Yapsal Programlama 51

// Parametreli yapc metodla bir Nokta nesnesi oluturuldu


36 Nokta nokta2 = new Nokta(5, 5);
// nokta1 ve nokta2 nesneleri arasndaki uzaklk nokta1
nesnesi
// zerinden hesapland
37 double uzaklik = nokta1.UzaklikHesapla(nokta2);
38 System.out.println(uzaklik); // Ekrana 2.0 deeri
basld
// nokta1 ve nokta2 nesneleri arasndaki uzaklk nokta2
nesnesi
// zerinden hesapland
39 uzaklik = nokta2.UzaklikHesapla(nokta1);
40 System.out.println(uzaklik); // Ekrana 2.0 deeri
basld
// nokta1 nesnesinin yeni koordinatlar (4, 6) deerini
ald
41 nokta1.YerDegistir(4, 6);
// nokta1 nesnesinin (5, 7) koordinatlarnda bulunan
noktaya uzakl
// hesapland
42 uzaklik = nokta1.UzaklikHesapla(5, 7);
43 System.out.println(uzaklik); // Ekrana 1.414 deeri
basld
44 }
45}

Nesne Ynelimli Programlamann Temel Kavramlar


Kapslleme (Encapsulation)
Bir nesnenin iinde yer alan niteliklerin ve i mantnn nesneyi kullanan kiiler tarafndan g-
rlmesinin veya deitirilmesinin engellenmesine kapslleme denir. Kapsllemede temel ama
nesneyi kullanacak kiilerin i akyla ilgili gereksiz detaylarla uramamasn salamak ve nes-
nelerin iinde bulunan hassas verilerin deitirilmesini engellemektir.

Gnlk hayatta dzenli olarak kullandmz bir mnitr nesnesi zerinden rnek verelim: Moni-
trmzn iinde birok elektronik devre eleman olduunu bilsek de bu devrelerin nasl alt
hakknda oumuzun bir fikri bulunmamaktadr. Monitrn iinde bulunan elektronik elemanlar
ve bunlarn alma mantklar son kullancdan soyutlanm durumdadr. Monitrn dnda yer
alan klfn bulunmadn ve monitr zerinde herhangi bir ilem yapmak iin eitli devre ele-
manlarnn deerlerini deitirmek zorunda kaldmz dnecek olursak bahsettiimiz gereksiz
karmakln ne anlama geldiini daha iyi anlayabiliriz. Bahsedilen durumda monitr gibi basit
bir nesneyi kullanmak iin youn aba harcamamz gerekecei gibi yanl bir hareketle ierideki
yaplara zarar vermemiz de ihtimal dahilinde olacaktr.

Monitrn kullancyla etkileim kurmak iin dmelerden oluan bir iletiim arayzne sahip
olmas gibi, yazlmsal olarak gereklediimiz nesnelerimizin de kendilerini kullanacak yazlm-
clarla aralarnda bir iletiim arayz bulundurmalar kullanm kolaylatracaktr. Snflarmzn
iinde bulunan niteliklerin ve metodlarn sadece ihtiya duyulduu kadarnn kullancya almas
kapslleme mant erevesinde gereklenebilir.

Daha nce anlatld gibi nitelikler ve metodlarn eriimi aadaki gibi kstlanabilir:
52 Blm 5

ekil 5.1:
Eriim tipi Anlam
public Snfn iinden, dndan ve tretilmi snflardan.
protected Snfn ve tretilmi snflarn iinden.
private Sadece snfn iinden.

Genel olarak snf iindeki btn niteliklerin private veya protected olarak tanmlanmas tav-
siye edilmektedir. Snf kullanacak olan yazlmclarn snf iinde bulunan niteliklere kendilerine
salanan balant noktalar zerinden erimesi get ve set metodlar yardmyla salanabilir.

rnek Uygulama 5.10:


1 public class BankaHesabi
2 {
3 public int hesapNumarasi;
4 public double bakiye;
5 public boolean ParaCek(double miktar)
6 {
7 if (miktar <= this.bakiye)
8 {
9 this.bakiye -= miktar;
10 return true;
11 }
12 else
13 {
14 return false;
15 }
16 }
17 public void ParaYatir(double miktar)
18 {
19 this.bakiye += miktar;
20 }
21}
22public class AnaProgram
23{
24 public static void main(String[] args)
25 {
26 BankaHesabi hesap = new BankaHesabi();
27 hesap.hesapNumarasi = 12003345;
28 hesap.ParaYatir(1500);
29 hesap.ParaCek(500);
30 hesap.bakiye -= 1500; // i aknn dna kld
31 }
32}
Kodun aklamas: BankaHesabi, hesap numaras ve bakiye verilerini tutan basit bir snf-
tr. Para ekmek iin ParaCek metodunun, para yatirmak iinse ParaYatir metodunun kulla-
nlmas ngrlmtr. BankaHesabi snf iindeki hesapNumarasi ve bakiye niteliklerinin
Yapsal Programlama 53

public olmasndan dolay, Main metodunda oluturulan bir BankaHesabi nesnesinin bakiye
deeri ParaCek veya ParaYatir metodlar kullanlmadan da deitirilebilir. Bakiyenin yetersiz
olmas durumunda bile istenen miktar hesaptan ekilebilmekte, bu nedenle i aknn doru ola-
rak gerekletirilmesi Main metodunu yazan kiiye bal olmaktadr.

Snfn aadaki ekilde tasarlanmas banka hesabyla ilgili i aknn tamamen BankaHesabi
snf iinde yer almasn salamaktadr:

rnek Uygulama 5.11:

1 public class BankaHesabi


2 {
3 private int hesapNumarasi;
4 private double bakiye;
5 public boolean ParaCek(double miktar)
6 {
7 if (miktar <= this.bakiye)
8 {
9 this.bakiye -= miktar;
10 return true;
11 }
12 else
13 {
14 return false;
15 }
16 }
17 public void ParaYatir(double miktar)
18 {
19 this.bakiye += miktar;
20 }
21 public int getHesapNumarasi()
22 {
23 return this.hesapNumarasi;
24 }
25 public void setHesapNumarasi(int hesapNo)
26 {
27 this.hesapNumarasi = hesapNo;
28 }
29 public double getBakiye()
30 {
31 return this.bakiye;
32 }
33}

34public class AnaProgram


35{
36 public static void main(String[] args)
54 Blm 5

37 {
38 BankaHesabi hesap = new BankaHesabi();
39 hesap.setHesapNumarasi(12003345);
40 hesap.ParaYatir(1500);
41 hesap.ParaCek(500);
42 // hesap.bakiye -= 1500;
43 }
44}

Kodun aklamas: BankaHesabi snfndaki hesapNumarasi ve bakiye niteliklerinin eri-


im kstlar private olarak deitirilmitir. Bylece bu alanlara dardan eriim engellenmitir.
hesapNumarasi niteliinin deeri getHesapNumarasi metodu zerinden, bakiye niteliinin
deeri getBakiye metodu zerinden okunabilmektedir. hesapNumarasi niteliine setHesap-
Numarasi metodu araclyla yeni bir deer atanabilmesine ramen bakiye deeri sadece Pa-
raCek ve ParaYatir metodlar kullanlarak deitirilebilmektedir. Bylece bakiye deiiklii i-
leminin arkasndaki i mant sadece ilgili metodlar yardmyla belirlenmekte ve snf kullanacak
olan yazlmcnn bu konu zerinde almasna gerek kalmamaktadr. Ana programdaki yorum
satr haline getirilmi olan kod paras derleme hatas vermektedir. Bu derleme hatasnn sebebi
bakiye alannn private olarak tanmlanm olmasdr.

.Net Platformu zerinde bulunan Property kavramnn Java Platformunda dorudan bir karl
bulunmamaktadr. Bunun yerine niteliin adnn bana get veya set szcklerinin eklenmesiyle
oluturulan metodlarn kullanlmas geleneksellemitir.

Kodun Tekrar Kullanm


Kodun tekrar kullanm, daha nce yazlm olan ve belirli bir ilemi gerekletiren kod bloklarnn
ayn projenin farkl bir yerinde veya baka bir projede kullanlmasdr. Bu ilem yazlmn gerek-
lenmesi aamasndaki kodlama maliyetlerini drd gibi sistemde yaplacak deiikliklerin
de daha dk maliyetle gerekletirilmesini salar. Yapsal programlama teknolojilerinde kodun
yeniden kullanm kavram bulunsa da, gereklenen ilevler fonksiyon baznda olduundan iki
farkl proje arasnda kod aktarm snrl kalr, genelde kodun nemli bir ksmnn veya hepsinin
yeniden yazlmas gerekir. Nesne ynelimli programlama teknolojilerinde ise temel amalardan
biri kodun yeniden kullanmn salayarak projelerin zaman ve i gc maliyetlerini mmkn
olduu kadar drmektir. Nesne ynelimli yaklamda kodun tekrar kullanm snf baznda ger-
eklenir ve daha nce oluturulmu olan snflar ayn proje iinde veya farkl projelerde esnek
olarak kullanlr.

Nesne ynelimli dillerde kodun tekrar kullanm birka farkl ekilde salanabilir:

1 Daha nce oluturulmu snflardan oluturulan nesneler uygulama iinde kullanlabilir.


2. Daha nce oluturulmu snflardan oluturulan nesneler yeni oluturulan snflarn iinde bu-
lunabilir ve bir snf deiik tiplerde ve saylarda nesne ierebilir. Bu ilikiye composition ad
verilir ve genel olarak sahip olma (has-a) ilikisi olarak tanmlanr.
3 Daha nce oluturulmu snflardan yeni snflarn tretilmesi ile ile uygulamann geniletilmesi
salanr. Bu kavram kaltm adn alr ve genel olarak olma (is-a) ilikisi olarak tanmlanr.

Kaltm
Kaltm; bir snfn daha nce oluturulmu baka bir snftan tretilmesidir. Kaltm sayesinde n-
ceden gereklenmi zelliklerin ve davranlarn yeniden gereklenmesine gerek kalmaz, kodun
tekrar kullanm salanm olur. ki farkl i kavramnn modellenmesi srasnda aralarnda kaltm
ilikisi olduuna karar vermek iin tretilecek olan snfn, temel snfn sahip olduu btn zel-
liklere sahip olduundan emin olmak gerekir. En basit yaklamla, iki farkl kavram arasnda olma
(is-a) ilikisi kurulabiliyorsa iki snf arasnda kaltm ilikisi vardr. Kaltm ilikisi uygulamann
Yapsal Programlama 55

ihtiyalarna gre iki veya daha fazla snf arasnda olmak zere tasarlanabilir. .Net Platformunda
olduu gibi Java Platformunda da oklu kaltm desteklenmez, bir snf sadece bir snftan treti-
lebilir.

rnek: Bir irketteki alanlar modellemek iin bir yazlm tasarladmz varsayalm.

lk aamada btn alanlarmz Calisan adl bir snf ile temsil edelim. Bu durumda btn
alan nesnelerimiz ayn snftan oluturulacai iin farkl alan tiplerine zel bilgilerin ve dav-
ranlarn Calisan snfndan oluturulan nesnelerde saklanmas mmkn olmaz.

rnek Uygulama 5.12: alan snfnn ilk hali


1 public class Calisan
2 {
3 private String ad;
4 private String soyad;
5 public Calisan(String ad, String soyad)
6 {
7 this.ad = ad;
8 this.soyad = soyad;
9 }
10}
Tasarladmz uygulamay biraz daha gelitirerek farkl alan tiplerini temsil etmek zere zel-
lemi alan snflar oluturabiliriz. private eriim tipine sahip alanlarn eriim tipini protec-
ted olarak deitirirsek bu niteliklere tretilmi snflardan ulalmasn da salarz.

rnek Uygulama 5.13:

1 public class Calisan


2 {
3 protected String ad;
4 protected String soyad;
5
6 public Calisan(String ad, String soyad)
7 {
8 this.ad = ad;
9 this.soyad = soyad;
10 }
11}

12public class Muhendis extends Calisan


13{
14 protected String[] projeler;
15 protected String departman;
16 protected int projeSayisi;
17 public Muhendis(String ad, String soyad, String departman)
18 {
19 super(ad, soyad);
20 this.departman = departman;
56 Blm 5

21 this.projeler = new String[5];


22 this.projeSayisi = 0;
23 }
24 public void ProjeEkle(String proje)
25 {
26 projeler[projeSayisi] = proje;
27 projeSayisi++;
28 }
29}

Calisan snfnda sadece niteliklerin eriim tipini protected olarak deitirdik ve yeni ekle-
nen Muhendis snfnn Calisan snfndan tremesini extends anahtar kelimesi ile saladk.
extends anahtar kelimesi, C# dilindeki : operatrnn karldr. Muhendis snfnn iinde
bulunan projeler adndaki string dizisi ile belirli bir mhendisin zerinde alt projeleri tutu-
yoruz ve ProjeEkle metodu yardmyla belirli bir mhendisin projelerine ekleme yapabiliyoruz.

Muhendis snfmzn yapc metodu ad, soyad ve departman olmak zere tane parametre
alr. Departman parametresi Muhendis snf iindeki departman niteliine ilk deer vermek iin
kullanlrken ad ve soyad parametreleri super anahtar kelimesi yardmyla temel snf olan
Calisan snfnn yapc metodunu altrmak iin kullanlr. Muhendis snfnda super(ad,
soyad) komutuyla Calisan snfnn yapc metodunu armazsak derleme hatas alrz. Bu-
nun sebebi tretilmi snflardan nesne oluturulurken srasyla temel ve tretilmi snflarn yapc
metodlarnn arlmasdr. rnek Uygulama 5.14, temel ve tretilmi snflarda yapc metodlarn
almasn gstermektedir:

rnek Uygulama 5.14:


1 public class TemelSinif
2 {
3 public TemelSinif()
4 {
5 System.out.println(Temel snfn yapc metodu alt);
6 }
7 }

8 public class TuretilmisSinif extends TemelSinif


9 {
10 public TuretilmisSinif()
11 {
12 System.out.println(Tretilmi snfn yapc metodu
alt);
13 }
14}

15public class AnaProgram


16{
17 public static void main(String[] args)
18 {
Yapsal Programlama 57

19 TuretilmisSinif turetilmisNesne = new


TuretilmisSinif();
20 }
21}

Program altrldnda ekranda kan mesajlar u ekildedir:

Temel snfn yapc metodu alt


Tretilmi snfn yapc metodu alt

alan modelimizi biraz daha genileterek mhendisleri branlarna gre farkl snflara ayrrsak
ve bir Muhasebeci snf eklersek snflarn son hali aadaki gibi olur.

rnek Uygulama 5.15:

1 public class Calisan


2 {
3 protected String ad;
4 protected String soyad;
5 public Calisan(String ad, String soyad)
6 {
7 this.ad = ad;
8 this.soyad = soyad;
9 }
10}

11public class Muhendis extends Calisan


12{
13 protected String[] projeler;
14 protected String departman;
15 protected int projeSayisi;
16 public Muhendis(String ad, String soyad, String departman)
17 {
18 super(ad, soyad);
19 this.departman = departman;
20 this.projeler = new String[5];
21 this.projeSayisi = 0;
22 }
23 public void ProjeEkle(String proje)
24 {
25 projeler[projeSayisi] = proje;
26 projeSayisi++;
27 }
28}

29public class BilgisayarMuhendisi extends Muhendis


30{
31 protected String[] programlamaDilleri;
58 Blm 5

32 protected int programlamaDiliSayisi;


33 public BilgisayarMuhendisi(String ad, String soyad, String
departman)
34 {
35 super(ad, soyad, departman);
36 this.programlamaDilleri = new String[5];
37 this.programlamaDiliSayisi = 0;
38 }
39 public void ProgramlamaDiliEkle(String programlamaDili)
40 {
41 programlamaDilleri[programlamaDiliSayisi] =
programlamaDili;
42 programlamaDiliSayisi++;
43 }
44}

45public class MakinaMuhendisi extends Muhendis


46{
47 private String[] modellemeProgramlari;
48 private int modellemeProgramiSayisi;
49 public MakinaMuhendisi(String ad, String soyad, String
departman)
50 {
51 super(ad, soyad, departman);
52 this.modellemeProgramlari = new String[5];
53 this.modellemeProgramiSayisi = 0;
54 }
55 public void ModellemeProgramiEkle(String
modellemeProgrami)
56 {
57 modellemeProgramlari[modellemeProgramiSayisi] =
modellemeProgrami;
58 modellemeProgramiSayisi++;
59 }
60}

61public class Muhasebeci extends Calisan


62{
63 private String[] muhasebeProgramlari;
64 private int muhasebeProgramiSayisi;
65 public Muhasebeci(String ad, String soyad)
66 {
67 super(ad, soyad);
68 this.muhasebeProgramlari = new String[5];
69 this.muhasebeProgramiSayisi = 0;
Yapsal Programlama 59

70 }
71 public void MuhasebeProgramiEkle(String muhasebeProgrami)
72 {
73 muhasebeProgramlari[muhasebeProgramiSayisi] =
muhasebeProgrami;
74 muhasebeProgramiSayisi++;
75 }
76 public void MuhasebeProgramiEkle(String muhasebeProgrami)
77 {
78 if (!muhasebeProgramlari.contains(muhasebeProgrami))
79 muhasebeProgramlari.add(muhasebeProgrami);
80 }
81}

ok ekillilik (Polymorphism)
ok ekillilik, bir nesnenin alma aamasnda hangi tipten olduunu bilmesi ve kendi tipine
gre davran sergilemesidir. Oluturduumuz i modeli erevesinde bir mdr ve bu mdre
bal alanlar bulunduunu ve btn alanlarn rapor verme kabiliyetine sahip olduunu var-
sayalm. Mdr ayn anda btn alanlardan kendisine haftalk rapor vermelerini istediinde
aadaki iki yntemle istekte bulunabilir:

1 Yaln Bey Bilgisayar Mhendislii ile ilgili rapor gndersin, Erkut Bey muhasebecilikle ilgili
rapor gndersin.
2. Btn alanlar rapor gndersin.
3 Rapor isteme-gnderme mekanizmasnn ilevsel olmas iin ikinci senaryonun kullanlmas-
nn daha mantkl olduunu syleyebiliriz. irket mdr btn alanlarndan rapor isterken
tek tek yaptklar ie gre rapor isteyecek olursa bunun gereksiz zaman kaybna yol aaca
rahatlkla gzlenebiliyor.
ok ekillilik, ikinci senaryomuzu gerekleyen yapdr. Gerek hayattaki mhendislerin ve mu-
hasebecilerin hangi ii yaptklarn bilmeleri gibi, nesne ynelimli yazlmda da nesneler alma
aamasnda hangi ii nasl yaptklarn bilirler ve ona gre davranrlar. Bu durumda rapor verme
davran farkl nesne tiplerine gre farkl ekillerde alabildiinden ok ekilli bir davrantr.

.Net ortamnda metodlarn ok ekillilii desteklemesi iin virtual olarak tanmlanmas gerekir,
Java ortamnda ise metodlar varsaylan olarak ok ekillilii destekler. ok ekillilik yaps sadece
kaltm ilikisi iinde olan snflar arasnda kullanlabilir.

rneimizin ok ekillilii destekleyen hali rnek Uygulama 5.16daki gibi olacaktr:

rnek Uygulama 5.16:


1 public class Calisan
2 {
3 protected String ad;
4 protected String soyad;
5 public Calisan(String ad, String soyad)
6 {
7 this.ad = ad;
8 this.soyad = soyad;
9 }
60 Blm 5

10 public void RaporVer()


11 {
12 System.out.println(Ad: + ad + Soyad: +
soyad);
13 }
14}

15public class Muhendis extends Calisan


16{
17 protected String[] projeler;
18 protected String departman;
19 protected int projeSayisi;
20 public Muhendis(String ad, String soyad, String departman)
21 {
22 super(ad, soyad);
23 this.departman = departman;
24 this.projeler = new String[5];
25 this.projeSayisi = 0;
26 }
27 public void ProjeEkle(String proje)
28 {
29 projeler[projeSayisi] = proje;
30 projeSayisi++;
31 }
32 public void RaporVer()
33 {
34 super.RaporVer();
35 System.out.println(Departman: + departman);
36 System.out.println(Projeler: );
37 for (int i = 0; i < projeSayisi; i++)
38 {
39 System.out.println(\t + projeler[i]);
40 }
41 }
42}

43public class BilgisayarMuhendisi extends Muhendis


44{
45 protected String[] programlamaDilleri;
46 protected int programlamaDiliSayisi;
47 public BilgisayarMuhendisi(String ad, String soyad, String
departman)
48 {
49 super(ad, soyad, departman);
50 this.programlamaDilleri = new String[5];
Yapsal Programlama 61

51 this.programlamaDiliSayisi = 0;
52 }
53 public void ProgramlamaDiliEkle(String programlamaDili)
54 {
55 programlamaDilleri[programlamaDiliSayisi] =
programlamaDili;
56 programlamaDiliSayisi++;
57 }
58 public void RaporVer()
59 {
60 super.RaporVer();
61 System.out.println(Grev: Bilgisayar Mhendisi);
62 System.out.println(Programlama Dilleri: );
63 for (int i = 0; i < this.programlamaDiliSayisi; i++)
64 {
65 System.out.println(\t +
programlamaDilleri[i] + );
66 }
67 }
68}

69public class MakinaMuhendisi extends Muhendis


70{
71 private String[] modellemeProgramlari;
72 private int modellemeProgramiSayisi;
73 public MakinaMuhendisi(String ad, String soyad, String
departman)
74 {
75 super(ad, soyad, departman);
76 this.modellemeProgramlari = new String[5];
77 this.modellemeProgramiSayisi = 0;
78 }
79 public void ModellemeProgramiEkle(String
modellemeProgrami)
80 {
81 modellemeProgramlari[modellemeProgramiSayisi] =
modellemeProgrami;
82 modellemeProgramiSayisi++;
83 }
84 public void RaporVer()
85 {
86 super.RaporVer();
87 System.out.println(Grev: Makina Mhendisi);
88 System.out.println(Modelleme Programlar: );
89 for (int i = 0; i < modellemeProgramiSayisi; i++)
62 Blm 5

90 {
91 System.out.println(\t +
modellemeProgramlari[i] + );
92 }
93 }
94}

95public class Muhasebeci extends Calisan


96{
97 private String[] muhasebeProgramlari;
98 private int muhasebeProgramiSayisi;
99 public Muhasebeci(String ad, String soyad)
100 {
101 super(ad, soyad);
102 this.muhasebeProgramlari = new String[5];
103 this.muhasebeProgramiSayisi = 0;
104 }
105 public void MuhasebeProgramiEkle(String muhasebeProgrami)
{
106 muhasebeProgramlari[muhasebeProgramiSayisi] =
muhasebeProgrami;
107 muhasebeProgramiSayisi++;
108 }
109 public void RaporVer()
110 {
111 super.RaporVer();
112 System.out.println(Grev: Muhasebeci);
113 System.out.println(Muhasebe Programlar: );
114 for (int i = 0; i < muhasebeProgramiSayisi; i++)
115 {
116 System.out.println(\t +
muhasebeProgramlari[i]);
117 }
118 }
119}

120public class Mudur


121{
122 private Calisan[] calisanlar;
123 private int calisanSayisi;
124 public Mudur()
125 {
126 this.calisanlar = new Calisan[5];
127 this.calisanSayisi = 0;
128 }
Yapsal Programlama 63

129 public void CalisanEkle(Calisan calisan)


130 {
131 calisanlar[calisanSayisi] = calisan;
132 calisanSayisi++;
133 }
134 public void RaporIste()
135 {
136 for (int i = 0; i < calisanSayisi; i++)
137 {
138 calisanlar[i].RaporVer();
139 System.out.println();
140 }
141 }
142}

143public class AnaProgram


144{
145 public static void main(String[] args)
146 {
147 BilgisayarMuhendisi blgMuh = new BilgisayarMuhendisi
(Yaln, Kaya, IT);
148 blgMuh.ProgramlamaDiliEkle(Java);
149 blgMuh.ProgramlamaDiliEkle(C#);
150 MakinaMuhendisi mknMuh = new
MakinaMuhendisi(Hasan, Polat, Bakm);
151 mknMuh.ModellemeProgramiEkle(Katia);
152 Muhasebeci muhasebeci = new Muhasebeci(Erkut,
Kutlar);

153 Mudur genelMudur = new Mudur();


154 genelMudur.CalisanEkle(blgMuh);
155 genelMudur.CalisanEkle(mknMuh);
156 genelMudur.CalisanEkle(muhasebeci);
157 genelMudur.RaporIste();
158 }
159}

Program altrldnda aadaki gibi bir kt retir:

Ad: Yaln Soyad: Kaya


Departman: IT
Projeler:
Grev: Bilgisayar Mhendisi
Programlama Dilleri:
Java
C#
64 Blm 5

Ad: Hasan Soyad: Polat


Departman: Bakm
Projeler:
Grev: Makina Mhendisi
Modelleme Programlar:
Katia

Ad: Erkut Soyad: Kutlar


Grev: Muhasebeci
Muhasebe Programlar:

Mudur snfnn iinde, alanlar tutmak iin Calisan snf cinsinden bir dizi kullandk. Ana
programda oluturduumuz tane farkl tipte alan (bilgisayar mhendisi, makina mhendi-
si, muhasebeci) mdr nesnemizin alanlarna ekledik. Mudur snfnn RaporIste metodu
butun alanlardan rapor istemek amacyla yazld. Mdr nesnesinin RaporIste metodunu
altrdmzda btn alan nesnelerinin kendi tiplerine ait raporlar oluturduunu gryoruz.
Raporlarn doru bir ekilde olumas RaporVer metodunun ok ekilli olduunu gsterir. Mdr
snfnda btn alan bilgilerinin Calisan snfndan oluan bir dizide tutulmasndan dolay
derleme aamasnda alanlarn tipi belli deildir. Eer RaporVer metodu ok ekilli olmasayd,
mdr nesnesinin RaporIste metodu arldnda alanlarn hepsi derleme aamasnda ol-
duu gibi alma aamasnda da temel Calisan snfnn raporunu oluturacakt.
6 Swing
6 Swing
Swinge Giri

Klavye Eventlerinin Ynetilmesi


Swing
Java platformunun 1.0 versiyonunda grsel kullanc arayzleri oluturmak iin AWT (Abstract
Windowing Toolkit) teknolojisi kullanlyordu. AWTnin temel amac Java programlarnn arayz-
lerini iletim sisteminden bamsz hale getirmek olsa da bu amaca ulalamad. AWT paketinin
iinde bulunan bileenler iletim sistemine baml olduundan farkl iletim sistemleri zerinde
fakl grnmlere sahip olan programlar ortaya kt. Java platformunun 2.0 versiyonuyla birlikte
AWT paketinin zerine Swing ad verilen yeni grsel programlama modeli de eklendi. Swing pa-
keti Java ile yazlm olmasnn da etkisiyle letim sisteminden bamsz bir grsel programlama
modeli sunar. Yeni gelitirilen Java uygulamalarnda Swing paketinin kullanlmas uygulamann
grsel arayznn gl olmas iin arttr.

Bu blmde Java platformunda bulunan Swing paketinin genel zellikleri ve bu paketin iinde
bulunan temel arayz kontrolleri anlatlacaktr. Swing bu blmde anlatlanlarla snrl deildir,
zellikle karmak kullanc etkileimi gerektiren Java uygulamalarnn gelitirebilmesi iin Swing
teknolojisinin detayl olarak incelenmesi gerekir.

Swinge Giri
.Net platformunda Windows uygulamalar gelitirirken kullandmz kontrollerin benzerleri Java
platformunda da vardr. Swing kontrolleri eitli olaylar (event) tetikleyerek uygulama arayzy-
le kullancnn etkileim halinde olmasna olanak tanr. Uygulamada kullanlan kontroller eitli
containerlar (saklayc) yardimiyla gruplanabilir. Java platformuyla iletim sistemi zerinde a-
lan uygulamalar oluturmak iin uygulamann grsel arayzn temsil edecek snfn JFrame
snfndan tretilmesi gerekir. JFrame snfnn iinde bulunan ve yeni oluturulan snflara ka-
ltmla aktarlan getContentPane metodu kullanlarak uygulamada bulunan kontrolleri ieren
Container nesnesine eriilir. Men kontrolleri dndaki btn kontroller Container nesnesi
iinde bulunur ve Container nesnesi hibir zaman null (bo) deer almaz.

Container nesnesinin setLayout metodu uygulama arayznde kullanlacak yerleim


dzenini(layout) belirlemek iin kullanlr. Layout seenekleri ilerleyen sayfalarda anlatlacaktr.
Bo bir arayz oluturan Java kodu rnek Uygulama 6.1de verilmitir:

rnek Uygulama 6.1:

1 import java.awt.Container;
2 import java.awt.FlowLayout;
3 import javax.swing.JFrame;
4 public class IlkOrnek extends JFrame
5 {
6 public IlkOrnek()
7 {
8 super(lk rnek);
9 Container container = getContentPane();
10 container.setLayout(new FlowLayout());
11 setSize(200, 200);
12 setVisible(true);
13}
14public static void main(String[] args)
15{
16 IlkOrnek test = new IlkOrnek();
17 test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
68 Blm 6

18}
19}

Kodun aklamas: IlkOrnek isimli snfmz JFrame snfndan tretilmitir. Yapc metod iin-
de JFrame snfnn yapc metodu super(lk rnek) kod blouyla altrlr, oluan ekrann
balnda lk rnek metni bulunur. Container nesnesi getContentPane metodu ile yukar-
da akland gibi alnr. Forma baka kontroller de ekleyecek olursak bu kontrolleri Container
nesnesinin iine veya Container nesnesinin iinde bulunan bir nesneye eklememiz gerekir. Uy-
gulamann almas srasnda formun grnr hale gelmesi iin boyutunu vermemiz ve setVi-
sible metodunu kullanarak formu grnr hale getirmemiz
gereklidir. Main metodunun iinde, yazdmz snftan bir
nesne oluturarak formun olumasn salarz. JFrame s-
nfndan tretilmi olan arayzn kullanc tarafndan kapa-
tlmas durumunda uygulamann sonlandrlmasnn salan-
mas iin test.setDefaultCloseOperation(JFrame.
EXIT_ON_CLOSE); kod blounu Main metoduna ekleriz.
Bu satr eklemezsek, uygulama kapatldnda varsaylan
ilem olarak form grnmez hale gelindii halde uygulama
kapanmaz. Swing ile ilgili btn rneklerde yukarda verilen
kodu kullanacaz.

Uygulama altrldnda oluan arayz ekil 1deki gibi-


ekil 1 dir.

JButton
.Net platformundaki Button kontrolnn karl Java platformundaki JButton kontroldr. Te-
mel olarak zerinde bir metin yazl olabilen ve kullanc tarafndan zerine tklandnda event
oluturan bir yapya sahiptir. Form zerinde bir buton oluturmak iin JButton snfndan bir
nesne yaratlr ve Container nesnesine eklenir. JButton snfnn yapc metodu butonun ze-
rinde grntlenecek metni parametre olarak alr. JButton nesnesi oluturan ve formun zerine
ekleyen kod rnek Uygulama 6.2de gsterilmitir.

rnek Uygulama 6.2:

1 import java.awt.Container;
2 import java.awt.FlowLayout;
3 import javax.swing.JButton;
4import javax.swing.JFrame;
5 public class JButtonTest extends JFrame
6 {
7 private JButton btnTest;
8 public JButtonTest()
9 {
10 super(JButton rnei);
11 Container container = getContentPane();
12 container.setLayout(new FlowLayout());
13 btnTest = new JButton(rnek Buton);
14 container.add(btnTest);
15 setSize(200, 200);
16 setVisible(true);
17 }
Swing 69

18 public static void main(String[] args)


19 {
20 JButtonTest test = new JButtonTest();
21 test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
22 }
23}

Kodun aklamas: Formu oluturan kod bloklarndan farkl olarak bir adet JButton nesnesi
oluturan ve Container nesnesine ekleyen kod satrlar yukardadr. JButton snfnn yapc
metoduna parametre olarak butonun zerinde bulunmasn
istediimiz metni veririz. Container nesnesinin add me-
todu herhangi bir kontroln Container iine eklenmesini
salar. Uygulama altrldnda ekil 2deki gibi bir arayz
oluur.
Oluturduumuz butona henz bir event eklemediimiz iin
butonun herhangi bir ilevi yoktur.

JLabel
JLabel kontrol, .Net ortamndaki Label kontrolnn kar-
ldr. Uygulama zerinde metin grntlemek istediimiz
noktalarda kullanlr. Bir JLabel kontrolnn uygulama ze-
rinde grnr hale gelmesi iin bir JLabel nesnesi olutu- ekil 2
rup Container nesnesine eklememiz yeterlidir. rnek kod
rnek Uygulama 6.3de verilmitir.

rnek Uygulama 6.3:

1 import java.awt.Container;
2 import java.awt.FlowLayout;
3 import javax.swing.JFrame;
4 import javax.swing.JLabel;
5 public class JLabelTest extends JFrame
6 {
7 private JLabel lblTest;
8 public JLabelTest()
9 {
10 super(JLabel Kullanm);
11 Container container = getContentPane();
12 container.setLayout(new FlowLayout());
13 lblTest = new JLabel(JLabel rnei);
14 container.add(lblTest);
15 setSize(200, 200);
16 setVisible(true);
17 }
18 public static void main(String[] args)
19 {
20 JLabelTest test = new JLabelTest();
21 test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
22 }
23}
70 Blm 6

Kodun aklamas: lblTest adndaki JLabel nesnesin yapc metoduna parametre olarak
zerinde grntlenecek metin verilmitir. Container nesnesinin add metodu kullanlarak JLa-
bel nesnesinin form zerinde grntlenmesi salanmtr. Label zerindeki metni uygulama-
nn alma aamasnda deitirmek iin setText metodu,
label zerindeki metni almak iin getText metodu kul-
lanlr. Bu iki metodun kullanmyla ilgili rnei daha sonra
vereceiz. Uygulama altrld zaman ekil 3de olduu
gibi grnr.

JTextField
JTextField kontrol, .Net ortamndaki TextBox kontrol-
ln Java ortamndaki karldr. Kullanc tarafndan girile-
cek metin trnden bilgileri uygulamaya aktarmak amacyla
kullanlr. Bir JTextField kontrolnn uygulama zerinde
grnr hale gelmesi iin bir JTextField nesnesi olutu-
ekil 3 rup Container nesnesine eklememiz yeterlidir. rnek kod,
rnek Uygulama 6.4te verilmitir.

rnek Uygulama 6.4:

1 import java.awt.Container;
2 import java.awt.FlowLayout;
3 import javax.swing.JFrame;
4 import javax.swing.JLabel;
5 import javax.swing.JTextField;
6 public class JTextFieldTest extends JFrame
7 {
8 private JTextField txtTest;
9 public JTextFieldTest()
10 {
11 super(JTextField Kullanm);
12 Container container = getContentPane();
13 container.setLayout(new FlowLayout());
14 txtTest = new JTextField(JTextField rnei);
15 container.add(txtTest);
16 setSize(200, 200);
17 setVisible(true);
18 }
19 public static void main(String[] args)
20 {
21 JTextFieldTest test = new JTextFieldTest();
22 test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
23 }
24}

Kodun aklamas: txtTest adndaki JTextField nesnesin yapc metoduna parametre ola-
rak zerinde grntlenecek metin verilmitir. Container nesnesinin add metodu kullanlarak
JTextField nesnesinin form zerinde grntlenmesi salanmtr. JTextField zerindeki
metni uygulamann alma aamasnda deitirmek iin setText metodu, label zerindeki
Swing 71

metni almak iin getText metodu kullanlr. Bu iki metodun kullanmyla ilgili rnei daha sonra
vereceiz. Uygulama altrld zaman ekil 4teki gibi grnr.

ekil 4

Event Handling Mekanizmas


Kullanclarn Swing kontrolleri araclyla uygulamayla iletiim kurmas sonucunda eitli
eventler (olaylar) oluur. Bu eventleri kontrol etmek (handle) iin .Net ortamndan farkl olarak
event snflar kullanmamz gerekir. Java ortamnda hereyi snflar halinde kullanmak gibi bir
ama olduundan event handling mekanizmas .Net ortamndakinden farkldr. Net uygulama-
larnda herhangi bir event iin bir tane metod yazmak yeterli olurken Javada bu ilem iin harici
veya dahili (inner class) bir snf yazarak eitli event tipleri iin zellemi event interfacelerini
implemente etmemiz gerekir. Herhangi bir event birden fazla Swing kontrol tarafndan kulla-
nlabilir, boyle bir kullanmda eventin hangi kontrol zerinden olutuunu renmek iin event
parametreleri kullanlr. JLabel, JTextField ve JButton kontrolleriyle birlikte event mekaniz-
masini rnek kodu, rnek Uygulama 6.5 zerinden inceleyelim:

rnek Uygulama 6.5:


1 import java.awt.Container;
2 import java.awt.FlowLayout;
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import javax.swing.JButton;
6 import javax.swing.JFrame;
7 import javax.swing.JLabel;
8 import javax.swing.JTextField;
9 public class EventMekanizmasi extends JFrame
10{
11 private JLabel lblGoruntule;
12 private JTextField txtGiris;
13 private JButton btnGoruntule;
14 public EventMekanizmasi()
15 {
16 super(Event Mekanizmas);
17 Container container = getContentPane();
18 container.setLayout(new FlowLayout());
19 txtGiris = new JTextField(JTextField);
72 Blm 6

20 container.add(txtGiris);
21 btnGoruntule = new JButton(Grntle);
22 container.add(btnGoruntule);
23 btnGoruntule.addActionListener(new ButtonHandler());
24 lblGoruntule = new JLabel(JLabel);
25 container.add(lblGoruntule);
26 setSize(400, 200);
27 setVisible(true);
28 }
29 private class ButtonHandler implements ActionListener
30 {
31 public void actionPerformed(ActionEvent e)
32 {
33 lblGoruntule.setText(txtGiris.getText());
34 }
35 }
36 public static void main(String[] args)
37 {
38 EventMekanizmasi test = new EventMekanizmasi();
39 test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
40 }
41}

Kodun aklamas: EventMekanizmasi snfnn yapc metodunda daha nce yaptmz gibi
JLabel, JTextField ve JButton nesnelerini oluturduk ve Container nesnesine ekledik.

EventMekanizmasi snfnn iindeki private eriim tipine sahip ButtonHandler snfnn


ActionListener interfaceini implemente etmesi, bu snfn iinde actionPerformed me-
todunun yazlmasn zorunlu klar. Bu metod, Action cinsinden bir event olutuunda alr.
JButton nesnesi zerinde altrdmz addActionListener metodunu buton ile eventi
ilikilendirmek iin kullandk, bu durumda buton kullanc tarafndan tklandnda ButtonHand-
ler snfndaki actionPerformed metodu alacaktr. actionPerformed metodunun iinde
txtGiris nesnesinin getText metodunu kullanarak kullanc tarafndan girilen metni alp lbl-
Goruntule nesnesinin setText metodu ile JLabel kontrolnn metnine atyoruz.

Ayn ilevi, event handler snfn dahili olarak tanmlayarak da gerekleyebiliriz. Event handler
snfnn dahili olarak gereklenmesini gsteren kod blou rnek Uygulama 6.6daki gibidir.

rnek Uygulama 6.6:

1 import java.awt.Container;
2 import java.awt.FlowLayout;
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import javax.swing.JButton;
6 import javax.swing.JFrame;
7 import javax.swing.JLabel;
8 import javax.swing.JTextField;
9 public class EventMekanizmasi extends JFrame
Swing 73

10{
11 private JLabel lblGoruntule;
12 private JTextField txtGiris;
13 private JButton btnGoruntule;
14 public EventMekanizmasi()
15 {
16 super(Event Mekanizmas);
17 Container container = getContentPane();
18 container.setLayout(new FlowLayout());
19 txtGiris = new JTextField(JTextField);
20 container.add(txtGiris);
21 btnGoruntule = new JButton(Grntle);
22 container.add(btnGoruntule);
23 btnGoruntule.addActionListener
24 (
25 new ActionListener()
26 {
27 public void actionPerformed(ActionEvent
event)
28 {
29 lblGoruntule.setText(txtGiris.getText());
30 }
31 }
32 );
33 lblGoruntule = new JLabel(JLabel);
34 container.add(lblGoruntule);
35 setSize(400, 200);
36 setVisible(true);
37 }
38 public static void main(String[] args)
39 {
40 EventMekanizmasi test = new EventMekanizmasi();
41 test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
42 }
43}

Her iki kod blou da ayn ekilde alr. Kullancnn metin kutusuna yazd metin butona tklan-
dktan sonra label zerinde grntlenir. Uygulama altrldnda butona tklamadan nce ve
sonraki grnmler ekil 5 ve ekil 6daki gibidir.
74 Blm 6

ekil 5 ekil 6

JTextArea
JTextArea kontrol, .Net ortamndaki RichTextBox kontrolnn karldr. JTextField
kontrolnden daha geni kullanm kabiliyetlerine sahiptir ve birden fazla satrdan oluan metinle-
rin girilmesine olanak verir. Append metodu yardmyla zerine metin eklemesi yaplabilir. Girilen
metnin kontroln boyutlarndan byk olmas durumunda bir alt satra gemek iin setLineWrap
metodu kullanlr. JTextArea kontrolnn rnek kullanm rnek Uygulama 6.7de verilmitir.

rnek Uygulama 6.7:


1 import java.awt.Container;
2 import java.awt.FlowLayout;
3 import javax.swing.JFrame;
4 import javax.swing.JTextArea;
5 public class JTextAreaTest extends JFrame
6 {
7 private JTextArea txtArea;
8 public JTextAreaTest()
9 {
10 super(JTextArea Kullanm);
11 Container container = getContentPane();
12 container.setLayout(new FlowLayout());
13 txtArea = new JTextArea(JTextArea alanna birden
fazla satirdan oluan metin girilebilir.);
14 txtArea.append(\nYeni metin eklenebilir);
15 txtArea.setLineWrap(true);
16 txtArea.setSize(150, 150);
17 container.add(txtArea);
18 setSize(200, 200);
19 setVisible(true);
20 }
21 public static void main(String[] args)
22 {
23 JTextAreaTest test = new JTextAreaTest();
24 test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
25 }
26}
Swing 75

Kodun aklamas: JTextArea nesnesini oluturulup Container nesnesine ekledikten sonra


append metodu ile zerine yeni metin ekledik. Append metodunun iinde kullandmz \n ka-
rakteri metnin bir alt satra gemesini salar. setLineWrap(true) komutuyla metnin kontroln
geniliinden fazla yer kaplamas durumunda otomatik olarak bir alt satra gemesi salanmtr.
setSize metodu ile kontroln x ve y boyutu 150 olarak atanmtr. Uygulama altrldnda
ekil 7deki gibi bir arayz oluur.

JOptionPane
JOptionPane snf, .Net ortamnda bulunan MessageBox
snfnn Java karldr. MessageBox.Show() metoduna
benzer bir ekilde alan birok statik metod ierir. Aray-
zn alma mant iinde eitli mesajlar kullancya gs-
termek ve onay almak amacyla kullanlr. Gsterilen onay
kutusu uygulamay oluturan formun dnda ayr bir pence-
re iinde oluur. Bir JOptionPane onay kutusunu kullan-
cnn karsna kartan ve kullancnn onay durumuna gre
bir tane JOptionPane mesaj diyalou gsteren kod rnek
Uygulama 6.8de verilmitir. ekil 7

rnek Uygulama 6.8:


1 import java.awt.Container;
2 import java.awt.FlowLayout;
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import javax.swing.JButton;
6 import javax.swing.JFrame;
7 import javax.swing.JOptionPane;
8 public class JOptionPaneTest extends JFrame
9 {
10 private JButton btnOnay;
11 public JOptionPaneTest()
12 {
13 Super(JOptionPane);
14 Container container = getContentPane();
15 container.setLayout(new FlowLayout());
16 btnOnay = new JButton(Onay al);
17 btnOnay.addActionListener(new ButtonHandler());
18 container.add(btnOnay);
19 setSize(200, 200);
20 setVisible(true);
21 }
22 private class ButtonHandler implements ActionListener
23 {
24 public void actionPerformed(ActionEvent event)
25 {
26 int secim = JOptionPane.
showConfirmDialog(null, Seiminizi onaylyor musunuz?, Onay
ekran, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_
MESSAGE);
76 Blm 6

27 if(secim == JOptionPane.YES_OPTION)
28 JOptionPane.showMessageDialog(null,
Onayland, Onay, JOptionPane.INFORMATION_MESSAGE);
29 else if(secim == JOptionPane.NO_OPTION)
30 JOptionPane.showMessageDialog(null,
Onaylanmad, Red, JOptionPane.ERROR_MESSAGE);
31 else
32 JOptionPane.showMessageDialog(null,
Onaylanmad, ptal, JOptionPane.WARNING_MESSAGE);
33 }
34 }
35 public static void main(String[] args)
36 {
37 JOptionPaneTest test = new JOptionPaneTest();
38 test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
39 }
40}

Kodun aklamas: Formun zerine bir tane buton ekledik ve bu buton iin ActionListener
interfaceini implemente eden ButtonHandler adnda bir event snf yazdk. Kullanc tara-
fndan butona tklanmas durumunda actionPerformed metodu alr ve kullancya JOp-
tionPane.showConfirmDialog metodu yardmyla onay verip vermedii sorulur. Bu statik
metodun ikinci parametresi onay kutusunda grntlenmesini istediimiz metin, nc para-
metresi ise onay kutusunun baln oluturan metindir. Drdnc parametrede onay kutusunda
hangi butonlarn grntlenmesini istediimizi belirttik. Yaptmz rnekte Yes, No ve Cancel
butonlarnn grntlenmesini istedik. Kullancnn herhangi bireyi onaylamasn istediimiz iin
soru iareti eklinde bir resim kullanmak duruma uygun olduundan beinci parametrede soru
mesaj seeneini setik. Javadaki birok metod parametresinde olduu gibi JOptionPane.
showConfirmDialog metodunun parametrelerinde de snfn zerinde bulunan deerleri kulla-
nabildiimiz gibi istersek bu deerlerin tam say karlklarn da kullanabiliriz. Metodun geri dn
deerinin tam say(int) olduuna dikkat edelim. Bu geri dn deerini secim isimli bir tam say
deikenine atarak bir sonraki aamada seime gre bir ilem yaplmasn salayabiliriz.

Sonraki aamada, onay durumuna gre deien bir simgeye, balk metnine ve mesaj kutusu
metnine sahip bir mesaj kutusunu kullancya gsteriyoruz.

Uygulama altrldnda grnen arayz, butona tkland zaman grntlenen onay kutusu
ve eitli seimlere gre grntlenen mesaj kutular ekil 8, ekil 9, ekil 10, ekil 11 ve ekil
12de gsterildii gibidir.

ekil 8: Programn ilk almas. ekil 9: Onay ekran.


Swing 77

ekil 10: Yes butonuna tkland. ekil 11: No butonuna tkland.

ekil 12: ptal butonuna tkland.

JCheckBox
JCheckBox snf, .Net platformunda bulunan CheckBox snfnn Java ortamndaki karldr.
Seili durumda olabilen kk bir kutudan ve yannda bulunan bir Labeldan oluan JCheck-
Box, kullancnn temel ak/kapal seimi yapmasn salayan basit bir arayz kontroldr. Be-
lirli bir zamanda nesnenin seili olup olmad kontrol edilebilir, seim deitiinde bir eventin
tetiklenmesi salanabilir, seili olma durumu deitirilebilir. JCheckBox kontrolnn kullanmn
gsteren kod blou rnek Uygulama 6.9da verilmitir.

rnek Uygulama 6.9:

1 import java.awt.Container;
2 import java.awt.FlowLayout;
3 import java.awt.GridLayout;
4 import java.awt.event.ActionEvent;
5 import java.awt.event.ActionListener;
6 import java.awt.event.ItemEvent;
7 import java.awt.event.ItemListener;
8 import javax.swing.JButton;
9 import javax.swing.JCheckBox;
10 import javax.swing.JFrame;
11 import javax.swing.JLabel;
12 import javax.swing.JOptionPane;
13 import javax.swing.JTextField;
14 public class JCheckBoxTest extends JFrame
15 {
16 private JCheckBox chkKabul;
17 private JLabel lblAd;
18 private JLabel lblSoyad;
19 private JTextField txtAd;
20 private JTextField txtSoyad;
21 private JButton btnKaydet;
22 public JCheckBoxTest()
23 {
24 super(Kullanc kayt formu);
25 Container container = getContentPane();
78 Blm 6

26 container.setLayout(new FlowLayout());
27 lblAd = new JLabel(Ad: );
28 container.add(lblAd);
29 txtAd = new JTextField(10);
30 container.add(txtAd);
31 lblSoyad = new JLabel(Soyad: );
32 container.add(lblSoyad);
33 txtSoyad = new JTextField(10);
34 container.add(txtSoyad);
35 btnKaydet = new JButton(Kaydet);
36 btnKaydet.setEnabled(false);
37 btnKaydet.addActionListener
38 (
39 new ActionListener()
40 {
41 public void actionPerformed(ActionEvent
event)
42 {
43 JOptionPane.
showMessageDialog(null, Ad: + txtAd.getText() + \nSoyad: +
txtSoyad.getText());
44 }
45 }
46 );
47 container.add(btnKaydet);
48 chkKabul = new JCheckBox(Szlemeyi kabul
ediyorum);
49 chkKabul.addItemListener
50 (
51 new ItemListener()
52 {
53 public void itemStateChanged(ItemEvent
event)
54 {
55 if(chkKabul.isSelected() == true)
56 btnKaydet.setEnabled(true);
57 else
58 btnKaydet.setEnabled(false);
59 }
60 }
61 );
62 container.add(chkKabul);
63 setSize(200, 150);
64 setVisible(true);
65 }
Swing 79

66 public static void main(String[] args)


67 {
68 JCheckBoxTest test = new JCheckBoxTest();
69 test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
70 }
71 }

Kodun aklamas: ki tane JLabel, iki tane JTextField, bir tane JButton ve bir tane JC-
heckBox nesnesi oluturularak Container nesnesine eklendi. JCheckBox nesnesi zerinde
altrlan addItemListener metodu ile, bu nesnenin durumunun deimesi halinde tetikle-
necek olan event handleri oluturuldu. Yazdmz koda gre, uygulama ilk altrldnda bu-
ton aktif deildir. Kullanc ad ve soyad bilgilerini girdikten sonra szlemeyi kabul ettiini belir-
ten JCheckBox iaretlediinde (checkbox seili hale getirdiinde) JCheckBox nesnesinin
uzerindeki ItemListener metodu alr ve buton aktif hale gelir. Benzer bir ekilde kullanc
CheckBox zerindeki seimi iptal ederse buton aktiflik zelliini yitirir. Kullanc gereken bilgileri
girdikten sonra Kaydet butonuna tkladnda ad ve soyad bilgileri bir mesaj kutusu (JOption-
Pane) yardmyla ekranda grntlenir. Uygulama altrldnda grnen arayz ekil 13, ekil
14 ve ekil 15teki gibidir:

ekil 13: Buton aktif deil. ekil 14: Buton aktif.

ekil 15: Kaydet butonuna tkland.

JRadioButton
JRadioButton bileeni, .Net ortamndaki RadioButton kontrolnn Java platformundaki kar-
ldr. Birden fazla seenee sahip bir veri kmesi arasndan birinin seilmesi gereken durum-
larda kullanlr. .Net ortamndaki RadioButton kontrolnden farkl olarak arayz zerinde ayn
anda birden fazla JRadioButton kontrol seili durumda bulunabilir. Bu durumu nlemek iin,
arayz zerindeki ilikili JRadioButton kontrolleri bir tane ButtonGroup nesnesi kullanla-
rak gruplandrlr. JRadioButton kontrol zerindeki seim durumundaki deiiklik JCheckBox
kontrol gibi ItemListener interfacei ile kontrol edilebilir. ki tane JRadioButton kontrol ile
bir tane ButtonGroup kontrol ieren ve JRadioButton nesneleri zerindeki seim durumu-
nun deiikliini takip eden kod blou rnek Uygulama 6.10da gsterilmitir.

rnek Uygulama 6.10:


1 import java.awt.Container;
2 import java.awt.FlowLayout;
80 Blm 6

3 import java.awt.event.ItemEvent;
4 import java.awt.event.ItemListener;
5 import javax.swing.ButtonGroup;
6 import javax.swing.JFrame;
7 import javax.swing.JOptionPane;
8 import javax.swing.JRadioButton;
9 import javax.swing.plaf.basic.BasicComboBoxUI.ItemHandler;
10 public class JRadioButtonTest extends JFrame
11 {
12 private JRadioButton rbErkek;
13 private JRadioButton rbKadin;
14 private ButtonGroup grpRadio;
15 public JRadioButtonTest()
16 {
17 super(JRadioButton rnei);
18 Container container = getContentPane();
19 container.setLayout(new FlowLayout());
20 rbErkek = new JRadioButton(Erkek, true);
21 rbErkek.addItemListener(new RadioButtonHandler());
22 container.add(rbErkek);
23 rbKadin = new JRadioButton(Kadn, false);
24 rbKadin.addItemListener(new RadioButtonHandler());
25 container.add(rbKadin);
26 // JRadioButton nesnelerini gruplandrmak iin
ButtonGroup kullanlr
27 grpRadio = new ButtonGroup();
28 grpRadio.add(rbErkek);
29 grpRadio.add(rbKadin);
30 setSize(200, 100);
31 setVisible(true);
32 }
33 private class RadioButtonHandler implements ItemListener
34 {
35 public void itemStateChanged(ItemEvent event)
36 {
37 if(event.getStateChange() == ItemEvent.
SELECTED)
38 {
39 JOptionPane.showMessageDialog(null,
((JRadioButton)event.getSource()).getText());
40 }
41 }
42 }
43 public static void main(String[] args)
44 {
Swing 81

45 JRadioButtonTest test = new JRadioButtonTest();


46 test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
47 }
48 }

Kodun aklamas: JRadioButtonTest snfnn yapc metodunda iki tane JRadioButton,


bir tane ButtonGroup nesnesi oluturduk. JRadioButton nesnelerini olutururken kulland-
mz yapc metodun ikinci parametresi mantksal deer alr ve uygulama ilk altnda JRadi-
oButton nesnesinin seili durumda olup olmayacan belirtir. Uygulama ilk altnda Erkek
deerine sahip JRadioButton nesnesi seili durumdadr. ki JRadioButton nesnesi iin de
ayn event handler snfn kullanacamz iin private bir i snf oluturduk. ItemStateChan-
ged event handler metodu JRadioButton nesnelerinden birinin seili olma durumu deitiinde
alr. Metodun banda kullandmz if mekanizmasyla sadece seili hale gelen nesnelerle
ilgilendiimizi belirttik ve JRadioButton kontrollerinden biri seili hale getiinde bu nesne-
nin text zelliini mesaj kutusu kullanarak kullancya gsterdik. Eer ButtonGroup nesnesini
kullanmasaydk ayn anda birden fazla JRadioButton kontrol seili durumda bulunabilecekti.
ButtonGroup nesnesinin olmas ve olmamas durumlarnda uygulamann davran ekil 16,
ekil 17 ve ekil 18de gsterilmitir.

ekil 16: ButtonGroup nesnesi kullanlmadnda


herhangi bir zamanda iki JRadioButton bir arada
seilebilir.

ekil 17: ButtonGroup nesnesi kullanld. ekil 18: rbErkek seili durumda.

JComboBox
JComboBox kontrol, .Net ortamndaki ComboBox kontrol gibi bir veri kmesi zerinden bir tane
eleman semek amacyla kullanlr. .Net ortamndaki ComboBox kontrol seme, metin cinsinden
veri girii, otomatik tamamlama gibi amalar iin kullanlabildii halde JComboBox kontrol sade-
ce veri semek amacyla kullanlabilir, ayn anda birden fazla elemann seilmesine izin verilmez.
Temel amac gerei bir arada kullanlan JRadioButton nesnelerine benzese de alma zama-
nnda dinamik veri balama kolaylndan dolay bu kontrolden ayrlr. JComboBox kontrolne
veri balanmas ve seili elemann deimesi durumunda oluan eventin kullanlmas aadaki
kod zerinde gsterilmitir.

rnek Uygulama 6.11:

1 import java.awt.Container;
2 import java.awt.FlowLayout;
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import javax.swing.JComboBox;
82 Blm 6

6 import javax.swing.JFrame;
7 import javax.swing.JLabel;
8 import javax.swing.JOptionPane;
9 public class JComboBoxTest extends JFrame
10 {
11 private JLabel lblOgrenimDurumu;
12 private JComboBox cmbOgrenimDurumu;
13 public JComboBoxTest()
14 {
15 super(JComboBox rnei);
16 Container container = getContentPane();
17 container.setLayout(new FlowLayout());
18 lblOgrenimDurumu = new JLabel(renim durumunuzu
sein);
19 container.add(lblOgrenimDurumu);
20 String[] ogrenimDurumlari = {lkokul, Ortaokul,
Lise, niversite, Yksek lisans, Doktora};
21 cmbOgrenimDurumu = new JComboBox(ogrenimDurumlari);
22 cmbOgrenimDurumu.addActionListener
23 (
24 new ActionListener()
25 {
26 public void actionPerformed(Action
Event event)
27 {
28 JOptionPane.
showMessageDialog(null, cmbOgrenimDurumu.getSelectedItem().
toString());
29 }
30 }
31 );
32 container.add(cmbOgrenimDurumu);
33 setSize(200, 100);
34 setVisible(true);
35 }
36 public static void main(String[] args)
37 {
38 JComboBoxTest test = new JComboBoxTest();
39 test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
40 }
41 }

Kodun aklamas: Uygulama iinde bir tane JLabel ve bir tane JComboBox nesnesi tanmla-
dk. renim durumlarn tutan bir string dizisi oluturarak JComboBox nesnesinin yapc meto-
duna parametre olarak verdik. JComboBox nesnesi oluurken yapc metoduna parametre olarak
verdiimiz string dizisini veri kayna olarak kullanr. JComboBox nesnesinin seili eleman de-
Swing 83

itiinde almak zere bir ActionListener event handler metodu tanmladk. Uygulama ilk
altnda ilk elemann seili durumda olduu ve event handler metodunun uygulamann ilk a-
lmas srasnda tetiklenmedii gzlenebilir. Bu aamadan sonra seili eleman deitii zaman
event handler metodu tetiklenir ve seilmi olan elemann sahip olduu metni bir JOptionPane
mesaj kutusu araclyla kullancya gsterir. Uygulamann ihtiyacna gre birden fazla JCombo-
Box nesnesinin ayn event handler metodunu kullanmas salanabilir, bu durumda ActionLis-
tener interfaceini implement eden bir snf oluturmak gerekir. Ayrca bir JComboBox nesnesi-
nin seili elemannn deimesiyle baka bir JComboBox nesnesinin veri kmesinin deimesi de
salanabilir. lerleyen ksmlarda bu durumla ilgili bir rnek yapacaz.

Uygulama ilk altnda ve seili eleman deitiinde ekil 19 ve ekil 20deki gibi bir grnm
oluur:

ekil 19 ekil 20: Seili eleman deiti.

JList
.Net ortamndaki ListBox kontrolnn Java platformundaki karldr. Belirli bir veri kmesi
zerinden bir veya daha ok sayda eleman semek amacyla kullanlr. JComboBox kontrolnde
olduu gibi sahip olduu veri kmesi uygulamann almas srasnda deitirilebilir. Uygulama-
nn gereksinimlerine bal olarak bir tane, belirli bir aralkta olmak zere birden fazla veya belirli
bir aralkta bulunma art bulunmadan birden fazla elemann seili olmasna izin verilebilir. Belirli
bir aralkta olmak zere birden fazla elemann seilmesi salanrsa kullanc, klavyedeki shift
tuuyla birlikte mouse imlecini kullanarak aralk eklinde seim yapabilir. Belirli bir aralkta bulun-
ma art olmadan seim yaplabilecekse kullanc, klavyedeki ctrl tuuyla birlikte mouse imlecini
kullanabilir. Gereksinime gre JComboBox nesnesinde olduu gibi ActionListener interfacei
kullanlarak seili elemanlarn deimesi izlenebilir ve kontrol edilebilir.

JList nesnesinin oluturulmas ve kullanm aadaki rnek Uygulama 6.12de gsterilmitir.

rnek Uygulama 6.12:

1 import java.awt.Container;
2 import java.awt.FlowLayout;
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import javax.swing.JButton;
6 import javax.swing.JFrame;
7 import javax.swing.JLabel;
8 import javax.swing.JList;
8 import javax.swing.JScrollPane;
10 import javax.swing.JTextArea;
11 import javax.swing.ListSelectionModel;
12 public class JListTest extends JFrame
13 {
14 private JLabel lblIlgiAlanlari;
15 private JList lstIlgiAlanlari;
84 Blm 6

16 private JScrollPane scrIlgiAlanlari;


17 private JTextArea txtSonuc;
18 private JButton btnGoster;
19 public JListTest()
20 {
21 super(JListBox rnei);
22 Container container = getContentPane();
23 container.setLayout(new FlowLayout());
24 lblIlgiAlanlari = new JLabel(lgi alanlarnz
sein);
25 container.add(lblIlgiAlanlari);
26 String[] ilgiAlanlari = new String[]{Spor,
Mzik, Edebiyat, Tiyatro, Resim, Sinema};
27 lstIlgiAlanlari = new JList(ilgiAlanlari);
28 //lstIlgiAlanlari.setSelectionMode(ListSelectionModel.
SINGLE_
SELECTION);
29 //lstIlgiAlanlari.setSelectionMode(ListSelectionModel.
SINGLE_
INTERVAL_SELECTION);
30 lstIlgiAlanlari.setSelectionMode(ListSelection
Model.MULTIPLE_
INTERVAL_SELECTION);
31 lstIlgiAlanlari.setVisibleRowCount(4);
32 scrIlgiAlanlari = new JScrollPane(lstIlgiAlanlari);
33 container.add(scrIlgiAlanlari);
34 btnGoster = new JButton(Gster);
35 btnGoster.addActionListener
36 (
37 new ActionListener()
38 {
39 public void actionPerformed(ActionEvent
event)
40 {
41 txtSonuc.setText();
42 Object[] seciliElemanlar =
lstIlgiAlanlari.getSelectedValues();
43 for (Object eleman :
seciliElemanlar)
44 {
45 txtSonuc.append(eleman.
toString() + \n);
46 }
47 }
48 }
49 );
Swing 85

50 container.add(btnGoster);
51 txtSonuc = new JTextArea();
52 container.add(txtSonuc);
53 setSize(200, 200);
54 setVisible(true);
55 }
56 public static void main(String[] args)
57 {
58 JListTest test = new JListTest();
59 test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
60 }
61 }

Kodun aklamas: Uygulamada ilgi alanlarn grntlemek iin bir tane JList nesnesi ve
bu nesneye scroll zellii vermek iin bir tane JScrollPane nesnesi kullandk. Kullancnn bir
veya birka tane seebilecei ilgi alan veri kmesini tutmak iin kullanlan string dizisi JList
nesnesinin yapc metoduna parametre olarak verildi. Jlist nesnesinin sahip olduu setSe-
lectionMode metodu, JList zerinde ayn anda birden fazla elemann seilmesine izin verilip
verilmeyeceini belirler. Tek bir elemann seilmesine izin vermek isteseydik SINGLE_SELEC-
TION seeneini, belirli bir aralkta olmak zere birden fazla elemann seilmesine izin vermek
isteseydik SINGLE_INTERVAL_SELECTION seeneini kullanacaktk. Kullandmz yapda ise
belirli bir arala dahil olan veya olmayan birden fazla eleman seilebilir. JList nesnesi varsa-
ylan olarak sahip olduu btn elemanlar alt alta gsterir. Eleman says arttka nesne uygu-
lama arayz zerinde fazla yer kaplamaya balayacandan scroll zelliine ihtiya duyulabilir.
JList nesnesinin kendine ait bir scroll zellii olmad halde JScrollPane bileeni kullanla-
rak JList nesnesine scroll zellii verilebilir. Koda dikkat edilirse JList nesnesinin dorudan
Container nesnesine eklenmedii grlebilir. JList nesnesi JScrollPane nesnesine, JSc-
rollPane nesnesi ise Container nesnesine eklenmitir. JList nesnesinin setVisible-
RowCount metodu scroll ileminden nce grntlenecek eleman saysn belirlemek amacyla
kullanlr. rnek uygulamada, drt tane elemann grnr halde olmasna izin verilmitir, dier
elemanlara ancak scroll ilemiyle ulalabilir.
rnek uygulamada, JList nesnesi zerinde kullancnn setii elemanlarn deeri butona basl-
dktan sonra JTextArea nesnesine yazlr. Butona her tklandnda JTextArea bileenin text
zellii bo string deeri almaktadr, bunun sebebi sadece butona tkland anda seili olan
elemanlarn deerlerini grntlemek istememizdir.
Uygulama altrldnda ve butona tklandnda ekil 21 ve ekil 22de olduu gibi grnr.

ekil 21: Uygulama altrldnda JTextArea ekil 22: tane eleman seildi ve Gster bu-
nesnesi grnmyor. tonuna tkland.
86 Blm 6

JList kontrol sklkla kullanlabilecek bir kontrol olduu iin, birok uygulamada karmza ka-
bilecek bir arayz oluturalm ve iki tane JList kontrol arasnda veri aktarm yapalm.

rnek Uygulama 6.13:

1 import java.awt.Container;
2 import java.awt.FlowLayout;
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import javax.swing.DefaultListModel;
6 import javax.swing.JButton;
7 import javax.swing.JFrame;
8 import javax.swing.JList;
9 import javax.swing.ListSelectionModel;
10 public class VeriAktarimi extends JFrame
11 {
12 private JList lstIlgiAlanlari;
13 private JList lstSecilmisIlgiAlanlari;
14 private JButton btnEkle;
15 private JButton btnCikar;
16 private DefaultListModel modelElemanlar;
17 private DefaultListModel modelSeciliElemanlar;
18 public VeriAktarimi()
19 {
20 super(JListBox nesneleri arasnda veri aktarm);
21 Container container = getContentPane();
22 container.setLayout(new FlowLayout());
23 modelElemanlar = new DefaultListModel();
24 modelSeciliElemanlar = new DefaultListModel();
25 modelElemanlar.addElement(Spor);
26 modelElemanlar.addElement(Mzik);
27 modelElemanlar.addElement(Edebiyat);
28 modelElemanlar.addElement(Tiyatro);
29 modelElemanlar.addElement(Resim);
30 modelElemanlar.addElement(Sinema);
31 lstIlgiAlanlari = new JList(modelElemanlar);
32 lstIlgiAlanlari.setSelectionMode(ListSelectionModel.
MULTIPLE_
INTERVAL_SELECTION);
33 container.add(lstIlgiAlanlari);
34 btnCikar = new JButton(<<<<);
35 btnCikar.setEnabled(false);
36 btnCikar.addActionListener
37 (
38 new ActionListener()
39 {
Swing 87

40 public void actionPerformed(ActionEvent


event)
41 {
42 Object[] seciliElemanlar =
lstSecilmisIlgiAlanlari.getSelectedValues();
43 for (Object eleman :
seciliElemanlar)
44 {
45 modelSeciliElemanlar.
removeElement(eleman.toString());
46 modelElemanlar.
addElement(eleman.toString());
47 }
48 if(modelSeciliElemanlar.getSize()
== 0)
49 {
50 btnCikar.setEnabled(false);
51 }
52 if(modelElemanlar.getSize() != 0)
53 {
54 btnEkle.setEnabled(true);
55 }
56 }
57 }
58 );
59 container.add(btnCikar);
60 btnEkle = new JButton(>>>>);
61 btnEkle.addActionListener
62 (
63 new ActionListener()
64 {
65 public void actionPerformed(ActionEvent
event)
66 {
67 Object[] seciliElemanlar =
lstIlgiAlanlari.getSelectedValues();
68 for (Object eleman :
seciliElemanlar)
69 {
70 modelElemanlar.
removeElement(eleman.toString());
71 modelSeciliElemanlar.
addElement(eleman.toString());
72 }
73 if(modelElemanlar.getSize() == 0)
74 {
88 Blm 6

75 btnEkle.setEnabled(false);
76 }
77 if(modelSeciliElemanlar.getSize()
!= 0)
78 {
79 btnCikar.setEnabled(true);
80 }
81 }
82 }
83 );
84 container.add(btnEkle);
85 lstSecilmisIlgiAlanlari = new JList(modelSeciliElema
nlar);
86 lstIlgiAlanlari.setSize(100, 100);
87 container.add(lstSecilmisIlgiAlanlari);
88 setSize(200, 200);
89 setVisible(true);
90 }
91 public static void main(String[] args)
92 {
93 VeriAktarimi test = new VeriAktarimi();
94 test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
95 }
96 }

Kodun aklamas: Uygulamada iki tane JList kontrol ile iki tane JButton kontrol kullan-
dk. Bir nceki rnekte JList kontrolne veri kayna olarak bir string dizisi verdiimiz halde
bu rnekte DefaultListModel nesnesinden yararlandk. Bunun sebebi, DefaultListModel
bileeninin uygulamann almas srasnda veri ekleme ve kartma ilemlerini desteklemesidir.
Uygulama ilk alt srada btn ilgi alanlar sol tarafta bulunan JList bileenin iinde bulunur
ve sol tarafa veri aktarmay salayan buton aktif deildir. Bir veya birden fazla ilgi alan seilip
sa tarafa veri aktarmay salayan butona tklandnda, seili elemanlar modelElemanlar nes-
nesinden removeElement metodu yardmyla kartlr modelSeciliElemanlar nesnesine
addElement metodu yardmyla eklenir. Bu ilemler JButton nesneleri iin yazlan ve Action-
Listener interfaceini implement eden metodlar iinde gereklenir. Sol taraftaki JList bileenin
iinde eleman kalmadnda sola aktarma ilemini gerekleyen buton aktif olmaktan kar. JList
nesnelerine veri kayna olarak baladmz DefaultListModel nesnelerini event handler
metodlar iinde tekrar balamaya gerek olmadna dikkat edelim, bu durum kullandmz nes-
nelerin referans tipinde olmasndan kaynaklanr. DefaultListModel nesnelerinin barndrd
veriler deitiinde otomatik olarak JList grnmleri de deiir.

Uygulama eitli alma aamalarnda ekil 23, ekil 24 ve ekil 25te olduu gibi grnr:
Swing 89

ekil 23: tane eleman seili durumda, henz ekil 24: Sa tarafa aktarma ilemi yapldktan sonra iki buton
butona tklanm. da aktif.

ekil 25: Sol taraftaki btn veriler sa tarafa gemi, saa ak-
tarma butonu kullanlamyor.

Mouse Eventlerinin Ynetilmesi:


Fare hareketleri ile tetiklenen event yaplar MouseListener ve MouseMotionListener interfacelerinin
implement edilmesiyle kontrol edilebilir. Bu interfacelerin iinde bulunan metodlar u ekildedir:

MouseListener

mousePressed: Fare butonlarndan birine basld anda tetiklenir.

mouseClicked: Fare butonlarndan birine baslp brakldnda tetiklenir.

mouseReleased: Fare butonlarndan birine basldktan sonra brakldnda tetiklenir.

mouseEntered: Fare imleci bir bileenin alanna girdiinde tetiklenir.

mouseExited: Fare imleci bir bileenin alann terk ettiinde tetiklenir.

MouseMotionListener:

mouseDragged: Fare imleci bir bileenin zerindeyken butonlardan birine baslarak mouse ha-
reket ettirildiinde tetiklenir.

mouseMoved: Fare imleci bir bileenin zerindeyken fare hareket ettirildiinde tetiklenir.

Fare ile ilgili eventleri kontrol eden btn metodlar parametre olarak bir MouseEvent nesnesi
alrlar. Fare imlecinin x ve y koordinatlar, hangi butona ka kere basld gibi bilgiler bu nesne
araclyla alnr. Mouse eventleri herhangi bir bileen iin kaydedilebilir ve bu bileen zerinde
herhangi bir fare hareketi olduunda ilgili event metodu tetiklenir. Interface mantndan dolay
MouseListener ve MouseMotionListener interfacelerinden herhangi biri implement edildiinde bu
interfacein iinde bulunan btn metodlar implement edilmek zorundadr. Kullanlmayacak olan
metodlarn tanmlar yaplarak ileri bo braklr.

Mouse eventlerini kontrol etmek amacyla oluturduumuz uygulamann kodlar aadaki gibi-
dir.
90 Blm 6

1 import java.awt.Container;
2 import java.awt.FlowLayout;
3 import java.awt.event.MouseEvent;
4 import java.awt.event.MouseListener;
5 import javax.swing.JFrame;
6 import javax.swing.JLabel;
7 import javax.swing.JTextArea;
8 public class MouseYonetimi extends JFrame
9 {
10 private JTextArea txtContainerEvent;
11 private JTextArea txtLabelEvent;
12 private JLabel lblAlan;
13 public MouseYonetimi()
14 {
15 super(Mouse ynetimi);
16 Container container = getContentPane();
17 container.setLayout(new FlowLayout());
18 container.addMouseListener(new
ContainerMouseListenerHandler());
19 lblAlan = new JLabel(Mouse imlecini bu alann
zerine getirin);
20 lblAlan.addMouseListener(new
JLabelMouseListenerHandler());
21 container.add(lblAlan);
22 txtContainerEvent = new JTextArea();
23 container.add(txtContainerEvent);
24 txtLabelEvent = new JTextArea();
25 container.add(txtLabelEvent);
26 setSize(200, 200);
27 setVisible(true);
28 }
29 private class ContainerMouseListenerHandler
implements MouseListener
30 {
31 public void mouseClicked(MouseEvent event)
32 {
33 txtContainerEvent.
append(ButonAdiAl(event.getButton()) + butona + event.
getClickCount() + kez basld ve brakld\n);
34 }
35 public void mousePressed(MouseEvent event)
36 {
37 txtContainerEvent.
append(ButonAdiAl(event.getButton()) + butona ( + event.getX()
+ , + event.getY() + ) noktasnda basld\n);
38 }
Swing 91

39 public void mouseReleased(MouseEvent event)


40 {
41 txtContainerEvent.
append(ButonAdiAl(event.getButton()) + buton brakld\n);
42 }
43 public void mouseEntered(MouseEvent event)
44 {
45 }
46 public void mouseExited(MouseEvent event)
47 {
18 }
49 }
50 private class JLabelMouseListenerHandler implements
MouseListener
51 {
52 public void mouseEntered(MouseEvent event)
53 {
54 txtLabelEvent.append(Mouse imleci
JLabel blgesine girdi\n);
55 }
56 public void mouseExited(MouseEvent event)
57 {
58 txtLabelEvent.append(Mouse imleci
JLabel blgesinden kt\n);
59 }
60 public void mouseClicked(MouseEvent event)
61 {
62 }
63 public void mousePressed(MouseEvent event)
64 {
65 }
66 public void mouseReleased(MouseEvent event)
67 {
68 }
69 }
70 public static String ButonAdiAl(int butonNumarasi)
71 {
72 String butonAdi = ;
73 if(butonNumarasi == MouseEvent.BUTTON1)
74 {
75 butonAdi = Sol;
76 }
77 else if(butonNumarasi == MouseEvent.BUTTON2)
78 {
79 butonAdi = Orta;
92 Blm 6

80 }
81 else if(butonNumarasi == MouseEvent.BUTTON3)
82 {
83 butonAdi = Sa;
84 }
85 return butonAdi;
86 }
87 public static void main(String[] args)
88 {
89 MouseYonetimi test = new MouseYonetimi();
90 test.setDefaultCloseOperation(JFrame.EXIT_ON_
CLOSE);
91 }
92 }

Kodun aklamas: Container nesnesi ve JLabel nesnesi iin birer tane event handler snf
oluturduk. ki snf da MouseListener interfaceini implement ediyor. Kullanlmayan metodlarn
gvdelerini bo brakarak interface yapsndan kaynaklanan derleme hatalarn nlemi olduk.
Uygulamada kullanlan statik ButonAdiAl metodu, tklanan butonun numarasn alarak butona
bir isim vererek dndrr. rnein sol fare butonuna tklandnda buton kodu olarak 1 deeri
oluur, ButonAdiAl metodunu kullanarak Sol deeri dndrlr.

Container nesnesinin ilikili olduu ContainerMouseListenerHandler snfnn iinde bulu-


nan metodlar aadaki ilevlere sahiptir:

mousePressed: Fare butonlarndan biriyle formun zerine tklandnda hangi butona basld
ve tklanan pozisyonun x ve y deerleri JTextArea bileenine eklenir.

mouseReleased: Tklandktan sonra braklan mouse butonunun ad JTextArea bileenine ek-


lenir.

mouseClicked: Tklandktan sonra braklan fare butonunun ad ve tklanma says JTextArea


bileenine eklenir.

JLabel nesnesinin ilikili olduu JLabelMouseListenerHandler snfnn iinde bulunan me-


todlar aadaki ilevlere sahiptir:

mouseEntered: Fare imleci JLabel kontrolnn zerine geldiinde ikinci JTextArea nesnesine
bu bilgi yazlr.

mouseExited: Fare imleci JLabel kontrolnn blgesinden ktnda ikinci JTextArea nesnesine
bu bilgi yazlr.

Uygulama altrldktan sonra mouse ile JLabel kontrolnn blgesine girilip kldnda ve
form zerine farkl fare butonlaryla eitli seferlerde tklandnda, uygulama arayz aadaki
gibi bir grnm alr.
Swing 93

Java ortamnn event altyaps interfaceler zerine kurulu olduu iin, iinde birden fazla metod
tanm bulunan interfacelerin kullanlmas durumunda gereksiz metodlar da implement edilmek
zorundadr. Bu durumun nne gemek iin Adapter snflar oluturulmutur. Adapter snflar
ilgili interfacelerin btn metodlarn gvdeleri bo olacak ekilde implement eder. Yeni oluturu-
lan event handler snflar Adapter snflarndan tretilirse sadece gerekli event metodlar override
edilebilir. Mouse eventlerinin kontrol edilmesi iin MouseAdapter snfnn temel snf olarak kul-
lanld bir uygulamann kodlar aadadr.

1 import java.awt.Container;
2 import java.awt.FlowLayout;
3 import java.awt.event.MouseAdapter;
4 import java.awt.event.MouseEvent;
5 import javax.swing.JFrame;
6 import javax.swing.JTextArea;
7 public class MouseAdapterTest extends JFrame
8 {
9 private JTextArea txtContainerEvent;
10 public MouseAdapterTest()
11 {
12 super(Mouse ynetimi);
13 Container container = getContentPane();
14 container.setLayout(new FlowLayout());
15 container.addMouseListener(new
ContainerMouseHandler());
94 Blm 6

16 txtContainerEvent = new JTextArea();


17 container.add(txtContainerEvent);
18 setSize(200, 200);
19 setVisible(true);
20 }
21 private class ContainerMouseHandler extends
MouseAdapter
22 {
23 public void mouseClicked(MouseEvent event)
24 {
25 txtContainerEvent.append(event.
getButton() + numaral butona + event.getClickCount() + kez
basld ve brakld\n);
26 }
27 }
28 public static void main(String[] args)
29 {
30 MouseAdapterTest test = new
MouseAdapterTest();
31 test.setDefaultCloseOperation(JFrame.EXIT_ON_
CLOSE);
32 }
33 }

Uygulama altrlp formun zerine eitli mouse butonlaryla tklanrsa arayz aadaki gibi bir
grnme sahip olur.

Klavye Eventlerinin Ynetilmesi


Kullancnn klavye ile etkileimi sonucunda oluan eventler KeyListener interfaceini implement
eden snflarn oluturulmas ile kontrol edilir. KeyListener interfaceinin iinde aadaki metodlar
bulunur:

keyPressed: Klavyedeki herhangi bir tua basldnda tetiklenir.


Swing 95

keyTyped: Aksiyon tuu olmayan tulardan herhangi birine basldnda tetiklenir. Aksiyon tular
ok tular, home, end, scroll lock gibi ilevsel zellikleri olan tulardr.

keyReleased: Herhangi bir buton brakldktan sonra, yani keyTyped veya keyPressed eventinden
sonra tetiklenir.

Klavye eventlerinin kullanmn gsteren uygulamay oluturan kodlar aada verilmitir.

1 import java.awt.Container;
2 import java.awt.FlowLayout;
3 import java.awt.event.KeyEvent;
4 import java.awt.event.KeyListener;
5 import javax.swing.JFrame;
6 import javax.swing.JTextArea;
7 public class KeyboardEventTest extends JFrame
8 {
9 private JTextArea txtContainerEvent;
10 public KeyboardEventTest()
11 {
12 super(Klavye ynetimi);
13 Container container = getContentPane();
14 container.setLayout(new FlowLayout());
15 txtContainerEvent = new JTextArea();
16 txtContainerEvent.setEnabled(false);
17 container.add(txtContainerEvent);
18 this.addKeyListener(new
KeyboardEventHandler());
19 setSize(200, 200);
20 setVisible(true);
21 }
22 private class KeyboardEventHandler implements
KeyListener
23 {
24 public void keyPressed(KeyEvent event)
25 {
26 txtContainerEvent.append(keyPressed\
tDeer: + event.getKeyText(event.getKeyCode()) + \n);
27 }
28 public void keyReleased(KeyEvent event)
29 {
30 txtContainerEvent.append(keyReleased\t\
n\n);
31 }
32 public void keyTyped(KeyEvent event)
33 {
34 txtContainerEvent.append(keyTyped\
tDeer: + event.getKeyChar() + \n);
96 Blm 6

35 }
36 }
37 public static void main(String[] args)
38 {
39 KeyboardEventTest test = new
KeyboardEventTest();
40 test.setDefaultCloseOperation(JFrame.EXIT_ON_
CLOSE);
41 }
42 }

Kodun aklamas: Kullanc klavyedeki herhangi bir tua bastnda keyPressed eventi tetik-
lenir. Baslan tu aksiyon tuu deilse keyTyped eventi de tetiklenir. Baslan tu ne olursa olsun
keyReleased event handler metodu en son alr. keyPressed ve keyTyped event handler me-
todlar; alan eventin adn ve baslan tua karlk gelen karakter deerini JTextArea bileenine
ekler. keyReleased event handler metodu ise tuun brakldn belirtir, hangi tu zerine ilem
yapldn bildirmez. Uygulama altrldktan sonra srasyla q, home, F2, 7, alt, ctrl tularna
baslrsa arayz aadaki gibi bir grnme kavuur.

Layout Ynetimi
Swing tabanl arayzler ieren Java uygulamalarnda arayze eklenen bileenlerin form zerin-
deki grnmleri layout yaplaryla ekillendirilir.

FlowLayout: Bu grnmde arayze eklenen bileenler soldan saa doru eklendikleri srada
grntlenirler. Btn rneklerimizde FlowLayout grnmn kullandk. Drt tane JButton nes-
nesiyle bir tane JTextArea nesnesini FlowLayout biiminde dzenlenmi bir Swing arayzne
ekleyelim. Uygulamann kodlar aada verilmitir.

1 import java.awt.Container;
2 import java.awt.FlowLayout;
3 import javax.swing.JButton;
Swing 97

4 import javax.swing.JFrame;
5 import javax.swing.JTextArea;
6 public class FlowLayoutTest extends JFrame
7 {
8 public FlowLayoutTest()
9 {
10 super(BorderLayout);
11 Container container = getContentPane();
12 FlowLayout layout = new FlowLayout();
13 container.setLayout(layout);
14 JButton btn1 = new JButton(1. Buton);
15 container.add(btn1);
16 JButton btn2 = new JButton(2. Buton);
17 container.add(btn2);
18 JButton btn3 = new JButton(3. Buton);
19 container.add(btn3);
20 JButton btn4 = new JButton(4. Buton);
21 container.add(btn4);
22 JTextArea txt = new JTextArea(Metin alan);
23 container.add(txt);
24 setSize(300, 200);
25 setVisible(true);
26 }
27 public static void main(String[] args)
28 {
29 FlowLayoutTest test = new FlowLayoutTest();
30 test.setDefaultCloseOperation(JFrame.EXIT_ON_
CLOSE);
31 }
32 }

Bileenler formun zerine soldan saa doru eklenmitir. alma srasnda formun boyutu de-
itirilirse arayz kontrollerinin form zerindeki yerleri de deiecektir. Formun iki farkl boyutu
iin arayzn grnm aada verilmitir.

BorderLayout: JFrame snfndan treyen snflarn varsaylan layout grnmdr. Uygulama


arayz kuzey, gney, dou, bat ve merkez olmak zere be paraya ayrlr. Uygulamaya kon-
98 Blm 6

trol ekleme aamasnda hangi blgeye eklenecei belirtilir. Drt tane JButton nesnesi ile bir tane
JTextBox nesnesi ieren bir arayz BorderLayout biiminde oluturalm.
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
1 public class BorderLayoutTest extends JFrame
2 {
3 public BorderLayoutTest()
4 {
5 super(BorderLayout);
6 Container container = getContentPane();
7 BorderLayout layout = new BorderLayout(10, 10);
8 container.setLayout(layout);
9 JButton btnNorth = new JButton(Kuzey);
10 container.add(btnNorth, BorderLayout.NORTH);
11 JButton btnSouth = new JButton(Gney);
12 container.add(btnSouth, BorderLayout.SOUTH);
13 JButton btnEast = new JButton(Dou);
14 container.add(btnEast, BorderLayout.EAST);
15 JButton btnWest = new JButton(Bat);
16 container.add(btnWest, BorderLayout.WEST);
17 JTextArea txtCenter = new JTextArea(Merkez
blge);
18 container.add(txtCenter, BorderLayout.CENTER);
19 setSize(300, 200);
20 setVisible(true);
21 }
22 public static void main(String[] args)
23 {
24 BorderLayoutTest test = new
BorderLayoutTest();
25 test.setDefaultCloseOperation(JFrame.EXIT_ON_
CLOSE);
26 }
27 }
JButton kontrolleri arayzn kuzey, gney, dou ve bat blgelerine, JTextArea bileeni ise mer-
kez blgesine eklenmitir. Uygulama altrldnda aadaki gibi grnr.
Swing 99

GridLayout: GridLayout biimi, container satrlar ve stunlardan oluan bir grid eklinde dzen-
ler. GridLayout eklinde dzenlenmi bir arayzdeki btn bileenlerin boyutu ayn olur. GridLa-
yout biiminde dzenlenmi bir Swing arayzn aadaki kod blouyla oluturabiliriz.
1 import java.awt.Container;
2 import java.awt.GridLayout;
3 import javax.swing.JButton;
4 import javax.swing.JFrame;
5 import javax.swing.JTextArea;
6 public class GridLayoutTest extends JFrame
7 {
8 public GridLayoutTest()
9 {
10 super(GridLayout);
11 Container container = getContentPane();
12 GridLayout layout = new GridLayout(2, 3);
13 container.setLayout(layout);
14 JButton btn1 = new JButton(1. Buton);
15 container.add(btn1);
16 JButton btn2 = new JButton(2. Buton);
17 container.add(btn2);
18 JButton btn3 = new JButton(3. Buton);
19 container.add(btn3);
20 JButton btn4 = new JButton(4. Buton);
21 container.add(btn4);
22 JTextArea txt = new JTextArea(Metin alan);
23 container.add(txt);
24 setSize(300, 200);
25 setVisible(true);
26 }
27 public static void main(String[] args)
28 {
29 GridLayoutTest test = new GridLayoutTest();
30 test.setDefaultCloseOperation(JFrame.EXIT_ON_
CLOSE);
31 }
32 }
100 Blm 6

Uygulama altrldnda aadaki gibi bir arayz oluur:

Bunlarn dnda daha az kullanlan BoxLayout, CardLayout ve GridBagLayout grnmleri de


vardr.
7 JDBC
7 JDBC
Veritaban Balantsnn Kurulmas

Veri Deitirme Komutlar (insert, update,


delete)

Veri Sorgulama Komutlar (Select)

Parametreli SQL fadelerinin altrlmas

Stored Procedurelerin altrlmas


JDBC
Java uygulamalar zerinden veri kaynaklarn bulmak ve bulunan kaynaklara balanarak bu kay-
naklar zerinde eitli sorgular altrmak iin JDBC ad verilen Java APIsi kullanlr. JDBC,
.Net ortamndaki ADO.Net yapsnn Java platformundaki karldr. JDBC, platform bamsz-
ln salayabilmek iin, ortamdaki veri kaynaklarna balanmak amacyla kullanlan srcleri
alma zamannda tespit edebilen bir src ynetim sistemine(Driver Manager) sahiptir. Veri
kaynaklarna balanmadan nce srclerin yklenmesini salamak iin Class.forName()
metodu gereken parametreler kullanlarak arlr.

ODBC srcsne sahip olan veri kaynaklarna balanmak iin JDBC-ODBC kprs kullanlr.
Srcler bulunduktan sonra ODBC zerinde kaytl bulunan herhangi bir veri kaynana bala-
nlabilir. Windows tabanl iletim sistemleri zerinde bulunan bir veritaban ynetim sistemi yazl-
mndaki bir veritabanna balanmak iin, bu veritabannn ODBC kaynaklarna eklenmesi gerekir.
Bu ilem denetim masasnda veya ynetimsel aralarda bulunan veri kaynaklar (ODBC) seene-
nei kullanlarak gerekletirilebilir.

Bilgisayarmzda bulunan Microsoft SQL Server 2005 veritaban sunucusu zerinde drt tablodan
oluan AlisveriSitesi adnda bir veritaban oluturarak uygulamalarmz bu veritaban zerinde
altralm. AlisverisSitesi veritabann oluturmak ve sahip olduu tablolar oluturmak iin kul-
lanlacak SQL ifadeleri ve veritabannn diyagram ekil 1de gsterilmitir.

ekil 1

rnek Uygulama 7.1:

1 create database AlisverisSitesi


2 use AlisverisSitesi
3 create table Urun
4 (
5 urunID int primary key identity(1, 1),
6 urunAdi varchar(20),
7 fiyat money
8 )

9 create table Musteri


104 Blm 7

10 (
11 musteriID int primary key identity(1, 1),
12 ad varchar(20),
13 soyad varchar(30),
14 )

15 create table Siparis


16 (
17 siparisID int primary key identity(1, 1),
18 musteriID int foreign key references Musteri(musteriID),
19 siparisTarihi smalldatetime
20 )

21 create table SiparisDetay


22 (
23 siparisID int foreign key references Siparis(siparisID),
24 urunID int foreign key references Urun(urunID),
25 miktar int
26 )

Veritabanmz oluturduktan sonra denetim masasndan veya ynetimsel aralardan veri kay-
naklar (ODBC) ayarlarn aalm. Java zerinden herhangi bir veri kaynana balanmadan nce
kullanacamz veritaban sunucusunu ve veritabann System DSN mensnden kayt edeceiz.
System DSN mens ilk aldnda ekil 2dekine benzer bir grnme sahip olacaktr.

ekil 2

Yeni bir veri kayna eklemek iin Add butonuna tklayalm. Karmza kan pencerede, balan-
mak istediimiz veri kaynan setikten sonra Finish butonuna tklayarak veri kaynamzla ilgili
JDBC 105

ek bilgiler istenir. Microsoft SQL Server veritaban sunucusu kullandmz iin en altta bulunan
SQL Server seeneini semeliyiz.

ekil 3

Bir sonraki pencerede, veri kaynamza vereceimiz ismi ve kullanlacak veritaban sunucusu-
nun adn veya adresini yazdktan sonra Next butonuna tklayalm. Veri kayna ile ilgili ayarlar
ekil 4te grlebilir.

ekil 4

Veritaban sunucumuz belirlendikten sonra, bu sunucuya balanmak iin kullanlacak olan kimlik
bilgilerinin girilecei ekran karmza kar. SQL Server veritaban sunucusuna balanmak iin
Windows Authentication veya SQL Authentication kullanabiliriz. Windows Authentication kullan-
mamz durumunda kullanc ad ve ifre bilgileri istenmez, veritaban sunucusuna balanmak
iin sisteme giri yapm olan Windows kullanc hesab kullanlr. Bahsedilen ayarlar ekil 5te
grlebilir.
106 Blm 7

ekil 5

SQL Server 2005 veritaban sunucusuna balanmak iin Windows NT Authentication modunu
setikten sonra Next butonuna tklayn. AlisverisSitesi adn verdiimiz srcyle balanlacak
olan varsaylan veritabann en stteki change default database to checkbox yardmyla belirle-
yebiliriz. AlisverisSitesi veritabann varsaylan veritaban olarak setikten sonra Next butonuna
ve bir sonraki pencerede Finish butonuna tklayn. Son aamada karmza kan ekran g-
rntleri aadadr.

ekil 6
JDBC 107

ekil 7

Finish butonuna tkladktan sonra ODBC veri kaynann baaryla eklendiini belirten bir mesaj
aldk. ODBC kayna eklendikten sonra ekil 8de gsterilen Test Data Source butonuna tklaya-
rak veritaban balantmzn doru alp almadn kontrol edin. ekil 9da grlen mesaj,
veri kaynana baaryla balandmz gsterir.

ekil 8
108 Blm 7

ekil 9

Veritaban Balantsnn Kurulmas


Veritabanna balanmak iin kullanlacak ODBC kaynan iletim sistemine ekledikten sonra
Java ortam zerinden AlisverisSitesi veritabanna balanmaya alalm. Veri kaynana balan-
mak iin aadaki admlarn gereklemesi gerekir:

1 letim sistemi zerinde bulunan JDBC srcsnn Class.forName() metodu yardmyla


bulunmas.
2. DriverManager snfnda bulunan getConnection() metodu ile veritaban balantsnn
salanmas.
Class.forName metodunun uygulamada kullanlabilmesi iin, bu metodu aran metodun
ClassNotFoundException tipinden hata frlatabilmesi gerekir. Benzer bir ekilde DriverMa-
nager.getConnection() metodunu aran metodun SQLException tipinden hata frlatabil-
mesi gerekir. ki metod arsn da uygulamann main metodundan yapacamz iin main meto-
dumuz bu iki hatay da frlatabilecek ekilde oluturulur. Aadaki kodu yazp altrdmzda
herhangi bir mesaj almazsak ODBC kaynana balant kurmay baardk demektir.

rnek Uygulama 7.2:

1 import java.sql.Connection;
2 import java.sql.DriverManager;
3 import java.sql.SQLException;
4 public class VeritabaniBaglantisi
5 {
6 public static void main(String[] args) throws
ClassNotFoundException, SQLException
7 {
8 try
9 {
10 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
11 Connection baglanti = DriverManager.
getConnection(jdbc:odbc:AlisverisSites1i);
JDBC 109

12 }
13 catch (Exception e)
14 {
15 System.out.println(e.getMessage());
16 }
17 }
18 }

Eer balant kurma aamasnda SQLException veya ClassNotFoundException oluursa


aadaki iki hata mesajndan birini alrz.

[Microsoft][ODBC Driver Manager] Data source name not found and no


default driver specified

sun.jdbc.ODBC.JdbcOdbcDriver

JDBC altyaps kullanlarak veritaban sunucularnn destekledii komutlar altrlabilir. SQL


Server veritaban sunucusu zerinde veri deitirme komutlar (insert, update, delete), veri
tanm komutlar(create, alter, drop) ve sorgu komutlar (select) altrlarak uygulamann
ihtiyalarna gre bir veri eriim altyaps oluturulmas salanabilir.

Veri kayna zerinde altrlacak ifadeler, Connection nesnesi araclyla oluturulur. Conne-
ction nesnesinin createStatement() metodu ile oluturulan Statement nesnesi veritabanna
SQL ifadelerini gndermek amacyla kullanlr. Statement nesnesi olutuktan sonra, bu nesnenin
sahip olduu executeXxx metodlar ile SQL ifadeleri veritaban sunucusu zerinde altrlr.
Connection nesnesini sahip oldu metodlarla Statement tipinden baka tiplerde ifadeler de olu-
turulabilir. (rnein BLOB, XML..)

Veri Deitirme Komutlar (insert, update, delete)


JDBC ktphanesi kullanlarak veritaban zerinde insert, update, delete gibi veri ile ala-
kal komutlar altrmak iin genellikle Statement nesnesinin executeUpdate komutlar kullanlr.
executeUpdate komutlar, veritaban zerinde altrlan ifadeden etkilenen kayt saysn tam
say deeri olarak dndrr ve ADO.Net mimarisinde bulunan Command nesnesinin Execute-
NonQuery metoduna benzerlik gsterir.

rnek Uygulama 7.3de verdiimiz kod blounda veritabanna tane mteri ve be tane rn
eklenmektedir. Tablolarda bulunan xxxID alanlar identity olarak tanmlandndan, deerleri oto-
matik olarak ve birer birer artarak verilir. Bu sebepten dolay insert ifadesinin iinde xxxID alanla-
rnn bulunmas hata olumasna neden olur.

rnek Uygulama 7.3:

1 import java.sql.Connection;
2 import java.sql.DriverManager;
3 import java.sql.SQLException;
4 import java.sql.Statement;
5 public class VeritabaniBaglantisi
6 {
7 public static void main(String[] args) throws
ClassNotFoundException, SQLException
8 {
9 try
110 Blm 7

10 {
11 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
12 Connection dbConnection = DriverManager.
getConnection(jdbc:odbc:AlisverisSitesi);
13 Statement staInsert = dbConnection.
createStatement();
14 staInsert.executeUpdate(INSERT INTO
Musteri(ad, soyad) VALUES (Yaln, Kaya));
15 staInsert.executeUpdate(INSERT INTO
Musteri(ad, soyad) VALUES (Erkut, Kutlar));
16 staInsert.executeUpdate(INSERT INTO
Musteri(ad, soyad) VALUES (Hasan, Polat));
17 staInsert.executeUpdate(INSERT INTO
Urun(urunAdi, fiyat) VALUES (1GB Ram, 40));
18 staInsert.executeUpdate(INSERT INTO
Urun(urunAdi, fiyat) VALUES (3 GHz CPU, 80));
19 staInsert.executeUpdate(INSERT INTO
Urun(urunAdi, fiyat) VALUES (2 GB USB Bellek, 30));
20 staInsert.executeUpdate(INSERT INTO
Urun(urunAdi, fiyat) VALUES (256 MB Ekran Kart, 20));
21 staInsert.executeUpdate(INSERT INTO
Urun(urunAdi, fiyat) VALUES (DVD Writer, 45));
22 staInsert.close();
23 }
24 catch (Exception e)
25 {
26 System.out.println(e.getLocalizedMessage());
27 }
28 }
29 }

Kodun aklamas: JDBC srcs alma zamannda bulunduktan sonra daha nce olutu-
rulan AlisverisSitesi isimli ODBC kayna araclyla AlisverisSitesi veritaban zerinde insert
ifadeleri altrld. Statement nesnesinin ii bittikten sonra kapatlmas, alnan sistem ve verita-
ban kaynaklarnn geri verilmesini salar. Uygulamann almas aamasnda bir hata olumaz-
sa arayz zerinde herhangi bir mesaj olumaz. Gerek bir uygulamada rn ve mteri bilgileri
Java kodunun iinde girilmez, web veya iletim sistemi ortamnda alan bir kullanc arayz
araclyla kullancdan alnr. lerleyen sayfalarda, Swing grsel programlama ktphanesini kul-
lanarak benzer bir uygulama gelitireceiz.

Veri Sorgulama Komutlar (Select)


Select komutunun Java ortamndan veritaban sunucusu zerinde altrlmas iin benzer nes-
neler oluturulur. letim sistemi zerinde bulunan JDBC srcsne ulaldktan sonra ODBC
kaynana balanlr, bu balant zerinden Statement nesnesi oluturulur ve Statement nesne-
sinin executeXxx komutlarndan biri altrlr. Veritabanndan tek bir tam say deikeni yerine
birden fazla satr ve stndan oluabilen bir deer kmesi dndnden, select ifadelerinin
altrlmas insert, update, delete ifadelerinin altrlmasndan farkldr. executeXxx ko-
mutlar select ifadelerini veritabanna gndermek iin kullanldnda geriye bir sonu kmesi
(result set) dndrr. Bu sonu kmesi veri kaynana bal olarak alan tek ynl bir iareti
JDBC 111

yapsdr ve ADO.Net yapsnda bulunan xxxDataReader snflarnn Java ortamndaki karl-


dr. Sonu kmesi alndktan sonra kmenin sonuna gelene kadar okuma ilemi tekrar edilir ve
bu ilem dngler araclyla gerekletirilir.
AlisverisSitesi veritabannda bulunan Urun tablosundaki verileri okuyalm:

rnek Uygulama 7.4:

1 import java.sql.Connection;
2 import java.sql.DriverManager;
3 import java.sql.ResultSet;
4 import java.sql.SQLException;
5 import java.sql.Statement;
6 public class Urunler
7 {
8 public static void main(String[] args) throws
ClassNotFoundException, SQLException
9 {
10 try
11 {
12 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
13 Connection dbConnection = DriverManager.
getConnection(jdbc:odbc:AlisverisSitesi);
14 Statement staSelect = dbConnection.
createStatement();
15 ResultSet resultSet = staSelect.
executeQuery(SELECT urunID, urunAdi, fiyat FROM Urun);
16 while(resultSet.next())
17 {
18 System.out.print(resultSet.
getInt(urunID));
19 System.out.print(\t + resultSet.
getString(urunAdi) + \t\t);
20 System.out.println(resultSet.
getDouble(fiyat));
21 }
22 staSelect.close();
23 }
catch (Exception e)
{
System.out.println(e.getLocalizedMessage());
}
}
}

Kodun aklamas: Daha nceki uygulamada yaptmz gibi JDBC srcsn bulduktan sonra
ODBC veri kaynana balanty kurduk ve balant zerinden Statement nesnesini oluturduk.
executeUpdate() metodu yerine executeQuery() metodunu yazdmzda geri dn ti-
pinin ResultSet olduunu grrr. Bu durum, veritaban sunucusu zerinde alan ifadenin bir
deer kmesi dndrebileceini gsterir. executeQuery metoduna parametre olarak SELECT
112 Blm 7

urunID, urunAdi, fiyat from Urun eklindeki SQL ifadesini yazdmzdan dolay exe-
cuteQuery metodu Urun tablosundaki btn verileri sorgulayarak ResultSet cinsinden bir nesne
oluturur ve bu nesnenin veri kaynana dorudan bal olmasn salar. Bu noktadan sonra veri
kaynana bal durumda olan ResultSet nesnesi ile veriler zerine tek ynl ve salt okunur bir
biimde gezebilirir.

Uygulama alt zaman rnek Uygulama 7.5teki gibi bir kt alnr:

rnek Uygulama 7.5:

1 1GB Ram 40.0


2 3 GHz CPU 80.0
3 2 GB USB Bellek 30.0
4 256 MB Ekran Karti 20.0
5 DVD Writer 45.0

Parametreli SQL fadelerinin altrlmas


JDBC ktphanesi komutlarn kullanarak parametreli SQL ifadeleri de altrlabilir. ADO.Net
ktphanesi kullanlarak altrlan SQL sorgularnda @ karakteri ile balayan parametrelerin
tanmlanmas gibi JDBC mimarisinde ? karakteri ile parametreler oluturulur. ADO.Nette oldu-
u gibi parametre adnn belirtilmesine gerek yoktur, parametreler srayla eklenirse sorgu doru
ekilde alr. Parametresiz SQL ifadelerinin altrlmas iin Statement nesnesi kullanlmasna
karn parametreli SQL ifadelerinin altrlmas iin PreparedStatement nesnesi kullanlr.
Daha nce bahsettiimiz gibi veritabanna gnderilen ve sorgularn snrlandrlmasn salayan
veriler kullanc arayznden alnabilir. Kullanc tarafndan veri giriinin yapld durumlarda kt
niyetli kullanclarn sisteme zarar vermesini engellemek iin parametrik sorgularn olutulmas
gerekir.

Bir SQL ifadesinin parametreli olarak Java ortamnda altrlmasn ve sorgu sonucunda dnen
deer kmesinin ekranda gsterilmesini salayan kod rnek Uygulama-7.6da gsterilmitir.

rnek Uygulama 7.6:

1 import java.sql.Connection;
2 import java.sql.DriverManager;
3 import java.sql.PreparedStatement;
4 import java.sql.ResultSet;
5 import java.sql.SQLException;
6 public class ParametreliSqlSorgusu
7 {
8 public static void main(String[] args) throws
ClassNotFoundException, SQLException
9 {
9 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
10 Connection dbConnection = DriverManager.getConnection(jdbc:
odbc:AlisverisSitesi);
11 PreparedStatement statement = dbConnection.
prepareStatement(SELECT * FROM Urun WHERE fiyat > ? AND fiyat <
?);
12 statement.setDouble(1, 20);
13 statement.setDouble(2, 60);
JDBC 113

14 ResultSet resultSet = statement.executeQuery();


15 while(resultSet.next())
16 {
17 System.out.println(resultSet.getInt(urunID) +
+ resultSet.getString(urunAdi) + + resultSet.
getDouble(fiyat));
18 }
19 statement.close();
20 }
21 }

Kodun Aklamas: Select ifadesi iki tane parametre ile snrlandrlarak belirli bir fiyat aral-
ndaki rnlerin getirilmesi salanmtr. PreparedStatement nesnesi, Connection nesnesi
tarafndan oluturulur. Select ifadesinin iinde bulunan ? karakterleri parametrelerin bulunaca-
yerlerdir ve bu parametre deerleri PreparedStatement nesnesinin setXxx metodlar ile
verilir. rneimizde iki tane fiyat parametresine deer vermek amacyla PreparedStatement
nesnesinin setDouble metodunu kullandk. setXxx metodlarnn ilk parametresi, veritabanna
gnderilecek sorgunun iinde bulunan parametresinin indeksini belirtir. SELECT * FROM Urun
WHERE fiyat > ? AND fiyat < ? sorgusunda ilk parametre deerini 20, ikinci parametre
deerini 60 olarak verdik. Bu aamadan sonra, parametresiz ifadelerin altrlmasnda yapt-
mz gibi PreparedStatement nesnesinin executeXxx metodlarndan birini altrarak a-
ltrlacak ifadeyi veritaban sunucusuna gndeririz. rnekte Select ifadesi kullandmz iin,
dnen veri kmesini ResultSet nesnesi araclyla aldk ve ekrana bastk. Uygulama altrld-
nda oluan ekran kts rnek Uygulama 7.7deki gibidir:

rnek Uygulama 7.7:

1 1GB Ram 40.0


3 2 GB USB Bellek 30.0
5 DVD Writer 45.0

Stored Procedurelerin altrlmas


Stored procedureler veritaban sunucular zerinde bulunan ve farkl veritaban ynetim sistemi
yazlmlarnda farkl biimlerde oluturulan prosedrel programlama yaplardr. Genelde i man-
tnn bir blmnn uygulamadan alnp veritaban sunucusuna aktarlmas amacyla kullanlr-
lar. Stored procedure yaplar parametre kullanlarak altrld iin ve yetkilendirme seviyeleri
veritaban tablolarndan farkl olarak ayarlanabildii iin uygulama gvenliinin arttrlmasn da
salar. JDBC ktphanesi ile stored procedureleri altrmak iin Connection nesnesi zerinden
bir CallableStatement nesnesi oluturulur.

rnek veritabanmzda bulunan rn ve mteri tablolarna veri eklemek amacyla kullanmak iin
iki tane stored procedure oluturalm.

rnek Uygulama 7.8:

1 CREATE PROC insUrun


2 @urunAdi VARCHAR(20),
3 @fiyat MONEY
4 AS
5 INSERT INTO Urun (urunAdi, fiyat)
6 VALUES (@urunAdi, @fiyat)
7 GO
114 Blm 7

8 CREATE PROC insMusteri


9 @ad VARCHAR(20),
10 @soyad VARCHAR(30)
11 AS
12 INSERT INTO Musteri (ad, soyad)
13 VALUES (@ad, @soyad)
14 GO

rnek Uygulama 7.8de verdiimiz SQL ifadeleri ile oluturulan stored procedureleri altrmak
iin aadaki gibi bir Java uygulamas oluturabiliriz.

rnek Uygulama 7.9:

1 import java.sql.CallableStatement;
2 import java.sql.Connection;
3 import java.sql.DriverManager;
4 import java.sql.SQLException;
5 public class StoredProcedure
6 {
7 public static void main(String[] args) throws
ClassNotFoundException, SQLException
8 {
9 try
10 {
11 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
12 Connection dbConnection = DriverManager.
getConnection(jdbc:odbc:AlisverisSitesi);
13 CallableStatement staInsertUrun =
dbConnection.prepareCall({call insUrun(?, ?)});
14 staInsertUrun.setString(1, Toshiba M70
Notebook);
15 staInsertUrun.setDouble(2, 1200);
16 int rowCount = staInsertUrun.executeUpdate();
17 if(rowCount == 0)
18 {
19 System.out.println(rn eklenemedi);
20 }
21 else
22 {
23 System.out.println(rn eklendi);
24 }
25 CallableStatement staInsertMusteri =
dbConnection.prepareCall({call insMusteri(?, ?)});
26 staInsertMusteri.setString(1, Ahmet);
27 staInsertMusteri.setString(2, Balaban);
28 rowCount = staInsertUrun.executeUpdate();
29 if(rowCount == 0)
JDBC 115

30 {

31 System.out.println(Mteri eklenemedi);

32 }

33 else

34 {

35 System.out.println(Mteri eklendi);

36 }

37 staInsertUrun.close();

38 staInsertMusteri.close();

39 }

40 catch(Exception e)

41 {

42 System.out.println(e.getMessage());

43 }

44 }

45 }

Kodun Aklamas: Veritaban balantsnn salanmas iin gereken ayarlar yaptktan sonra
stored procedure altrmak iin Connection nesnesi zerinden iki tane CallableState-
ment nesnesi oluturduk. Bu nesnelerden biri insUrun stored procedurenn altrlmas iin,
dieri insMusteri stored procedurenn altrlmas iin gerekli. Stored procedure arsnn
yaplmas iin {call sp_name(?, ..)} ifadesi kullanlr. Bu ifadede sp_name metni yerine
altrlacak stored proceduren ad yazlr. Stored procedure altrmak iin gereken para-
metreler daha nce yaptmz gibi Statement nesnelerinin setXxx metodlar kullanlarak verilir.
insMusteri prosedrn altrmak iin mterinin ad ve soyad deerlerini, insUrun prose-
drn altrmak iin rnn ad ve fiyat deerlerini parametre olarak verdikten sonra ifadeleri
executeUpdate metodu ile altrdk ve etkilenen kayt saysn kontrol ederek rn ve mteri
verilerinin veritabanna eklenip eklenmedii bilgisini ekrana bastk. Uygulama altrld zaman
rnek Uygulama 7.10da olduu gibi bir kt alnrsa rn ve mteri bilgilerini baaryla ekledik
demektir.

rnek Uygulama 7.10:

1 rn eklendi
2 Mteri eklendi

Veritaban Eriimi iin Bileen Oluturulmas:


Veritaban sunucular zerinde altrlacak metodlar merkezi bir package altnda toplanrsa,
veritaban sunucusu zerinde herhangi bir deiiklik olmas durumunda karlalacak bakm
maliyeti drlebilir. Bunun yannda uygulamann gelitirilmesi aamasnda veritaban konfig-
rasyonu ve eitli komutlarn veritaban sunucusu zerinde altrlmas daha kolay bir ekilde
gerekletirilebilir. Bu amala kullanlabilecek temel bir veri eriim bileeni oluturalm.
116 Blm 7

imdiye kadar kullandmz veritaban eriim yntemlerini bir snf altnda toplayabiliriz. Olutura-
camz bileenin farkl veritaban tablolar ile kullanlabilmesi ve geri dn deerlerini temel veri
tipleri eklinde dndrebilmesi gerekir. Alt yapda kullanlan veritaban sunucusunun deimesi
riskinin olduu senaryolarda, veritaban sistemine baml olmayan veri tiplerinin kullanlmas b-
yk avantaj salayacaktr.

Veri eriim bileeninin kodu aada verilmitir. Bileen ayr bir Java paketi (package) eklinde
oluturulmutur ve bu bileeni baka bir yerde kullanmak iin import anahtar kelimesi ile uygula-
maya eklemek gerekir.

rnek Uygulama 7.11:

1 package dbAccess;
2 import java.sql.Connection;
3 import java.sql.DriverManager;
4 import java.sql.PreparedStatement;
5 import java.sql.ResultSet;
6 import java.sql.ResultSetMetaData;
7 import java.sql.SQLException;
8 import java.sql.Statement;
9 import java.util.ArrayList;
10 public class DbConnection
11 {
12 private Connection connection;
13 public DbConnection() throws SQLException,
ClassNotFoundException
14 {
15 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
16 connection = DriverManager.getConnection(jdbc:odbc:
AlisverisSitesi);
17 }
18 public int NonQuery(String commandText) throws
SQLException
19 {
20 Statement stNonQuery = connection.createStatement();
21 int rowCount = stNonQuery.executeUpdate(commandText)
;
22 stNonQuery.close();
23 return rowCount;
24 }
25 public int NonQuery(String commandText, Object[]
parameterValues) throws SQLException
26 {
27 PreparedStatement pstNonQuery = connection.prepareSt
atement(commandText);
28 for (int parameterIndex = 0; parameterIndex <
parameterValues.length; parameterIndex++)
29 {
JDBC 117

30 pstNonQuery.setObject(parameterIndex + 1,
parameterValues[parameterIndex]);
31 }
32 int rowCount = pstNonQuery.executeUpdate();
33 pstNonQuery.close();
34 return rowCount;
35 }
36 public ArrayList ReturnArrayList(String commandText)
throws SQLException
37 {
38 ArrayList result = new ArrayList();
39 Statement stQuery = connection.createStatement();
40 ResultSet resultSet = stQuery.executeQuery(commandTe
xt);
41 ResultSetMetaData metaData = resultSet.
getMetaData();
42 int columnCount = metaData.getColumnCount();
43 while(resultSet.next())
44 {
45 String[] row = new String[columnCount];
46 for(int columnIndex = 0; columnIndex <
columnCount; columnIndex++)
47 {
48 row[columnIndex] = resultSet.
getString(columnIndex + 1).toString();
49 }
50 result.add(row);
51 }
52 stQuery.close();
53 return result;
54 }
55 public ArrayList ReturnArrayList(String commandText,
Object[] parameterValues) throws SQLException
56 {
57 ArrayList result = new ArrayList();
58 PreparedStatement pstQuery = connection.prepareState
ment(commandText);
59 for (int parameterIndex = 0; parameterIndex <
parameterValues.length; parameterIndex++)
60 {
61 pstQuery.setObject(parameterIndex + 1, paramet
erValues[parameterIndex]);
62 }
63 ResultSet resultSet = pstQuery.executeQuery();
64 ResultSetMetaData metaData = resultSet.
getMetaData();
118 Blm 7

65 int columnCount = metaData.getColumnCount();


66 while(resultSet.next())
67 {
68 String[] row = new String[columnCount];
69 for(int columnIndex = 0; columnIndex <
columnCount; columnIndex++)
70 {
71 row[columnIndex] = resultSet.
getString(columnIndex + 1).toString();
71 }
72 result.add(row);
73 }
74 pstQuery.close();
75 return result;
76 }
77 }

Kodun aklamas: Veri eriim mantn uygulamadan ayrmak iin dbAccess isimli bir packa-
ge iinde DbConnection isimli bir snf oluturduk. Geri dnsz sorgular altrmak iin iki
tane metod ve deer kmesi dndren sorgular altrmak iin iki tane metod yazdk. ki ilev
iin de ikier tane metod yazmamzn sebebi SQL ifadelerini altrrken parametre eklenmesine
olan salamaktr. Snfta bulunan nitelikleri ve metodlar ksaca aklayalm:

Connection connection: Veritabanna balanmak amacyla kullanlan nesne. Btn State-


ment nesneleri Connection nesnesi tarafndan oluturulur.

DbConnection(): DbConnection snfnn yapc metodu. JDBC srcsn bulmak ve Con-


nection nesnesine ilk deerini vermek iin kullanlr.

int NonQuery(String commandText): Parametresiz ve veri kmesi dndrmeyen SQL ifa-


delerinin altrlmas amacyla kullanlr. commandText parametresi ile, altrlacak olan SQL
ifadesi alnr. Statement nesnesi oluturulduktan sonra executeUpdate komutu altrlacak
ilemden etkilenen kayt says veritaban sunucusundan alnr ve dndrlr.

int NonQuery(String commandText, Object[] parameterValues): Veritaban ze-


rinde altrlacak olan SQL ifadesi commandText parametresi ile, sorgunun iinde bulunan
parametrelerin deerleri Object dizisi cinsinden parameterValues parametresiyle alnr. Con-
nection nesnesi zerinden PreparedStatement nesnesi oluturulduktan sonra parameter-
Values dizisinin eleman says kadar parametre setValue(Object) metodu ile PreparedS-
tatement nesnesine eklenir . SQL ifadesi altrldktan sonra veritabannda etkilenen kayt
says geri dndrlr.

ArrayList ReturnArrayList(String commandText): Veritaban zerine altrlan Se-


lect ifadesinin sonucunda dnen deer kmesi ResultSet nesnesi zerinden alnr. ResultSet-
MetaData nesnesi, veritabanndan dnen sonu kmesinin stun sayn almak iin kullanlr.
Veritabanndan dnen deerleri uygulamaya gndermek iin ArrayList nesnesi kullanlmtr.
ArrayList nesnesinin her bir kayd, veritabanndan gelen bir satr veriyi ierir. Bir veri satrn
tutmak iin String dizisi kullanlmtr ve String dizisinin eleman says ResultSetMetaDa-
ta nesnesinden alnan stun saysna gre belirlenir. ResultSet nesnesinin iindeki kayt says
kadar String dizisi oluturulur ve ArrayListe eklenir. resultSet.getString() metodu
columnIndex+1 parametresiyle altrlr. Bunun sebebi, .Net ortamndan farkl olarak para-
metre ve stun indekslerinin 1 deerinden balamasdr.
JDBC 119

ArrayList ReturnArrayList(String commandText, Object[] paramaterValu-


es): Parametreli select ifadelerinin altrlmas iin bu metod kullanlr. parameterValues
Object dizisi araclyla select ifadesinin parametre deerleri alnr ve PreparedStatement
nesnesine setObject() metodu yardmyla eklenir. Bir nceki metod yapsnda olduu gibi
ArrayList nesnesi oluturulur. ArrayList nesnesinin her bir kayd veritabanndan gelen bir
satr tutan String dizisinden oluur.

rnek Uygulama 7.12:

1 import java.sql.SQLException;
2 import java.util.ArrayList;
3 import dbAccess.DbConnection;
4 public class VeriErisimi
5 {
6 public static void main(String[] args) throws
ClassNotFoundException, SQLException
7 {
8 DbConnection connection = new DbConnection();
9 // Yeni bir rn veritabanna kaydediliyor
10 int rowCount = connection.NonQuery(INSERT INTO Urun
(urunAdi, fiyat) VALUES (HP 870cxi Yazc, 70));
11 if(rowCount != 0)
12 {
13 System.out.println(rn kaydedildi);
14 }
15 else
16 {
17 System.out.println(rn kaydedilemedi);
18 }
19 // Yeni bir mteri veritabanna kaydediliyor
20 Object[] musteriInsertParameters = new Object[2];
21 musteriInsertParameters[0] = Veli;
22 musteriInsertParameters[1] = Karaman;
23 rowCount = connection.NonQuery(INSERT INTO Musteri
(ad, soyad) VALUES (?, ?), musteriInsertParameters);
24 if(rowCount != 0)
25 {
26 System.out.println(Mteri kaydedildi);
27 }
28 else
29 {
30 System.out.println(Mteri kaydedilemedi);
31 }
32 System.out.println();
33 // Veritabanndan belirli bir fiyat aralndaki
rn bilgileri ekilip ekrana basld
34 Object[] urunSelectParameters = new Object[2];
120 Blm 7

35 urunSelectParameters[0] = 30;
36 urunSelectParameters[1] = 60;
37 ArrayList arrUrun = connection.
ReturnArrayList(SELECT * FROM Urun WHERE Fiyat BETWEEN ? AND ?,
urunSelectParameters);
38 for (Object object : arrUrun)
39 {
40 String[] urun = (String[])object;
41 for(int i = 0; i < urun.length; i++)
42 {
43 System.out.print(urun[i] + \t);
44 }
45 System.out.println();
46 }
47 System.out.println();
48 // Veritabanndan btn mteri bilgileri ekilip
ekrana basld
49 ArrayList arrMusteri = connection.
ReturnArrayList(SELECT * FROM Musteri);
50 for (Object object : arrMusteri)
51 {
52 String[] musteri = (String[])object;
53 for(int i = 0; i < musteri.length; i++)
54 {
55 System.out.print(musteri[i] + \t);
56 }
57 System.out.println();
58 }
59 }
60 }

Uygulamada; mteri kayd eklenmesi iin parametreli NonQuery metodu, rn kayd eklen-
mesi iin parametresiz NonQuery metodu, belirli bir fiyat aralndaki rnlerin ekilmesi iin
parametreli ReturnArrayList metodu, btn mteri bilgilerinin ekilmesi iin parametresiz
ReturnArrayList metodu kullanlmtr. Uygulama altrldnda aadaki gibi bir ekran
kts alnr.

rnek Uygulama 7.13:

rn kaydedildi
Mteri kaydedildi

1 1GB Ram 40.0000


2 2 GB USB Bellek 30.0000
3 DVD Writer 45.0000

1 Yalin Kaya
2 Erkut Kutlar
3 Hasan Polat
4 Veli Karaman
8 JSP
8 JSP
JSP Teknolojisinde Kullanlan Etiketler

JSP Direktifleri

JSP Script Etiketleri

Form Verilerinin Kullanlmas

Durum Ynetimi
JSP
Java platformunu kullanarak web uygulamalar gelitirmek iin JSP (Java Server Pages) tekno-
lojisi kullanlr. JSP, .Net ortamnn web gelitirme teknolojisi olan ASP.Net mimarisinin Java or-
tamndaki karldr. ASP.Net uygulamalar gelitirirken kullanlan code-behind mimarisini JSP
ortamnda dorudan bir karl olmadndan Java kodlar ile HTML kodlar ayn sayfann iinde
bulunur. JSP uygulamalarnda i mantn web sayfalarndan ayrmak ve uygulamalar bileen-
lere blmek iin Java tabanl Servlet mimarisi kullanllr. Bu blmde JSP uygulamas gelitirme
ve Servlet bileenleri oluturmay reneceiz.

JSP uygulamalarn ve Servlet bileenlerini altrmak iin aadaki adresten Apache Tomcat
sunucusunun iletim sisteminize uygun olan versiyonunu indirebilirsiniz. http://tomcat.apache.
org/download-60.cgi

http://apache.karegen.com/tomcat/tomcat-6/v6.0.14/bin/apache-tomcat-6.0.14.exe

Windows binary formatnda indirilen Tomcat sunucusunun kurulumu aada adm adm gste-
rilmitir.

Kurulum standart Windows uygulamas kurulum biimindedir.

Uygulamay kurmadan nce szlemenin kabul edilmesi gerekir.


124 Blm 8

Examples seenei iaretlenirse JSP ve Servlet bileenleriyle ilgili rnek uygulamalar yerel a
zerinde altrlabilir.

Kurulum iin standart dizinden farkl bir dizin de seilebilir. Uygulamalarda kullanlan Tomcat,
standart dizine kurulmutur.

Kurulumun bu aamasnda Tomcat sunucusunun alaca port numarasnn belirlenir ve admin


kullancs iin ifre oluturulur. Bilgisayarnzn 8080 numaral portunu kullanan baka bir uygu-
lama yoksa Tomcat sunucusunun 8080 portunu kullanmasn salayabilirsiniz. Uygulamalarda
kullanlan Tomcat sunucusu 8080 portu zerinde almaktadr. Admin kullancsnn ifresinin
bo braklmas genel olarak tavsiye edilmez. zellikle zerinde aktif bir biimde kullanlan uy-
gulamalar alan bir sunucunun admin ifresinin bo olmas uygulamalarda ve sistemde ciddi
gvenlik aklarna neden olur.
JSP 125

Tomcat sunucusu almak Java platformunun 5.0 srmne ihtiya duyduundan JRE 5.0 uy-
gulamasnn yeri belirtilmelidir. Java motoru standart olarak kurulmusa bu dizin otomatik olarak
belirlenir, aksi takdirde bilgisayar zerindeki yerinin manuel olarak belirtilmesi gerekir.

Tomcat sunucusunun kurulumu tamamland. Run Apache Tomcat seenei iaretli olarak bra-
krsa Tomcat sunucusuna ait Windows servisi alr.
126 Blm 8

Tomcat kurulumu baarl olduysa ve ilikili Windows servisi altrldysa bilgisayarn sa alt
kesinde Tomcate ait ikon belirir. Tomcat Windows servisi ile ilgili ayarlar bu ikona ift tk-
landktan sonra kan pencerede yaplabilir. Tomcat Windows servisi varsaylan olarak manuel
altrlacak ekilde ayarlanr. letim sisteminin her alnda Tomcat servisinin otomatik olarak
balamas iin servisin ekil 8deki gibi ayarlanmas gerekir.

Tomcat servisinin bilgisayarn her alnda otomatik olarak almas iin Startup Type see-
nei Automatic olarak deitirilir.

Tomcat sunucusunun kurulumu srasnda farkl bir dizin belirtmediyseniz C:\Program Files\Apa-
che Software Foundation\Tomcat 6.0 dizinine kurulacaktr. Bu dizinin altndaki webapps dizininin
altnda bulunan ROOT dizini JSP uygulamalarnn barndrld standart dizindir. Tomcat konfig-
rasyonunu deitirmek iin Tomcat ana dizininin altndaki conf dizininde bulunan konfigrasyon
dosyalar kullanlabilir.

Webapps dizininin altnda bulunan ROOT dizininin iinde yeni bir dizin oluturalm ve adn Il-
kOrnek olarak deitirelim. Tomcat sunucumuza http://localhost:8080 adresinden, IlkOrnek ad-
n verdiimiz web uygulamamza ise http://localhost:8080/IlkOrnek adresi zerinden ulaabiliriz.
Uygulamamz henz bir JSP sayfasna sahip olmad iin web tarayacs zerinden bu adrese
ulamaya alrsak hata mesaj alrz.

Notepad veya benzer bir metin editr kullanarak IlkOrnek dizininin iinde bo bir metin dosyas
oluturalm ve adn ilkornek.jsp olarak deitirelim. Dosyann uzantsnn .jsp olmas gerektiini
unutmamalyz. rnek Uygulama 8.1deki kod blounu bu dosyann iine yazarak dosyay kay-
dedelim.

rnek Uygulama 8.1:

1 <%
2 out.println(Ilk Ornek);
3 %>

Tomcat kurulumu baarl bir ekilde tamamlandysa web taraycsnn adres ksmna http://lo-
calhost:8080/IlkOrnek/ilkornek.jsp yazp enter tuuna bastmzda ekil-9daki gibi bir sayfann
almas gerekir.
JSP 127

ekil 9

Erimeye altmz JSP sayfasnn adnn kk-byk harf duyarl olduuna dikkat edelim.
http://localhost:8080/IlkOrnek/ilkornek.jsp sayfas yerine http://localhost:8080/IlkOrnek/IlkOrnek.
jsp sayfasna ulamaya alrsak ekil 10daki gibi bir hata mesaj alrz.

ekil 10: Kk-byk harf duyarllndan kaynaklanan sayfa bulunamad hatas.

Oluturduumuz JSP sayfasnn koduna bir gz atarsak <% ve %> etiketlerini grrz. Bu etiket-
lerin arasna yazdmz btn kod bloklar Java kodu olarak yorumlanr JSP scriptleri yazmak
iin kullanlr. letim sistemi zerinde alan Java uygulamalarnda kullanlan System.out.
println() komutu JSP ortamnda out.println() eklini alr ve istemciye (client) metin k-
ts vermek iin kullanlr.

ROOT dizininin altnda JspOrnekleri adnda bir dizin oluturalm ve bundan sonraki rnekleri bu
dizinin iine kaydedelim.

Java dilinde standart olarak bulunan komutlar JSP sayfalar oluturulurken de kullanlr. Az nce
yazdmz metni be defa yazan bir program for dngs kullanarak oluturalm. Dongu.jsp
adnda bir jsp sayfasn Notepad kullanarak JspOrnekleri dizinine kaydedelim. Dongu.jsp sayfa-
sn oluturmak iin kullanlan kod aadaki gibidir.

rnek Uygulama 8.2:

1 <%
2 for(int i = 0; i < 5; i++)
3 out.println(Ilk Ornek<br>);
4 %>

Kodu incelersek, JSP sayfalarnda Java ve HTML kodlarnn bir arada bulunaibildiini grrz.
out.println() komutunun sonunda kullandmz <br> etiketi ktnn bir alt satra gemesini
128 Blm 8

salar ve standart HTML etiketlerindendir. Dng yapsnn Java dilinin standart for dngs
olduunu gryoruz.

http://localhost:8080/JspOrnekleri/Dongu.jsp adresi zerinden sayfay altrdmzda ekil


11deki gibi bir grnm elde ederiz.

ekil 11: Dng kullanm.

JSP ortam; ASP, PHP, ASP.Net, vb. teknolojileri gibi sunucu tarafnda alr. Bunun anlam,
JSP kodunun sunucunun zerinde almas ve istemci tarafnda HTML kodunun gnderilmesi-
dir. JSP sayfalarna http://Adres/SayfaAdi.jsp eklinde ulalsa da istemci zerinde alan web
taraycsna saf HTML ve gerekirse Javascript kodu gelir. Web ortamnda alan btn sunucu
tabanl teknolojilerin web tarayclar tarafndan yorumlanabilmesinin sebebi de budur. Dongu.
jsp sayfasna sa tkladmzda karmza kan menden view source komutunu altrrsak
bahsedilen zellik daha iyi anlalr. stemci tarafna gelen HTML kodu aadaki gibidir.

Ilk Ornek<br>

Ilk Ornek<br>

Ilk Ornek<br>

Ilk Ornek<br>

Ilk Ornek<br>

Karmza kan HTML kodunda ayn ifade be kere yazlmtr ve ifadeler arasnda bulunan <br>
etiketinden dolay kt be satr halinde grnmektedir. Sunucu tarafnda alan JSP sayfas
zerinde kullanlan dng ve <%, %> etiketleri istemci tarafnda grnmez.

JSP Teknolojisinde Kullanlan Etiketler


JSP Direktifleri
JSP sayfalarnn zelliklerini deitirmek amacyla kullanlan yaplardr ve balarnda @ karak-
teri bulunur. JSP direktifleri istemciye kt gndermez. En ok Page direktifi kullanlr. Page
direktifi ile sayfann script dili, durum ynetimi, buffer gibi zellikleri ile ilgili ayarlar yaplr, harici
ktphanelerin sayfa tarafndan kullanlmas salanr. rnein;
<%@ page session=true import=java.util.* %> direktifi ile sayfada durum y-
netimi etkin hale getirilir ve java.util paketinin iisnde bulunan bileenler sayfaya eklenerek bu
pakette bulunan snflarn sayfa tarafndan kullanlmas salanr. session=true yazmasak
bile varsaylan olarak sayfann session destei aktr, kapatmak iin session=false yaz-
mamz gerekir.
JSP 129

JSP Script Etiketleri


Script etiketleri, JSP sayfalarnda asl ii yapan etiketlerdir. Sayfada bulunacak Java kodlar script
etiketleri iine yazlr, sunucu bu etiketler iinde bulunan kodlar Java kodu olarak alglar. JSPde
eit script etiketi bulunur.

Tanmlama etiketleri: Java deikenlerini tanmlamak iin kullanlr ve <%! ... %> eklinde
oluturulur.

Scriptlet etiketleri: Java ifadelerinden oluan kod paralarn altrmak iin kullanlr ve <% ...
%> eklinde oluturulur.

fade etiketleri: Btn Java ifadelerini altrmak iin kullanlr ve <%= ... %> eklinde olutu-
rulur.

Bu etiketlerin dnda, JSP sayfalar iinde yorum satr oluturmak iin <%-- ... --% etiketi
kullanlr.

Form Verilerinin Kullanlmas


JSP uygulamalarnda sayfalar arasnda veri tamak iin HTML standartlarnn iinde bulunan
POST veya GET metodlar kullanlabilir. Herhangi bir HTML veya JSP sayfasnn iinde olutu-
rulan form alannn iinde bulunan kontrollerin verileri GET veya POST ilemi srasnda zerinde
allan sayfaya veya farkl bir sayfaya gnderilir. Basit bir HTML sayfasndan bir JSP sayfasna
POST metodu araclyla verilerin gnderilmesi ilemi aadaki gibi yaplabilir.

FormOrnegi.html sayfasn oluturan HTML kodu aadaki gibidir.

1 <html>
2 <body>
3 <form method=post action=FormData.jsp>
4 <table>
5 <tr>
6 <td>Ad:</td>
7 <td><input type=text name=txtAd /> </td>
8 </tr>
9 <tr>
10 <td>Soyad:</td>
11 <td><input type=text name=txtSoyad
/> </td>
12 </tr>
13 <tr>
14 <td><input type=submit
name=btnGonder value=Gonder /><td>
15 </tr>
16 </table>
17 </form>
18 </body>
19 </html>

HTML sayfasnda, <body> etiketinin iinde bir form oluturduk ve POST metodunu kullanaca-
mz belirttik. Formun iine eklenen submit butonunun tetiklenmesi sonrasnda form verileri
130 Blm 8

FormData.jsp sayfasna gnderilir. Bu ilem action=FormData.jsp satryla gereklenir. Kullan-


cnn ad ve soyad deerlerini girmesi forma iki tane text tipinden input ekledik. Kontrollerin ara-
yz zerinde dzgn bir ekilde grntlenmesi iin standart HTML yaplarndan biri olan <table>
etiketini kullandk. HTML sayfas aadaki gibi grnr.

ekil 12

Kullanc tarafndan veri girii yapldktan sonra Gnder butonuna tklandnda form verileri
FormData.jsp sayfasna gnderilir. FormData.jsp adnda bir JSP sayfas oluturarak gnderilen
verileri alp ileyebiliriz.

1 <%@ page import=java.util.* %>


2 <%
3 out.print(Ad: + request.getParameter(txtAd));
4 out.print(<br>Soyad: + request.getParameter(txtSoyad))
;
5 %>

Request.getParameter metodu, herhangi bir form zerinden FormData.jsp sayfasna gnderilen


verileri almak iin kullanlr. txtAd ve txtSoyad anahtarlar, FormOrnegi.html sayfasnda bulunan
text trnden veri giri elemanlarnn isim (name) deeridir. Gnder butonuna tklandktan sonra
FormData.jsp sayfas yklenir ve aadaki gibi bir grnm elde edilir.

ekil 13

HTML sayfasnda verileri gndermek iin POST yerine GET metodunu kullansak da FormData.
jsp sayfasndan verilere ayn ekilde ulaabilir. Bu durumda veriler gizli olarak deil URL zerin-
den gnderilecektir. nemli verilerin GET metodu ile gnderilmesi gvenlik asndan sakncal-
dr. GET metodu kullanldnda FormData.jsp sayfas aadaki gibi grnr:

Adres ubuunda grnen URL deerine dikkat edersek btn form verilerinin ak bir ekilde ve
saf metin formatnda aktarldn grebiliriz.
JSP 131

Durum Ynetimi
HTTP protokol durum zelliine sahip deildir. Durum mekanizmas, bir kullanc sisteme bal
kald srece verilerinin birden fazla sayfa arasnda tanabilmesine olanak verir. JSP de dier
sunucu tabanl web teknolojileri gibi kendine zel bir durum ynetimi mekanizmasna sahiptir.
JSPde durum ynetimi session nesnesiyle salanr. Session nesnesine request.getSession()
metodu araclyla ulalr. Basit bir sisteme giri sayfasyla kullancnn bilgilerini session nes-
nesine kaydeden ve uygulama iindeki farkl bir sayfadan bu bilgilere ulaan bir JSP uygulamas
yazalm:

1 <%--------- KullaniciGirisi.jsp ---------%>


2 <html>
3 <body>
4 <%
5 out.print(Session ID: + session.getId());
6 %>
7 <form method=post action=KullaniciGirisi.jsp>
8 <table>
9 <tr>
10 <td>Ad:</td>
11 <td><input type=text name=txtAd /> </td>
12 </tr>
13 <tr>
14 <td>Sifre:</td>
15 <td><input type=password name=txtSifre />
</td>
16 </tr>
17 <tr>
18 <td><input type=submit name=btnGonder
value=Gonder /><td>
19 </tr>
20 </table>
21 </form>
22 <%
23 String ad = request.getParameter(txtAd);
24 String sifre = request.getParameter(txtSifre);
25 if(ad != null && sifre != null)
26 {
132 Blm 8

27 if(ad.equals(Yalcin) && sifre.


equals(1234))
28 {
29 session.putValue(kullaniciAdi, ad);
30 response.sendRedirect(SifreDogru.jsp);
31 }
32 else
33 {
34 out.println(Kullanici adi veya sifre
hatali);
35 }
36 }
37 %>
38 </body>
39 </html>

Kullancnn kullanc ad ve ifre bilgilerini girmesi iin KullaniciGirisi.jsp adnda bir JSP sayfas
oluturduk. Bir nceki rnekten farkl olarak kullancdan gelecek bilgileri HTML sayfas yerine JSP
sayfas zerinden almay tercih ettik. Bunun sebebi, kullanc giri sayfasnda da JSP kullanmay
planlamamz. Sayfann banda kullandmz <% out.print(Session ID: + session.getId()); %>
komutuyla o anda geerli olan oturumun ID deerini kullancya gsterdik. Form etiketinin action
zelliinin KullaniciGirisi.jsp sayfasn gsterdiine dikkat edelim. Kullanc bilgilerini aldmz
sayfayla bu bilgilerin geerliliini kontrol ettiimiz sayfa ayn. Form etiketinden sonra kullancnn
girdii bilgilerin geerliliini kontrol etmek iin request.getParameter() metodu ile form verilerini
aldk. Kullanc ad ve ifre bilgilerini sayfann iinde kontrol ettik; kullanc ad olarak Yalcin,
ifre olark 1234 deerleri girilmise sisteme giri yaplabildiini varsaydk. Gerek bir uygula-
mada kullancdan girilen deerler bir veri kayna zerinden dorulanr. Eer kullanc sisteme
girmeyi baarabilirse kullanc ad deeri session nesnesine ekleniyor ve kullanc SifreDogru.
jsp sayfasna ynlendiriliyor. Sisteme giri ilemi baarsz olursa Kullanc ad veya ifre hatal
mesaj veriliyor ve ynlendirme yaplmyor. KullaniciGirisi.jsp sayfas ilk aldnda ve ifre yanl
girildiinde aadaki gibi grnr:

ekil 15: KullaniciGirisi.jsp sayfas ilk defa yklendi.

ifre yanl girildi. Sayfann yeniden yklenmesi srasnda Session nesnesinin ID deerinin de-
imedii grlyor.
JSP 133

Kullanc ad ve ifre deerlerinin doru girilmesi durumunda kullancnn ynlendirilecei Sifre-


Dogru.jsp sayfasnn kodu aada verilmitir:

<%
out.print(Kullanici adi: + session.getValue(kullaniciAdi));
out.print(<br>Session ID: + session.getId());
%>

Session nesnesine kaydedilmi olan kullanc ad deeri alnyor ve ekrana baslyor. Session
deikeninin ID deeri de ayn ekilde ekrana baslyor.

Kullanc SifreDogru.jsp sayfasna ynlendirildiinde aadaki gibi bir sayfayla karlar:

Kullanc ad ve ifre doru girildi, session nesnesinde bulunan kullanc ad deeri ve session ID
deeri grntlendi. Bu sayfadaki session ID deeriyle daha nceki sayfalardaki session ID de-
erinin ayn olduunu gryoruz. Session bilgileri btn oturum boyunca ve uygulamann btn
sayfalar arasnda geerli olduundan ID deeri de ayndr.

JSP Uygulamalarnda JDBC Kullanm:

JSP uygulamalarnn veritaban sistemleriyle iletiim kurmas iin Java platformunun JDBC ktp-
hanesi kullanlr. JDBC ktphanesi kullanarak bir rn ekleme sayfas oluturalm.

1 <%@ page import=java.util.* %>


2 <%@ page import=java.sql.Connection %>
3 <%@ page import=java.sql.DriverManager %>
4 <%@ page import=java.sql.PreparedStatement %>
5 <%@ page import=java.sql.SQLException %>
6
7 <html>
8 <body>
134 Blm 8

9 <form method=post action=UrunEkle.jsp>


10 <table>
11 <tr>
12 <td>Urun adi:</td>
13 <td><input type=text name=txtUrunAd
/> </td>
14 </tr>
15 <tr>
16 <td>Fiyat:</td>
17 <td><input type=text
name=txtUrunFiyat /> </td>
18 </tr>
19 <tr>
20 <td><input type=submit
name=btnUrunKaydet value=Kaydet /><td>
21 </tr>
22 </table>
23 </form>
24 <%
25 String urunAdi = request.getParameter(txtUrun
Ad);
26 String urunFiyat = request.getParameter(txtUr
unFiyat);
27 if(urunAdi != null && urunFiyat != null)
28 {
29 try
30 {
31 double fiyat = Double.
valueOf(urunFiyat);
32 Class.forName(sun.jdbc.odbc.
JdbcOdbcDriver);
33 Connection dbConnection =
DriverManager.getConnection(jdbc:odbc:AlisverisSitesi);
34 PreparedStatement statement =
dbConnection.prepareStatement(INSERT INTO Urun (urunAdi, fiyat)
VALUES (?, ?));
35 statement.setString(1, urunAdi);
36 statement.setDouble(2, fiyat);
37 int rowCount = statement.
executeUpdate();
38 statement.close();
39 if(rowCount == 0)
40 {
41 System.out.println(rn
kaydedilemedi);
42 }
JSP 135

43 }
44 catch(Exception e)
45 {
46 out.print(Fiyat alanina sayi
degeri girin<br>);
47 }
48 }
49 %>
50 </body>
51 </html>

rn bilgilerini veritabanna kaydetmek iin JDBC ktphanesini kullandk. Veritaban zerin-


de altrlacak olan sorgunun parametreleri kullancdan alndndan PreparedStatement snf
cinsinden bir nesne oluturarak parametrelerini verdik. rn fiyat alannn cinsi double olmas
gerektii iin fiyat alanna girilen deeri doublea evirmeye altk. Uygulamann akna gre,
fiyat alannn deeri doublea evrilebilirse sorgu altrlyor, evrilemezse kullancya hata me-
saj veriliyor. Bir nceki rnekte olduu gibi formun action deeri, yani post edildiinde verilerini
gnderecei sayfa, yine formun kendisi.

UrunEkle.jsp sayfas altrlmadan nce ve hatal veri girildiinde aadaki gibi grnr.

ekil 18

ekil 19: Fiyat alanna double tipine evrilemeyen veri girildi.

Veritabann sorgulayarak sipari bilgilerini getirmek iin JSP sayfalarmz oluturalm. ncelikle
veritaban sunucumuzun arayz programn aarak sipari ve sipari detay bilgilerini ekleyelim.

INSERT INTO Siparis (musteriID, siparisTarihi) VALUES (1,


12/2/2007)
INSERT INTO Siparis (musteriID, siparisTarihi) VALUES (1,
10/8/2007)
136 Blm 8

INSERT INTO Siparis (musteriID, siparisTarihi) VALUES (2,


5/3/2007)
INSERT INTO Siparis (musteriID, siparisTarihi) VALUES (3,
5/8/2007)
INSERT INTO SiparisDetay (siparisID, urunID, miktar) VALUES (1,
1, 1)
INSERT INTO SiparisDetay (siparisID, urunID, miktar) VALUES (1,
3, 2)
INSERT INTO SiparisDetay (siparisID, urunID, miktar) VALUES (2,
7, 1)
INSERT INTO SiparisDetay (siparisID, urunID, miktar) VALUES (3,
5, 1)
INSERT INTO SiparisDetay (siparisID, urunID, miktar) VALUES (3,
8, 3)
INSERT INTO SiparisDetay (siparisID, urunID, miktar) VALUES (4,
3, 1)

Verileri veritabanna ekledikten sonra JSP sayfalarmz oluturmaya balayabiliriz. ncelikle ve-
rilen siparileri grntlemek iin Siparis.jsp adnda bir JSP sayfas oluturalm.

1 <%@ page import=java.util.* %>


2 <%@ page import=java.sql.Connection %>
3 <%@ page import=java.sql.DriverManager %>
4 <%@ page import=java.sql.ResultSet %>
5 <%@ page import=java.sql.Statement %>
6 <html>
7 <body>
8 <%
9 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
10 Connection dbConnection = DriverManager.
getConnection(jdbc:odbc:AlisverisSitesi);
11 Statement statement = dbConnection.
createStatement();
12 ResultSet resultSet = statement.executeQuery(SELECT
siparisID, siparisTarihi, ad, soyad FROM siparis s JOIN Musteri m
ON (s.musteriID = m.musteriID));
13 out.println(Detay bilgilerini ogrenmek istediginiz
siparisin tarihine tiklayin<br><br>);
14 %>
15 <table>
16 <%
17 while(resultSet.next())
18 {
19 %>
20 <tr>
21 <td width=100><a href=SiparisDetay.
jsp?id=<%out.println(resultSet.getInt(siparisID));
JSP 137

22 %>>
23 <%
24 out.println(resultSet.getDate(siparisTarihi).
toString()); 25 %>
26 </a></td>
27 <td width=60>
28 <%
29 out.println(resultSet.getString(ad)); 28
30 %>
31 </td>
32 <td width=60><% out.println(resultSet.
getString(soyad)); 33 %>
34 </td>
35 </tr>
36 <%
27 }
38 %>
39 </table>
40 <%
41 statement.close();
42 %>
43 </body>
44 </html>

Kodun aklamas: Veritaban balants oluturulduktan sonra sipari bilgilerini ekmek amacy-
la bir select sorgusu veritaban zerinde altrlr ve geri dnen sonu kmesi ResultSet nesnesi
araclyla alnr. Verilerin dzgn bir biimde grntlenebilmesi iin <table> yaps kullanlm-
tr. ResultSet nesnesinin her bir kayd iin tabloda bir satr oluturulmutur. Bir satr stundan
oluur: lk stn sipariin verildii tarihi ierir ve SiparisDetay.jsp sayfasna balant kurmak ama-
cyla <a href> etiketinden oluur. SiparisDetay.jsp sayfasna siparis numaras URL araclyla ta-
nacandan her bir kaydn siparisID deeri ile <a href> etiketinin URL alan belirlenir. Bu alann
deeri SiparisDetay.jsp?id=... eklinde olup ... ile ifade edilen yere sipari numaras gelir. Sayfa
yklendii zaman aadaki gibi grnr.

ekil 20
138 Blm 8

Sipari tarihi alanna tklandnda alacak olan SiparisDetay.jsp sayfasnda seilen sipariin
detay bilgileri veritabanndan ekildikten sonra grntlenecektir. SiparisDetay.jsp sayfasn olu-
turan JSP kodu aadaki gibidir.

1 <%@ page import=java.util.* %>


2 <%@ page import=java.sql.Connection %>
3 <%@ page import=java.sql.DriverManager %>
4 <%@ page import=java.sql.ResultSet %>
5 <%@ page import=java.sql.Statement %>
6 <%@ page import=java.sql.PreparedStatement %>
7 <html>
8 <body>
9 <%
10 if(request.getParameter(id) == null)
11 response.sendRedirect(Siparis.jsp);
12 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
13 Connection dbConnection = DriverManager.
getConnection(jdbc:odbc:AlisverisSitesi);
14 PreparedStatement statement = dbConnection.
prepareStatement(SELECT urunAdi, fiyat, miktar FROM SiparisDetay
sd JOIN Urun u ON (sd.urunID = u.urunID) WHERE siparisID = ?);
15 statement.setString(1, request.getParameter(id));
16 ResultSet resultSet = statement.executeQuery();
17 %>
18 <table>
19 <%
20 while(resultSet.next())
21 {
22 %>
23 <tr>
24 <td width=200>
25 <%
26 out.println(resultSet.getString(urunAdi));
27 %>
28 </td>
29 <td width=100>
30 <%
31 out.println(resultSet.getDouble(fiyat));
32 %>
33 </td>
34 <td width=100>
35 <%
36 out.println(resultSet.getInt(miktar));
37 %>
38 </td>
JSP 139

39 </tr>
40 <%
41 }
42 %>
43 </table>
44 <%
45 statement.close();
46 %>
47 </body>
48 </html>

Kodun aklamas: Sayfann ilk yklenmesi srasnda URL araclyla id deerinin gelip gel-
medii kontrol edilir. Eer id deeri yoksa kullanc Siparis.jsp sayfasna ynlendirilir. id deeri
varsa veritaban balants kurulduktan sonra parametreli bir select ifadesi altrmak zere Pre-
paredStatement nesnesi oluturulur ve sipari numaras URL araclyla gelen sipariin detay
bilgileri veritabanndan ekilir. Geri dnen sonu kmsi ResultSet nesnesi araclyla bir HTML
tablosunda kullancya gsterilir.

SiparisDetay.jsp sayfas aldnda id alannn deeri bo deilse aadaki gibi bir sayfa g-
rntlenir.

ekil 21
9 JAVA I/O
9 JAVA I/O
Dosyalar ve Dizinler

FilterInputStream Snflar

FileInputStream ve FileOutputStream
Snflarnn Kullanm

Reader ve Writer Snflar:

Standart Giri-k Biriminin Kullanlmas:

Java ile A Programlama


JAVA I/O
.NET platformunda olduu gibi Java platformunda da giri-k ilemleri Stream ad verilen veri
yaplar araclyla yaplr. Veri gnderme ve alma kabiliyetine sahip btn nesneler Stream ola-
rak tanmlanabilir. Stream yapsnn kullanmyla, giri-k birimlerinin iinde bulunan veri ya-
zlm ortamndan soyutlanm olur. Java ortamndaki Stream okuma amacyla kullanlan snflar
InputStream snfndan, Stream yazma amacyla kullanlan snflar OutputStream snfndan t-
retilirler. InputStream trnden snflarda bulunan Read() metodu ile byte baznda okuma yapla-
bilir. Benzer bir ekilde OutputStream trnden snflarda bulunan snflarn sahip olduu Write()
metodu ile byte baznda yazma ilemi yaplabilir. Stream yaplarn kullanmak iin oluturulmu
olan InputStream ve OutputStream snflar temel olarak byte veri tipinden verilerle alsa da
Java ortamnda bulunan farkl snflar kullanlarak char veri tipi ile de ilem yaplabilir. Aadaki
veri kaynaklar kullanlarak Stream zerinden okuma veya yazma ilemi gerekletirilebilir:

Byte dizileri
Dosyalar
String nesneleri
A (network) kaynaklar
Stream yapsnn detaylarna girmeden nce dosya sistemi zerinde duralm.

Dosyalar ve Dizinler
Okuma ve yazma ilemleri iin disk zerinde bulunan dosyalara eriilmek istendiinde File s-
nfndan oluturulan nesneler kullanlr. File kelimesi sadece dosya kavramn temsil ediyor gibi
grnse de dizin kavramn da ierir. Disk zerinde bulunan dizinlere ve dosyalara erimek iin
File nesneleri kullanlr. File nesnesinin bir dosyay temsil etmesi istendiinde yapc metoduna
parametre olarak bu dosyann yeri, ad ve uzants String formatnda verilir. Benzer ekilde, File
nesnesinin yapc metoduna parametre olarak temsil edilecek dizinin yeri ve ad da verilebilir.

File nesnesi kullanlarak C:\Program Files\Java\jre1.6.0_02 dizininin iinde bulunan btn dosya
ve dizinler aadaki gibi grntlenebilir:

1 import java.io.File;
2 public class Giris
3 {
4 public static void main(String[] args)
5 {
6 File kaynakDizin = new File(C:\\Program Files\\
Java\\jre1.6.0_02);
7 String[] dosyalarVeDizinler = kaynakDizin.list();
8 for (String dosyaVeyaDizin : dosyalarVeDizinler)
9 {
10 System.out.println(dosyaVeyaDizin);
11 }
12 }
13 }

Kodun aklamas: File nesnesi oluturularak C:\Program Files\Java\jre1.6.0_02 dizininin Java


programnda temsil edilmesi salanr. File nesnesinin list() metodu, dizin iinde bulunan btn
dosya ve dizinlerin adn bir String dizisi eklinde dndrr.
144 Blm 9

Uygulama altrldnda aadaki gibi bir kt alnr:

bin
COPYRIGHT
lib
LICENSE
PATCH.ERR
README.txt
THIRDPARTYLICENSEREADME.txt
Welcome.html

Bilgisayarnzda bu dizin bulunmuyorsa File snfnn yapc metoduna baka bir dizin adn pa-
rametre olarak verebilirsiniz. C:\Program Files\Java\jre1.6.0_02 dizininin altnda bulunan btn
dosya ve klasrlerin grntlendiine ve verilen dizin altnda bulunan dizinlerin iindeki dosya ve
klasrlerin listelenmediine dikkat edelim. Sadece dosyalarn grntlenmesi iin aadaki kod
blou kullanlabilir:

1 import java.io.File;
2 public class Giris
3 {
4 public static void main(String[] args)
5 {
6 File kaynakDizin = new File(C:\\Program Files\\
Java\\jre1.6.0_02);
7 File[] dosyalarVeDizinler = kaynakDizin.listFiles();
8 for (File dosyaVeyaDizin : dosyalarVeDizinler)
9 {
10 if(dosyaVeyaDizin.isFile())
11 {
12 System.out.println(dosyaVeyaDizin.
getName());
13 }
14 }
15 }
16 }

Kodun aklamas: Bir nceki rnekten farkl olarak File nesnesinin listFiles() metodunu kul-
landk. Bu metod String dizisi yerine File dizisi dndrr. Bylece verilen dizinin altnda bulunan
btn dosya ve dizinler birer tane File nesnesiyle temsil edilmi olur. Dng iinde bulunan File
nesnesinin isFile() metodu ile temsil edilen yapnn dosya olup olmadn kontrol ediyoruz, eer
dosyaysa dosyann adn ekrana basyoruz. Sadece dizinleri grntlemek isteseydik File nes-
nesinin isDirectory() metodunu kullanabilirdik. Uygulama altrldnda aadaki gibi bir kt
alnr:

COPYRIGHT
LICENSE
PATCH.ERR
README.txt
JAVA I/O 145

THIRDPARTYLICENSEREADME.txt
Welcome.html
InputStream

eitli veri kaynaklarndan veri okumak amacyla aadaki snflardan oluturulan nesneler kul-
lanlabilir. Bu snflar InputStream snfndan tretilmitir.

ByteArrayInputStream: Bellek zerinde bulunan tampon blgelerden veri alnmas amacyla


kullanlr.

StringBufferInputStream: Bir String nesnesinin InputStream nesnesi olarak kullanlmasn sa-


lar.

FileInputStream: Disk zerinde bulunan dosyalarn okunmas iin kullanlr.

SequenceInputStream: Birden fazla InputStream nesnesinin tek bir InputStream nesnesine d-


ntrlmesini salar.

PipedInputStream: PipedOutputStream nesnesine yazlan verileri biimlendirmek iin kullanlr.

OutputStream

eitli veri kaynaklarna veri yazmak amacyla aadaki snflardan oluturulan nesneler kullan-
labilir. Bu snflar OutputStream snfndan tretilmitir.

ByteArrayOutputStream: Bellek zerinde buffer blgesi oluturulmas amacyla kullanlr. Byte-


ArrayOutputStream zerine yazlan btn verilen bellekte bulunan tampon blgeye yazlr.

FileOutputStream: Disk zerinde bulunan dosyalara veri yazlmas iin kullanlr.

PipedOutputStream: PipedInputStream nesnesine gnderilecek verileri hazrlamak iin kullan-


lr.

Bahsedilen Stream snflarndan baka, InputStream trevi snflardan oluan nesneler aracl-
yla yaplan okuma ileminin veya OutputStream trevi snflardan oluan nesneler araclyla
yaplan yazma ileminin zelliklerinin belirlenmesi amacyla FilterInputStream ve FilterOutputS-
tream snflar kullanlr. Byte veri tipinden farkl veri tipleri ile okuma veya yazma yapma, okuna-
cak veya yazlacak verilerin bir tampon blgede tutulmas veya tutulmamas gibi zellikler Filter
snflar araclyla salanr. FilterInputStream ve FilterOutputStream snflar soyut olarak olu-
turulmutur, bu snflardan tretilen ve yerleik olarak Java ortamnda bulunan snflar yardmyla
Stream nesnelerine eitli zellikler kazandrlabilir.

FilterInputStream Snflar
Giri kaynaklarn biimlendirmek amacyla kullanlan snflarn bir ksm unlardr:

DataInputStream: Farkl veri tiplerinde verilerin okunmas amacyla kullanlr.

BufferedInputStream: Her okumada fiziksel kaynaa eriilmesini engeller, okunan verilerin bel-
lekte bulunan bir tampon blgeye aktarlmasn salar.

LineNumberInputStream: Giri kaynana gelen satr saysn saklar. Bu snfn kullanlmas


tavsiye edilmez, satr saysn elde etmek amacyla kullanlan LineNumberReader snf ileride
aklanacaktr.

Bu snflarn yapc metodlar parametre olarak InputStream snfndan tremi bir snftan oluan
bir nesne alr.
146 Blm 9

FilterOutputStream Snflar

k kaynaklarn biimlendirmek amacyla kullanlan snflarn bir ksm unlardr:

DataOutputStream: Farkl veri tiplerinde verilerin yazlmas amacyla kullanlr.

BufferedOutputStream: Her yazma ileminde fiziksel kaynaa eriilmesini engeller, yazlacak


verilerin bellekte bulunan bir tampon blgeye aktarlmasn salar.

PrintOutputStream: k kaynana gnderilen verilerin grsel olarak biimlendirilmesini sa-


lar.

Bu snflarn yapc metodlar parametre olarak OutputStream snfndan tremi bir snftan olu-
an bir nesne alr.

FileInputStream ve FileOutputStream Snflarnn Kullanm


Disk zerinde bulunan bir dosyann okunarak ieriinin disk zerindeki baka bir dosyaya yazl-
masn aadaki kod ile gerekletirebiliriz.

1 import java.io.FileInputStream;
2 import java.io.FileOutputStream;
3 import java.io.IOException;
4 public class DosyaIslemleri
5 {
6 public static void main(String[] args) throws IOException
7 {
8 FileInputStream okuma = new FileInputStream(c:\\
okunan.txt);
9 FileOutputStream yazma = new FileOutputStream(c:\\
yazilan.txt);
10 int okunanKarakter;
11 while((okunanKarakter = okuma.read()) != -1)
12 {
13 System.out.print((char)okunanKarakter);
14 yazma.write(okunanKarakter);
15 }
16 okuma.close();
17 yazma.close();
18 }
19 }

Kodun aklamas: C srcsnde oluturduumuz okunan.txt dosyasn okuyarak ieriini C


srcsndeki yazilan.txt dosyasnda kopyalamak istiyoruz. okunan.txt dosyasn aadaki gibi
oluturabilirsiniz:

Java ile dosyadan okuma


islemi yaptk

Dosyadaki verileri okumak iin FileInputStream nesnesi, dosyaya yazmak iin FileOutputStre-
am nesnesi oluturduk. FileInputStream nesnemizin read() metodu dngnn her dnnde bir
byte deerini tam say olarak okur, ekranda grntler ve yazmak iin atmz dosyaya yazar.
JAVA I/O 147

yazilan.txt isimli dosya disk zerinde bulunmuyorsa FileOutputStream nesnesi tarafndan olutu-
rulur, bulunuyorsa ii boaltlr.

Uygulama altrldnda ekranda aadaki gibi bir grnt oluur. Trke karakterlerin dzgn
grnmemesinin sebebi, okunan deerlerin unicode desteine sahip olmamasdr.

Java ile dosyadan okuma


i?lemi yapt?k

yazilan.txt dosyasnn ierii ise aadaki gibi olur. Trke karakterlerin yazilan.txt dosyasna
dzgn bir ekilde aktarlmtr.

Java ile dosyadan okuma


ilemi yaptk

Dosyadan okunan karakteri ekrana basmak iin tip dnm ilemini kullanarak okunan tam
say cinsinden verileri karakter tipine evirdik. Tip dnm yapmasaydk veriler ekrana tam
say olarak baslrd. Aadaki veriler, dosyadan okunan karakterlerin tam say cinsinden kar-
ldr. Println() metodunu kullanrken araya boluk brakmadmz iin btn saylar aralksz
gsterildi. Bunun sebebi, boluk karakterinin de tam say cinsinden bir karla sahip olmasdr.

74971189732105108101321001111151219710097110321111071171099713101
052541081011091053212197112116253107

Okuma veya yazma ilemini tek bir tamsay ile snrlandrmak yerine byte bloklar eklinde de
yapabiliriz. Bunun iin bir tane byte dizisi tanmlanarak read() ve write() metodlarna parametre
olarak verilir. Okunan veriler byte dizisine yazlr, yazma ilemi yaplacaksa byte dizisi kullanlarak
yaplr. rnek kod aada verilmitir.

1 import java.io.FileInputStream;
2 import java.io.FileOutputStream;
3 import java.io.IOException;
4 public class DosyaIslemleri
5 {
6 public static void main(String[] args) throws IOException
7 {
8 FileInputStream okuma = new FileInputStream(c:\\
okunan.txt);
9 FileOutputStream yazma = new FileOutputStream(c:\\
yazilan.txt);
10 byte[] veri = new byte[1000];
11 int dosyaBoyutu = okuma.read(veri);
12 yazma.write(veri);
13 okuma.close();
14 yazma.close();
15 }
16 }
148 Blm 9

FileInputStream ve FileOutputStream Snflarnn File Snfyla Birlikte Kullanm:


Duruma gre FileInputStream ve FileOutputStream nesnelerinin yapc metodlarna parametre
olarak dosya ad yerin File nesneleri de verebiliriz. Uygulamann kodunun aadaki gibi olmas
durumunda da ekran kts ve yeni oluan dosyann ierii deimeyecektir:

1 import java.io.File;
2 import java.io.FileInputStream;
3 import java.io.FileOutputStream;
4 import java.io.IOException;
5 public class DosyaIslemleri
6 {
7 public static void main(String[] args) throws IOException
8 {
9 File okunanDosya = new File(c:\\okunan.txt);
10 File yazilanDosya = new File(c:\\yazilan.
txt);
11 FileInputStream okuma = new FileInputStream(ok
unanDosya);
12 FileOutputStream yazma = new FileOutputStream(
yazilanDosya);
13 int okunanKarakter;
14 while((okunanKarakter = okuma.read()) != -1)
15 {
16 System.out.print((char)okunanKarakter);
17 yazma.write(okunanKarakter);
18 }
19 okuma.close();
20 yazma.close();
21 }
22 }

DataInputStream ve DataOutputStream Snflarnn Kullanm:


DataInputStream ve DataOutputStream snflarndan oluturulan nesneler kullanlarak eitli veri
tipleri ile okuma ve yazma ilemi yaplabilir. Bu snflardan oluan nesneler ile UTF formatnda
veri okunabilir ve yazlabilir. UTF formatnda veri yazma kabiliyeti, farkl platformlar arasnda veri
aktarm yaplacanda kullanlr.

Aadaki rnekte, bir DataInputStream ile readChar() metodunu kullanarak karakter baznda
okuma yaptktan sonra DataOutputStream nesnesini kullanarak bu karakterleri dosyaya yazd-
racaz.

1 import java.io.DataInputStream;
2 import java.io.DataOutputStream;
3 import java.io.FileInputStream;
4 import java.io.FileNotFoundException;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
JAVA I/O 149

7 public class DosyaIslemleri


8 {
9 public static void main(String[] args) throws
FileNotFoundException, IOException
10 {
11 FileInputStream okuma = new
FileInputStream(c:\\okunan.txt);
12 FileOutputStream yazma = new
FileOutputStream(c:\\yazilan.txt);
13 DataInputStream ozellesmisOkuma = new
DataInputStream(okuma);
14 DataOutputStream ozellesmisYazma = new
DataOutputStream(yazma);
15 while(ozellesmisOkuma.available() != 0)
16 {
17 char okunanKarakter = ozellesmisOkuma.
readChar();
18 ozellesmisYazma.writeChar(okunanKarakter
);
19 }
20 ozellesmisOkuma.close();
21 ozellesmisYazma.close();
22 okuma.close();
23 yazma.close();
24 }
25 }

Kodun aklamas: Bir nceki rnekte yaptmz gibi FileInputStream ve FileOutputStream


nesnelerini oluturduk. Farkl veri tipleri kullanarak okuma yapmak iin DataInputStream snfn,
farkl veri tipleri kullanarak yazma yapmak iin DataOutputStream snfn kullanacamz sy-
lemitik. DataInputStream snfnn yapc metodu parametre olarak bir FileInputStream nesnesi,
DataOutputStream snfnn yapc metodu parametre olarak bir FileOutputStream nesnesi alr.
Dosyann sonuna gelinip gelinmediini, DataInputStream nesnesinin available() metodu ile an-
layabiliriz. Bu metod, DataInputStream nesnesinin bulunduu yerden dosyann sonuna kadar
okunabilecek byte saysn dndrr. Bu metodun dndrd deer sfr olduunda dosyann
sonuna gelinmi demektir. Uygulamay altrdmzda, yazilan.txt dosyasnn ieriinin aa-
daki gibi olduunu grrz.

Uygulamay altrdmzda, yazilan.txt dosyasnn ieriinin aadaki gibi olduunu gr-


rz.

Java ile dosyadan okuma


ilemi yaptk

DataInputStream snfnda bulunan readChar() metodu ile iki byte uzunluunda okuma yaplr.
Ayn ekilde DataOutputStream snfnda bulunan writeChar() metodu ile iki byte uzunluunda
yazma gerekletirlir. Bu durumda dolay; DataInputStream snfndan oluan bir nesne zerin-
den okunan verileri FileOutputStream snfndan oluturulan bir nesne ile baka bir dosyaya ya-
zarsak veri kaybyla karlarz.

Az nce yazdmz rnei aadaki gibi deitirelim:


150 Blm 9

1 import java.io.DataInputStream;
2 import java.io.FileInputStream;
3 import java.io.FileNotFoundException;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 public class DosyaIslemleri
7 {
8 public static void main(String[] args) throws
FileNotFoundException, IOException
9 {
10 FileInputStream okuma = new
FileInputStream(c:\\okunan.txt);
11 FileOutputStream yazma = new
FileOutputStream(c:\\yazilan.txt);
12 DataInputStream ozellesmisOkuma = new
DataInputStream(okuma);
13 while(ozellesmisOkuma.available() != 0)
14 {
15 char okunanKarakter = ozellesmisOkuma.
readChar();
16 yazma.write(okunanKarakter);
17 }
18 ozellesmisOkuma.close();
19 okuma.close();
20 yazma.close();
21 }
22 }

Okuma ilemini DataInputStream nesnesi ile, yazma ilemini FileOutputStream nesnesi ile yap-
tk. Uygulamay altrdmzda oluan yazilan.txt dosyasnn ierii aadaki gibidir.

aaiedsaa km
ilm atk

Dikkat edersek, okunan.txt dosyasnda bulunan verilen birer karakter atlanarak yazilan.txt
dosyasna yazlm olduunu grrz.

Reader ve Writer Snflar:


Java 1.1 srmnden itibaren platforma Streamler zerinde okuma ve yazma ilemlerini daha
ilevsel hale getirmek iin Reader ve Writer snflar eklenmitir. Bu snflar byte veri tipi yerine
unicode karakter tipini kullanrlar. Karakter tipinden verilerin kullanlmas yazlmcnn iini birok
durumda kolaylatrd gibi desteklenen karakter formatnn unicode olmas yazlmn farkl dilleri
desteklemesini de salar. InputStream ve OutputStream snflar araclyla okunan ve yazlan
veriler 8 bitlik byte tipi verilerden olutuu halde, Reader ve Writer snflar 16 bitlik veri destei-
ne sahiptir. Reader ve Writer snflar birok durumda InputStream ve OutputStream snflarnn
yerine kullanlabilse de byte baznda ilemlerin yaplmas gereken senaryolar da olabilir; bu gibi
durumlarda InputStream ve OutputStream snflarnn ve bu snflarn trevlerinin kullanlmas
gerekir. Writer trevi snflarla Stream yaplar zerinde append() ilemi yaplabilir.
JAVA I/O 151

Stream snflarnn Reader ve Writer karlklar aadaki tabloda gsterilmitir.

Stream snflar Reader ve Writer snflar


InputStream Reader
OutputStream Writer
ByteArrayInputStream CharArrayReader
ByteArrayOutputStream CharArrayWriter
FileInputStream FileReader
FileOutputStream FileWriter
PipedInputStream PipedReader
PipedOutputStream PipedWriter
StringBufferInputStream StringReader

Verileri ve veri aktarma ekillerini biimlendirmek amacyla Stream snflarnn biimlendirilmesin-


de kullanlan Filter snflarna benzer snflar da vardr. Bu snflar aadaki tabloda gsterilmi-
tir.

Stream snflar Reader ve Writer snflar


FilterInputStream FilterReader
FilterOutputStream FilterWriter
BufferedInputStream BufferedReader
BufferedOutputStream BufferedWriter
DataInputStream -
PrintStream PrintWriter
LineNumberInputStream LineNumberReader

FileReader ve FileWriter Snflarnn Kullanlmas:


FileReader ve FileWriter snflarnn kullanm, FileInputStream ve FileOutputStream snflarnn
kullanmyla benzerdir. Aadaki rnekte FileReader nesnesi ile dosya ierii okunmakta ve Fi-
leWriter nesnesi ile dier dosyaya yazlmaktadr. Okuma ilemi iin daha nce oluturduumuz
okunan.txt dosyas kullanlmtr.

1 import java.io.FileNotFoundException;
2 import java.io.FileReader;
3 import java.io.FileWriter;
4 import java.io.IOException;
5 public class DosyaIslemleri
6 {
7 public static void main(String[] args) throws
FileNotFoundException, IOException
8 {
9 FileReader okuma = new FileReader(c:\\okunan.txt);
10 FileWriter yazma = new FileWriter(c:\\
yazilan.txt);
11 int okunanKarakter;
12 while((okunanKarakter = okuma.read()) != -1)
152 Blm 9

13 {
14 System.out.print((char)okunanKarakter);
15 yazma.write(okunanKarakter);
16 }
17 okuma.close();
18 yazma.close();
19 }
20 }

Uygulama altrldnda aadaki gibi bir kt alnr. FileInputStream snfnn kullanmnda


Trke karakterler bozuk grnd halde FileReader snf kullanldnda Trke karakterler
dzgn bir ekilde grnr. yazilan.txt dosyas da ayn verileri ierir.

Java ile dosyadan okuma


ilemi yaptk

FileInputStream snfndan oluan bir nesne ile bir dosyadaki verileri byte dizisi eklinde okuya-
biliyorduk. FileReader snfndan oluan bir nesne ile veriler karakter dizisi eklinde okunabilir.
rnek kullanm aadaki gibidir:

1 import java.io.FileNotFoundException;
2 import java.io.FileReader;
3 import java.io.FileWriter;
4 import java.io.IOException;
5 public class DosyaIslemleri
6 {
7 public static void main(String[] args) throws
FileNotFoundException, IOException
8 {
9 FileReader okuma = new FileReader(c:\\okunan.txt);
10 FileWriter yazma = new FileWriter(c:\\
yazilan.txt);
11 char[] veri = new char[1000];
12 okuma.read(veri);
13 yazma.write(veri);
14 okuma.close();
15 yazma.close();
16 }
17 }

Uygulama altrldnda, yazilan.txt dosyasnn ieriinin okunan.txt dosyasnn ieriiyle


ayn olduu grlr.

BufferedReader Snfnn Kullanm:


BufferedReader snfn kullanarak verileri satr baznda okuyabilir ve yazabiliriz. rnek kullanm
aada verilmitir.

1 import java.io.BufferedReader;
2 import java.io.FileNotFoundException;
JAVA I/O 153

3 import java.io.FileReader;
4 import java.io.FileWriter;
5 import java.io.IOException;
6 public class DosyaIslemleri
7 {
8 public static void main(String[] args) throws
FileNotFoundException, IOException
9 {
10 FileReader okuma = new FileReader(c:\\okunan.
txt);
11 FileWriter yazma = new FileWriter(c:\\
yazilan.txt);
12 BufferedReader tamponOkuma = new
BufferedReader(okuma);
13 String satir = new String();
14 String butunVeri = new String();
15 while((satir = tamponOkuma.readLine()) !=
null)
16 {
17 butunVeri += satir + \n;
18 }
19 System.out.println(butunVeri);
20 yazma.write(butunVeri);
21 tamponOkuma.close();
22 okuma.close();
23 yazma.close();
24 }
25 }

Daha nceki rneklerden farkl olarak, dosyada bulunan veriler satr satr okunmutur. Buffered-
Reader nesnesinin readLine() metodu kullanlarak okunan satrlar satir adndaki String deike-
nine aktarlr, her satr butunVeri isimli String deikenine eklenir. butunVeri deikeni dosyadan
okunan btn metni saklamak amacyla kullanlmtr. Uygulama altrldnda ekranda ve ya-
zilan.txt dosyasnda aadaki gibi bir grnm oluur.

Java ile dosyadan okuma


ilemi yaptk

Okunan satr deerinin butunVeri deikenine eklenmesi srasnda \n karakteri kullanlmasayd


btn satrlar ekran ktsnda yan yana grnr ve yazilan.txt dosyasna yan yana yazlrd.
Bunun sebebi, readLine() metodunun satr okuduktan sonraki \n deerini almamasdr. \n
karakterinin kullanmamas durumunda dosyadaki veri aadaki gibi olur:

Java ile dosyadan okumailemi yaptk


154 Blm 9

Standart Giri-k Biriminin Kullanlmas:


Konsol zerinden veri okuma ve veri yazma ilemlerinin yaplmas iin standart giri-k birimini
oluturan System.in, System.out ve System.err snflar kullanlr. Bu snflar, .Net platformundaki
Console snfnn karldr. Genelde konsole zerinden yaplan readLine() ileminin tampon
bellek blgesi ile kullanm uygundur.

Konsoldan girilen verileri okuyan ve standart ka yazan bir Java program aada verilmitir.
Kullanc bo satr girdiinde uygulama sonlanr.

1 import java.io.BufferedReader;
2 import java.io.IOException;
3 import java.io.InputStreamReader;
4 public class Konsol
5 {
6 public static void main(String[] args) throws IOException
7 {
8 InputStreamReader giris = new
InputStreamReader(System.in);
9 BufferedReader tampon = new BufferedReader(giris);
10 String satir;
11 System.out.println(Uygulamadan kmak iin
enter tuuna basn);
12 System.out.print(Veri girin: );
13 satir = tampon.readLine();
14 while(satir.length() != 0)
15 {
16 System.out.println(Girdiiniz veri: +
satir);
17 System.out.print(Veri girin: );
18 satir = tampon.readLine();
19 }
20 }
21 }

Uygulama altrldnda kullancdan srekli veri girmesini bekler, kullanc Enter tuuna bas-
tnda uygulama sonlanr. Veri girin metninin doru yerde grntlenmesini salamak iin dn-
gden nce readLine() metodu bir kere altrlmtr. rnek girilerle aadaki gibi bir k
retilir:

Uygulamadan kmak iin enter tuuna basn


Veri girin: Java ile
Girdiiniz veri: Java ile
Veri girin: Giri-k
Girdiiniz veri: Giri-k
Veri girin: lemleri
Girdiiniz veri: lemleri
Veri girin:
JAVA I/O 155

Java ile A Programlama:


A zerinde bulunan farkl bilgisayarlar zerinde alan programlarn haberlemesi Socket yap-
lar ile salanr. Socketler, uygulamalarn haberlemesini salayan iletiim noktalardr. Sunucu
tarafnda tanmlanan ServerSocket nesnesi ile herhangi bir istemcinin sunucuya belirli bir port
zerinden balanmas beklenir, istemci balandnda sradaki ilemler gerekletirilir. Sunucu
ile istemci arasndaki veri aktarm Socket arabirimleri zerinden, Stream yaplar kullanlarak
gerekletirilir. ServerSocket snf adndan dolay zellemi bir Socket yaps gibi grnse de,
temel ilevi sunucunun istemciden gelen istei beklemesini ve istek geldiinde bu istei kabul
etmesini salamaktr. stemci sunucuya baland zaman ServerSocket nesnesi bir Socket nes-
nesi oluturarak dndrr.

ServerSocket ve Socket nesneleri kullanlarak a zerinden sunucu-istemci arasnda veri akta-


rm yapan Java dosyalar aada verilmitir. Sunucu ve istemci iin birer tane Java snf olu-
turulmutur.

1 // Sunucu Uygulamas
2 import java.io.BufferedReader;
3 import java.io.BufferedWriter;
4 import java.io.IOException;
5 import java.io.InputStreamReader;
6 import java.io.OutputStreamWriter;
7 import java.net.ServerSocket;
8 import java.net.Socket;
9 public class Sunucu
10 {
11 public static void main(String[] args) throws
IOException
12 {
13 ServerSocket serverSocket = new
ServerSocket(60000);
14 System.out.println(stemcinin balanmas
bekleniyor);
15 Socket clientSocket = serverSocket.accept();
16 System.out.println(stemci ile balant
kuruldu);
17 InputStreamReader okuma = new
InputStreamReader(System.in);
18 BufferedReader tamponOkuma = new
BufferedReader(okuma);
19 OutputStreamWriter yazma = new
OutputStreamWriter( clientSocket.getOutputStream());
20 BufferedWriter tamponYazma = new
BufferedWriter(yazma);
21 String veri = new String();
22 while((veri = tamponOkuma.readLine()).length()
!= 0)
23 {
24 tamponYazma.write(veri);
156 Blm 9

25 tamponYazma.write(\n);
26 tamponYazma.flush();
27 System.out.println(Gnderilen veri: +
veri);
28 }
29 System.out.println(Balant kesildi);
30 serverSocket.close();
31 clientSocket.close();
32 okuma.close();
33 yazma.close();
34 tamponOkuma.close();
35 tamponYazma.close();
36 }
37 }

Kodun aklamas: Sunucu zerinde tanmlanan ServerSocket nesnesi, daha nce anlatld
gibi istemcinin balanmasn bekler ve bir istemci balanana kadar uygulamann almasn elin-
de tutar. stemci sunucuya balandktan sonra ServerSocket nesnesinin accept() metodu Socket
cinsinden bir nesne dndrr. Bu nesne ile sunucu istemciyle iletiim kurar. okuma isimli InputS-
treamReader nesnesi, standart giri-k biriminden veri almak iin kullanlr. Standart giri-k
biriminden alnan verileri satr baznda okumak iin BufferedReader nesnesi kullanlmtr. Ben-
zer ekilde Socket nesnesi zerinden istemciye veri gndermek iin OutputStreamWriter nesnesi
oluturulmutur. OutputStreamWriter snfnn yapc metoduna parametre olarak Socket nesne-
sinin getOutputStream() metodundan dnen OutputStream nesnesi verilir. Verileri istemciye satr
baznda gndermek iin BufferedWriter nesnesi kullanlmtr. Bir dng iinde standart giri-k
biriminden okunan veriler BufferedWriter nesnesi araclyla istemciye gnderilir. BufferedWriter
nesnesine veriyi yazdktan sonra flush() komutu altrlr. Bunun sebebi satr baznda gnderilen
verinin hemen Streame yazlmasn salamaktr. Kullanc bo satr girdiinde dng sonlanr ve
balant sunucu tarafndan kesilir.

1 // stemci Uygulamas
2 import java.io.BufferedReader;
3 import java.io.IOException;
4 import java.io.InputStreamReader;
5 import java.net.Socket;
6 public class Istemci
7 {
8 public static void main(String[] args) throws IOException
9 {
10 Socket socket;
11 try
12 {
13 socket = new Socket(127.0.0.1, 60000);
14 }
15 catch(IOException ex)
16 {
JAVA I/O 157

17 System.out.println(Balant
kurulamad);
18 return;
19 }
20 InputStreamReader okuma = new
InputStreamReader(socket.getInputStream());
21 BufferedReader tamponOkuma = new
BufferedReader(okuma);
22 System.out.println(Sunucu ile balant
kuruldu);
23 String veri = new String();
24 try
25 {
26 while((veri = tamponOkuma.readLine()) !=
null)
27 {
28 System.out.println(Gelen veri:
+ veri);
29 }
30 System.out.println(Balant kesildi);
31 }
32 catch(IOException ex)
33 {
34 System.out.println(Balant hatas);
35 }
36 finally
37 {
38 okuma.close();
39 tamponOkuma.close();
40 socket.close();
41 }
42 }
43 }

Kodun aklamas: stemci tarafnda, sunucu ile iletiim kurmak iin bir Socket nesnesi tanmla-
nr. stemci zerinde alan uygulamada ServerSocket nesnesi kullanlmamtr, bunun sebebi
istemcinin herhangi bir port zerinden balant beklememesidir. stemci sadece sunucuya ba-
lanmak ve veri almak iin tasarlanmtr. Verilen IP adresine belirtilen port zerinden balant
kurulamazsa IOException oluur ve program sonlanr. Sunucu altrlmadan istemci altr-
lrsa bahsedilen hata mesaj alnr. Sunucu uygulamadan Stream zerinden gelen verileri almak
iin InputStreamReader nesnesi, gelen verileri satr baznda ileyebilmek iinse BufferedReader
nesnesi kullanlmtr. Sunucu zerinde alan uygulamada olduu gibi istemcide de InputS-
treamReader snfnn yapc metoduna parametre olarak Socket nesnesinin getInputStream()
metodundan dnen InputStream nesnesi verilir. Sunucuyla balant kurulduktan sonra bir sonsuz
dng iinde sunucudan gelen mesajlar BufferedReader nesnesinin readLine() metodu ile satr
baznda alnr ve standart ka yazlr. Bu noktadan sonra IOException oluursa sunucunun
kapand anlalr ve balant kesildi mesaj verilir.
158 Blm 9

Her iki uygulamada da Stream ve Socket nesnelerini kapatmay unutmamalyz.

Sunucu ve istemci uygulamalarnn farkl ekillerde altrlmalar aadaki gibi ktlar verir.

1. Sunucu altrlmadan istemci altrldnda:

Balant kurulamad

2. Sunucu altrldktan sonra istemcinin balanmasn beklerken:

stemcinin balanmas bekleniyor


3. stemci ile sunucu arasnda balant kurulduunda:

Sunucu taraf:

stemcinin balanmas bekleniyor


stemci ile balant kuruldu

stemci taraf:

Sunucu ile balant kuruldu

4. Sunucudan istemciye mesaj gnderildiinde:

Sunucu taraf:

stemcinin balanmas bekleniyor


stemci ile balant kuruldu
Java ile
Gnderilen veri: Java ile
A Programlama
Gnderilen veri: A Programlama
stemci taraf:
Sunucu ile balant kuruldu
Gelen veri: Java ile
Gelen veri: A Programlama

5. Balant kesildiinde:

Sunucu taraf:

stemcinin balanmas bekleniyor


stemci ile balant kuruldu
Java ile
Gnderilen veri: Java ile
A Programlama
Gnderilen veri: A Programlama
Balant kesildi
stemci taraf:

Sunucu ile balant kuruldu


Gelen veri: Java ile
Gelen veri: A Programlama
Balant kesildi
10
Oracle
Veritaban
Ailesi
10 Oracle Veritaban Ailesi
Oracle zerinde Uygulama Gelitirme

Oracle Veri Taban Sisteminin Kurulmas

Tablespace

Undo Tablespace

Oracleda Veri Taban Oluturmak

Temel Veri Tipleri


Oracle Veritaban Ailesi
Oracle Personal Edition: Microsoft SQL Server 2005teki Express Edition gibi dnlebilir.
Kiisel veritabandr. Uygulama gelitirme iin kullanlr.

Oracle Standard Edition: Giri seviyesinde ok kullancl srmdr. Microsoft SQL Server 2005
Standard Editiona karlk olarak dnlebilir.

Oracle Enterprise Edition: En geni kapsaml srmdr. Microsoft SQL Server 2005 Enterprise
Editiona karlk olarak dnlebilir.

Oracle Lite: Mobil uygulamalar iin kullanlr.

Oracle zerinde Uygulama Gelitirme


Oracle zerinde uygulama gelitirme iin kullanlacak eitli diller ve ortamlar mevcuttur. Bunlar
SQL, PL/SQL, Java olarak saylabilir. Bunlarn dnda .NET, C, C++ gibi dil ve ortamlardan eriim
yaplabilir.

PL/SQL: Microsoft SQL Serverdaki T-SQLe karlk olarak dnlebilecek olan prosedrel SQL
geniletmesidir. Oracle zerinde PL/SQL kullanlarak SP (stored procedure), trigger gibi nesneler
oluturulabilir. T-SQLdeki gibi deikenler, dngler ve koullar PL/SQLde de mevcuttur. SQL
Plus arayz kullanlarak ya da TOAD ile PL/SQL yazlabilir.

Java: Microsot SQL Server zerine .NET ile nesnelerin yazlmasna karlk olarak, bunun iin
Oracle tarafnda Java kullanlr.

Oracle Veri Taban Sisteminin Kurulmas


1 ncelikle, eer deilse, bilgisayarnzn blgesel ayarlarn ngilizce olarak deitirmeniz ge-
rekir. Bunun iin, Start > Control Panel > Regional and Language Options tan (Balat >
Denetim Masas > Blge ve Dil Seenekleri) English (United States) (ngilizce (A.B.D.)) olarak
belirleyin.
162 Blm 10

2. Daha sonra, Advanced (Gelimi) sekmesinde kullanlan dil seenei olarak yine English
(United States) (ngilizce (A.B.D))yi sein ve tamam butonuna tklayn.

3 Tamam butonuna tkladnzda, gerekli dosyalarn bilgisayarnzda ykl olduunu ve


Setupn (Kur) dosyalar buradan kurabileceini belirten bir uyar ile karlaabilirsiniz. Bu
durumda, Yes (Evet) seeneini tklayn. Ardndan Windows bilgisayarnz yeniden balat-
mak isteyebilir. Bu durumda yine Yes (Evet) seeneini tklayarak bilgisayarnz yeniden
balatn.
4. Ardndan Oracle10g kurulu dosyalarnn bulunduu klasre giderek setup.exeyi altrn.
Karnza ilk olarak daha nce yklenmi bir Oracle rn olup olmadn kontrol eden bir
ilem penceresi gelecektir.
Oracle Veritaban 163

5. Kontol ileminin ardndan gelen ekranda ykleme seenei olarak Basic Installation ve Ad-
vanced Installation olmak zere iki yntem karnza kacaktr. Bunlardan Basic Installation
seeneini sein. Bylelikle birok ayarn otomatik olarak yaplmas salanacaktr.
Oracle Home Location: Veritabannn kurulaca klasrn yerini belirtir.

Installation Type: Kurulum tipini belirtir. Standart ya da Enterprise Edition olarak belirlenir.

Create Starter Database: Bu seenek iaretlendiinde kurulum ilemi gerekletikten sonra


veritaban da oluturulur. Aksi halde sadece Oracle 10g kurulumu gerekletirilecek, veritaban
yaratmak iin SQL-Plus altndan Create Database komutu ile veritaban oluturmak gerekecektir.
Bu seenein iaretli olmasna dikkat edin.

Global Database Name: Veritabannn ad girilir.

Database Password: Veritaban ifresi girilir. Bu blmde girilen ifre kesinlikle unutulmamaldr.
Oracleda en st seviyedeki admin kullancs sys olarak hazr gelmekte ve burada belirlenen
ifre bu kullancnn ifresi olarak belirlenmektedir.

Confirm Password: Girilen ifre tekrar teyit amacyla bu blme girilir.

Girileri tamamladkan sonra Next butonuna tklayn.

1 Karnza gelen pencerede, kurulum srasnda yaptnz seimleri zet olarak grebilirsiniz.
Deiiklik yapmak isterseniz Back butonuna tklayarak geri dnebilirsiniz. Daha sonra Install
butonuna tklayarak devam edin.
164 Blm 10

2. Kurulum ilemi otomatik olarak balayacaktr.

3 Kurulum srasnda belirlenen ayarlar erevesinde konfigrasyon ilemleri otomatik olarak


gerekletirildikten sonra ilemlerin zeti grntlenir. Yine Next butonuna tklayn.
Oracle Veritaban 165

4. Veritaban otomatik olarak oluturulur.

5. Daha sonra, oluturulan veritaban ile ilgili bilgilerin zetlendii ve ifre ayarlarnn yaplabil-
dii pencere gelir.
166 Blm 10

6. zet penceresinde yer alan Password Management butonuna tklandnda alan ekrandan,
varsaylan kullanclara ilikin ifre deiiklikleri ve kilitli/kilitsiz ayarlar yaplabilir.

7. Belirtilen ayarlarn yaplmasndan sonra, kurulum tamamlanr. Exit butonuna tklayarak kn.

8. Alan browserdan Oracle Enterprise Managera kullanc ad ve ifre ile giri yapabilirsiniz.
Oracle Veritaban 167

Tablespace
Microsoft SQL Serverda data file olarak geen MDF ve NDF uzantl dosyalar Oracleda
tablespacelerde tutulur.

system Tablespace
system tablespacei Oraclen veri szln barndrr. Bu da Microsoft SQL Serverdaki master
veritabanndaki metadata tutan sys ile balayan tablolar gibi dnlebilir.

sysaux Tablespace
Eskiden system tablespacete yer alan birtakm veriler ve zellikler 10g ile birlikte sysaux
tablespaceine alnmtr. Oracle sisteminin kulland bir tablespace olarak dnlmelidir.

Default Temporary Tablespace


Default Temporary Tablespace ilgili veritabannda altrlan sorgu iin bellek alan yetersiz ge-
liyorsa disk zerinde bellek alan gibi kullanlr. Windows ve Linux gibi iletim sistemlerinde kulla-
nlan swap alan gibi dnlebilir.

Undo Tablespace
Microsoft SQL Serverdaki Transaction Log Space gibi dnlebilir. Herhangi bir transaction
baladnda rollback ya da commit edilene kadar undo tablespacete eski veri tutulur.

Arka Planda alan Processler


Veritaban sisteminin dzenli alabilmesi iin arka planda alan birtakm processlere ihtiya
vardr. Oracleda alan temel arka plan processleri unlardr:

dbwr Database Writer Process: Tampon blgelere alnan verilerin veritabanna yazlmasn-
dan sorumludur.
lgwr Log Writer Process: Online redo loglar bellekte geici olarak tutulur. Bu loglarn verita-
banna aktarlmasndan log writer process sorumludur.
ckpt Chekpoint Process: Checkpoint ilemi bellekteki verilerin veritaban zerinde uygun b-
lmlere yazlmasndan sorumludur. Checkpoint process database writer ve log writer tetikleye-
bilir.
168 Blm 10

smon System Monitor Process: System monitor process veritabanlarnn btnl ve tutar-
llndan sorumludur.

pmon Process Monitor: .NET ortamndaki garbage collector gibi dnlebilir. Genel olarak
kaynak ynetimi yaptn syleyebiliriz.

Oracleda Veri Taban Oluturmak


Oracleda veri taban oluturmak iin kullanlabilecek en kolay yol Oracle Database Configuration
Assistant (DBCA) kullanmaktr. DBCAe Start > Programs > Oracle Oracle Home > Configuration
and Migration Tools > Database Configuration Assistant yoluyla ulalr. Program alnca bir
sihirbaz araclyla veri tabann yaplandrabiliriz.

ekil 1: DBCA al ekran.

Sihirbazn ilk adm sadece bilgilendirici bir ekrandr. Bu admda Next butonuna tklayarak devam
edebiliriz. Bu admdan sonra veri tabann oluturmak iin nmze kan kavramlar, opsiyonlar-
la birlikte deerlendireceiz.

Sihirbazn ikinci admnda veri taban ynetiminde ne yapacamz belitmemiz gerekir. Burada ilk
seenek olan Create a Database (Veri taban olutur) seeneini seeceiz. Dier opsiyonlar ve
aklamalar da aadaki gibidir; fakat sihirbaz bu seeneklere gre ilerletmeyeceiz.

Opsiyon Aklama
Sihirbazla adm adm veritaban oluturmak iin kullanlr. Varolan veri
Create a Database taban ablonlar kullanlabildii gibi ablonlardan farkllatrarak da veri
taban oluturulabilir.

Var olan bir veri tabannn dedicated (adanm) bir sunucudan Shared
Configure Database Options
(paylalan) bir sunucuya tanmas iin gerekli ilerin yaplmasn salar.

Delete a Database Var olan bir veri tabannn tamamen silinmesini salar.

Veritaban ablonlarnn ynetilmesini salar. ablonlar yerel diskte XML


Manage Templates formatnda saklanmaktadr. Mevcut ablonlarda deiiklik yaplabilir ya da
yeni bir ablon oluturulabilir.
Oracle Veritaban 169

ekil 2: DBCA ilk kurulum ekran.

ekil 3: DBCA veri taban ablonu seme ekran.

ekil 3deki veri taban ablonu seim ekrannda yeni oluturulacak veri tabannn yaps belir-
lenir. Herhangi bir ablonu seerek sa alt kedeki Shoe Details butonuna tklayarak ablo-
nun alt yaps hakknda bilgi alabilirsiniz, ancak bu aamada kavramlar karmak gelebilir. Her
ablon iin genel veri taban zellikleri, balang parametreleri, karakter setleri, veri dosyalar
(tablespaceler), kontrol dosyalar ve redo log gruplar hakknda bilgileri bu pop-uptan grebilir-
siniz; ancak mevcut ablonlarn yaplar zerinde deiiklik yapamazsnz. Burada hazr olarak
greceiniz ablonlar Data Warehouse, General Purpose ve Transaction Processingtir. Burada
General Purpose seeneini seip Next butonuna tklayarak devam edebiliriz.
170 Blm 10

ekil 4: DBCA veri taban isimlendirme ekran.

Sihirbazn 3. admnda ekil 4te grdmz isimlendirme ekran gelir. Bu ekranda veri taban
ad ve SID (system identification)si tanmlanr. Veri taban ad yazarken SIDde de ayn karak-
terlerin yazldn greceksiniz. Bir sistemde ayn isimde birden fazla veri taban olabilirken ayn
SIDye sahip birden fazla veri taban bulunamaz. Ayn zamanda SIDnin maksimum uzunluu 8
karakterdir. SID ksmna 8 karakterden daha uzun bir ifade yazsanz da SID 8 karaktere ksalt-
lacaktr. Bu ekranda veri taban adna ve SIDye ornek yazp Next butonuna tklayarak devam
edebiliriz.

ekil 5: DBCA ynetim seenekleri ekran.


Oracle Veritaban 171

ekil 5teki ynetim seenekleri ekrannda veri tabannn Enterprise Manager (EM) ile kontrol
edilip edilemeyecei seenei ile birlikte uyarlarn e-mail ile gnderilmesi ve backup seenek-
leri tanmlanr. Bu ekranda Configure the Database with Enterprise Manager seeneeni iaretli
olarak brakalm. Eer makinenizde grid kurulumu varsa ilk opsiyon olan Use Grid Control for
Database Management opsiyonu da ak olacaktr. Dier opsiyon olan Use Database Control for
Database Management seenei mecburen seili olarak kalarak devam edecektir. Enable Email
Notifications ve Enable Daily Backup seeneklerini iaretlemeden devam edebiliriz.

ekil 6: DBCA ifre tanmlamalar ekran.

ekil 6daki ifre tanmlama ekrannda SYS, SYSTEM, DBSNMP ve SYSMAN kullanclar iin
ifre tanmlamalar yapmamz gerekir. Burada 2 seenek mevcuttur. Birincisi varsaylan olarak
seili gelen Use the Same Password for All Accounts seeneidir. Bu seenekte yukarda ad
geen 4 sistem kullancs iin de yazlan ayn ifre geerli olur. Eer veri tabann ynetirken bu
4 hesab tek kii kullanyorsa hepsi iin tek ifre tanmlamak daha uygun olacaktr. Dier seenek
olan Use Different Password seilirse 4 kullancnn hepsi iin farkl farkl ifreler tanmlanabilir.
Bu noktada ad geen kullanclarn zelliklerini listeleyelim:

Kullanc zellik
SYS SYS kullancs veri szln oluturan tm i Oracle tablolarnn sahibidir. SYS
kullancsyla hibir ilem yaplmamas iin bu hesabn kilitlenmesi tercih edilmelidir. SYS
kullancsnn sahibi olduu nesnelerde de deiiklik yaplmamaldr.
SYSTEM SYSTEM kullancs birtakm ynetimsel tablolarn ve viewlarn sahibidir. Yetkisiz kullanm
ihtimaline kar kilitlenmesi ve kullanlmamas tercih edilmelidir.
DBSNMP Veri taban hakknda performans istatistiklerini toplamak ve grntlemek amacyla
Enterprise Manager tarafndan kullanlan kullancdr.
SYSMAN Enterprise Managerda SYS kullancsyla ayn haklara sahiptir.

Bu ekranda Use the Same Password for All Accounts seiliyken ifreyi 2 defa yazp Next butonu-
na tklayarak devam edebiliriz.

ekil 7deki saklama seenekleri ekrannda 3 seenek sz konusudur. Bu ekranda dikkat ede-
ceimiz bir nokta da bu aamada Finish butonuna tklayarak veri taban oluturma ilemini ta-
mamlayabilecek olmamzdr. Bundan sonraki sihirbaz ekran buradaki seime gre deiir. Bu
seeneklerin zellikleri u ekildedir:
172 Blm 10

ekil 7: DBCA Diskte saklama seenekleri ekran.

Saklama Seenekleri zellik

En ok kullanlan seenektir. Veri tabannn disk zerinde normal bir veri


File System
taban gibi oluturulmasn salar.

ASM (Automatic Storage Management) iin ncelikle CSS (Oracle Cluster


Synchronization Service) kurulumu yaplmas gerekir. Disk ynetimini
ASM Storage
File System seeneine gre kolaylatrr. Birok ii veri taban yneticisi
yerine Oracle kendisi yapar.
Veri taban dosyalarn iletim sistemi yerine donanm araclyla
Raw Devices dorudan Oracle ynetir. RAC (Real Application Cluster) veri tabanlar iin
paylaml alan olarak kullanlabilir.

Bu admda File System seeneini iaretleyip Next butonuna tklayarak devam edebiliriz.

ekil 8deki veri taban dosyalar ekrannda tanmladmz veri tabanna ait fiziksel dosyalarn
nereye konulaca belirtilir. Bu admda 3 seenek mevcuttur. Bu seeneklerin aklamalar u
ekilde zetlenebilir:

Seenek Aklama
Use Database File Daha nce seilen ablona gre veri taban dosyalarnn yerleri belirlenir,
Locations From Template sonradan deitirilebilir.
Use Common Location fo Veri taban dosyalarnn yeri iin farkl bir klasr tanmlamak iin kullanlr,
All Database Files belirlenen klasr sonradan deitirilebilir.
Diskte saklama seeneklerinde ASM seildiyse bu seenek seilmelidir.
Use Oracle-Managed Files Bu seenek seildiinde dosyalarn yerleri veya adlar ile ilgili sonradan
yaplamaz.
Oracle Veritaban 173

ekil 8: DBCA dosya konumlandrma ekran.

Bu admda Use Database File Locations From Template seeneini seip Next butonuna tkla-
yarak devam edebiliriz.

ekil 9: DBCA kurtarma yaplandrmas ekran.

ekil 9daki kurtarma yaplandras ekran backup ve kurtarma ilemlerinin yaplandrlmas iin
kullanlr. Bu aamada 2 seenek mevcuttur ve her ikisi bir arada da kullanlabilir seeneklerdir.
lk seenek olan Specify Flash Recovery Area seildiinde ilgili dosyalarn nerede saklanaca
ve bu alann MB cinsinde bykl tanmlanr. Bu alan tercihen fiziksel olarak veri taban dos-
yalarnn bulunduu yerden farkl olmaldr. Dier seenek olan Enable Archiving seenei seili
olduunda ariv loglamas yapacamz ifade eder. DBCA kurtarma yaplandrmas ekrannda
174 Blm 10

sadece Specify Flash Recovery Area seeneini iaretleyip Next butonuna tklayarak devam
edebiliriz.

ekil 10: DBCA veri taban ierii ekran, Database Components sekmesi.

ekil 10daki veri taban ierii ekrannn Database Components sekmesinde, Oracle Data Mi-
ning, Oracle Text, Oracle OLAP gibi Oracle veritaban bileenlerinin hangilerinin kurulan verita-
ban iin kullanlaca ve hangi tablespace zerine yerletirilecei belirlenir. Bu sekmede sample
Schemas seeneini iaretlemeden Custom Scripts sekmesine geelim.

ekil 11: DBCA veri taban ierii ekran, Custom Scripts sekmesi.

Veri taban ierii Custom Scripts sekmesinde, veri taban oluturulduktan sonra zerinde a-
lmasn istediimiz bir SQL script dosyas varsa bu dosyay seerek birtakm kurulumlarn oto-
Oracle Veritaban 175

matik olarak yaplmasn salayabiliriz. Bu ekranda No scripts to run seeneini iaretleyip Next
butonuna tklayarak devam edebiliriz.

ekil 12: DBCA balang parametreleri, Memory sekmesi.

ekil 12deki balang parametreleri, Memory sekmesinde oluturduumuz veritaban iin fizik-
sel bellek alan zerinde ne kadar yer kullanlacan tanmlayabiliriz. Typical Allocate memory
as a percentage of total physical memory seenei ve Custom seenei bulunur. Eer 1.seenek
seilirse bellek ynetimini Oracle kendisi yapar. Dier seenekte ise bellek ynetiminde SGA
(System Global Area) ve PGA (Process Global Area) iin bellekte ne kadar yer ayracamz
belirtebiliriz. Bu sekmede 1.seenei iaretleyerek Sizing sekmesine geelim.

ekil 13: DBCA balang parametreleri, Sizing sekmesi.


176 Blm 10

ekil 13deki balang parametreleri, Sizing sekmesinde Microsoft SQL Serverdaki veri sayfa-
sna (data page) karlk gelen blok boyutu girilebilir. Transactional veri tabanlar iin bu boyut
genellikle 8KBdir. Data warehouse iin 16KB ve st dnlmelidir. Processesde belirtilen say
iletim sisteminden bu veritabanna alabilecek maksimum e zamanl process saysn belirtir.
En bata belirtilen arka planda alan processler iin en az 6 olarak tanmlanmaldr. Burada
belirtilen say bydke bellekte SGA olarak bu veri taban iin ayrlacak alan byyecektir.
Buradaki sayy da 150de brakarak Character Sets sekmesine geelim.

ekil 14: DBCA balang parametreleri, Character Sets sekmesi.

ekil 14teki balang parametreleri, Character Sets sekmesinde yerelletirme ayarlar yaplr.
Bu ayarlar Microsoft SQL Serverdaki collation yaplandrmas gibi dnebiliriz. Use the default
seenei iletim sisteminde o andaki seili karakter setine gre, Use Unicode, Unicodea gre,
Choose from the list of character setsde seeceimiz karakter setine gre veri tabann yaplan-
drr. Bu 3l seimin altnda bulunan National Character Set Unicode olarak tanmlanmayan ka-
rakter setine alternatif Unicode karakter setinin eklenmesini salar. Default Language, tarih, AM,
PM gibi yerel ayarlar ve ORDER BY ile sralama yapsnn hangi dile gre yaplacan belirler.
Default Date Format ise tarih verilerinin hangi lkeye, dile gre gsterileceini tanmlar. Bu sek-
mede sadece Use the Default seeneini seip, dier hibir seenei deitirmeden Connection
Mode sekmesine geelim.

ekil 15teki balang parametreleri, Connection Mode sekmesinde Oracle veri taban sunucu-
suna balant ekli belirtilir. Burada 2 seenek mevcuttur. Dedicated Server Mode seildiinde
veri tabanna balanan her istemci iin ayr bir kaynak ayrlr. Eer veri tabanna balanan kulla-
nc says ok deiken deil ve az saydaysa ve balanan kullanclar ok ksa srede balan-
tlarn sonlandrmyorlarsa bu seenek seilmelidir. 2. seenek olan Shared Server Mode ise bir
nceki seenek iin tanmlanan durumlarn dnda kalan uygulamalar iin idealdir. Bu seenekte
kaynaklarn ortak kullanm sz konusu olduundan ne kadar ortak server processinin oluturula-
ca tanmlanmaldr. Genellikle ou OLTP veri taban iin Shared Server Mode, ou OLAP veri
taban iin de Dedicated Server Mode daha doru seim olacaktr. Bu sekmede Shared Server
Mode seeneini iaretleyip, Shared Server saysn 1 brakp (bu veri taban oluturma ilemi
rnek olduu iin 1de braktk, bu say veri tabannn kullanm younluuna ve gelen istemlerin
byklklerine gre ayarlanmaldr) Next butonuna tklayarak devam edebiliriz.
Oracle Veritaban 177

ekil 15: DBCA balang parametreleri, Connection Mode sekmesi.

ekil 16: DBCA veri taban saklama yaps ekran.

ekil 16daki veri taban saklama yaps ekranndan daha nce belirlediimiz (rnek ablona gre
setiimiz iin tek tek tanmlamadk) veri tabanna yazlacak dosyalarn yerleri ve isimleriyle ilgili
deiiklikleri yapabilmemizi salar. Bu ekrandan soldaki aa yapsndan kontrol dosyalar, veri
dosyalar ve log dosyalarnn yerlerini ve yaplar grntlenip deitirilebilir. Burada herhangi bir
deiiklik yapmadan Next butonuna tklayarak devam edelim.

ekil 17deki veri taban oluturma ekran DBCA sihirbaznn son ekrandr. Bu ekranda 3 seenek
mevcuttur. Create Database seenei tanmladmz veri tabannn fiziksel olarak oluturulmas-
n salar. Save as a Database Template seenei yaplandrdmz veri taban yapsnn ablon
olarak saklanmasn salar. Generate Database Creation Scripts seenei de yaplandrdmz
178 Blm 10

veri taban yapsnn scriptinin oluturulmasn salar. Bu ekrandaki seeneklerini herhangi birini,
ikisini ya da hepsini seebiliriz. Sadece Create Database seeneini seerek Finish butonuna
tklayarak tanmladmz veri tabann oluturalm.

ekil 17: DBCA veri taban oluturma ekran.

Sihirbaz veri tabann oluturmadan nce tm parametreleri zet eklinde karr. Bu ekran ze-
rinden deiiklik yaplamaz. Save as an HTML file seeneiyle bilgi olarak saklamak faydal ola-
bilir. OK butonuna tkladmzda veri taban oluturulmaya balayacaktr.

ekil 18: Veri taban parametreleri ekran.


Oracle Veritaban 179

ekil 19: Veri taban oluturma ekran.

ekil 19da veri tabannn oluturulma srecini grebilirsiniz. Bylece Oracle zerinde rnek veri
taban oluturma ilemini tamamlam olduk.

Temel Veri Tipleri


varchar2: 4000 taneye kadar karakter tutabilen veri tipidir. Microsoft SQL Serverdaki varchar
veri tipi gibi dnlebilir. Eer saklanacak verinin banda ya da sonunda boluk (space) karak-
teri varsa bunlar silerek tutar.

nvarchar2: 4000 taneye kadar Unicode karakter tutabilen veri tipidir. Microsoft SQL Serverdaki
nvarchar veri tipi gibi dnlebilir. Eer saklanacak verinin banda ya da sonunda boluk (spa-
ce) karakteri varsa bunlar silerek tutar.

char: 2000 taneye kadar sabit uzunluklu karakter tutabilen veri tipidir. Microsoft SQL Serverdaki
char veri tipi gibi dnlebilir.

nchar: 2000 taneye kadar sabit uzunluklu Unicode karakter tutabilen veri tipidir. Microsoft SQL
Serverdaki nchar veri tipi gibi dnlebilir.

number: Her trl saysal verilerin tutulabilecei veri tipidir. Microsoft SQL Serverdaki int, flo-
at gibi veri tiplerine karlk olarak dnlebilir. Dikkat edilmesi gereken nokta Microsoft SQL
Serverdaki decimal gibi tanmlanmasdr.

date: Saniye baznda tarih ve zaman verisi tutar. Geerli tarih aral M 1 Ocak 4712den MS 31
Aralk 9999a kadardr. Microsoft SQL Serverdaki smalldatetime veri tipi gibi dnlebilir.

timestamp: date tipine ok benzeyen bir veri tipidir. date tipine gre daha detayl zaman bilgisi
tutar. Microsoft SQL Serverdaki datetime veri tipi gibi dnlebilir.

clob (character large object): 4 GBa kadar karakter verisi tutar. varchar2nin bytlm bir
tipi olarak dnlebilir. Microsoft SQL Server 2005 ile birlikte gelen varchar(max) veri tipi gibi
dnlebilir.

blob (binary large object): cloba benzer bir veri tipi olmakla birlikte iinde tuttuu veri tipi
binarydir. Maksimum bykl 4 GBtr. Microsoft SQL Serverdaki text, image tiplerine ben-
zerdir.

Oracleda Kullanc Ynetimi ve Gvenlik


Oracle sisteminde kullanc ynetimi ve gvenlik Microsoft SQL Servera gre daha detayldr;
nk Microsoft SQL Server sadece Microsoft Windows ailesi iletim sistemlerinde alrken
180 Blm 10

Oracle Microsoft Windows ailesi, UNIX trevleri ve Linux trevleri zerinde de almaktadr. Bu
sebeple kullanc yaps farkllklar gstermektedir. rnein Microsoft SQL Serverda olan Win-
dows Authentication Oracle iin geerli deildir; ancak bunu karlayan farkl bir yap mevcuttur.
Ayrca Oracleda kullanc, hesap ve ema (schema) ifadeleri ayn anlamda kullanlabilir. Kimlik
denetleme yntemlerine gemeden nce kimlik denetiminde kullanlan baz kavramlar tanmla-
yalm.

Default Tablespace: Bir kullancnn oluturduu/oluturaca nesnelerin (schema objects),


nesne oluturulurken nesnelerin hangi tablespace zerinde tutulaca belirtilmediinde default
olarak tutulduu tablespacetir. Kullanc tanmlanrken belirtilmezse, veri taban kendi default
tablespaceini kullancya da default tablespace olarak atar.

Ara lemler in Kullanlan (Temporary) Tablespace: Temporary tablespace zerinde GROUP


BY, ORDER BY, DISTINCT, JOIN ve index oluturma gibi geici alan ihtiyac olan ilemlerde kul-
lanlan tablespacetir, ayn zamanda geici tablolar iin de kullanlr. Kullanc tanmlanrken belir-
tilmezse, veri taban kendi default tablespaceini kullancya da default tablespace olarak atar.

Profiller: Kullanc ynetimini kolaylatran bir mekanizmadr. Her kullanc mutlaka bir profil al-
tnda tanmldr. Kaynaklarn kullannm profil tanmna gre kstlar ve ifre kurallarnn tanmlan-
masn salar. Kullanc tanmlanrken belirtilmezse, kullanc Oracle default profile atanr.

Authentication (Kimlik Denetleme) Yntemleri


Oracleda 3 kimlik denetleme yntemi vardr. Bu yntemler u ekildedir:

1 Password Authentication
2. External Authentication
3 Global Authentication

Password Authentication
Microsoft SQL Serverdaki SQL Authentication ile eleniktir. Kullanclar Oracle veri taban ze-
rinde tanmldr. Oracle kullancya ait ifreyi zerinde ifreli olarak tutar. Password Authentication
ile kullanlacak bir kullanc yle tanmlanr:

CREATE USER kaya IDENTIFIED BY qwedcv89;

Burada kaya kullancnn adyken qwedcv89 bu kullancn ifresidir.

Bu kullancya ait bir default tablespace; yani oluturaca nesnelerin tutulaca bir tablespace
belirtmek istersek;

CREATE USER kaya IDENTIFIED BY qwedcv89


DEFAULT TABLESPACE xyz;

ifadesini kullandmzda bu kullancnn nesnelerinin yaratlaca default tablespace xyz adl


tablespace olacaktr. Eer kaya kullancs daha nceden oluturulduysa ALTER ifadesi ile de
default tablespace tanmlayabiliriz.

ALTER USER kaya


DEFAULT TABLESPACE xyz;

Bu kullanc iin bir de geici tablespace tanmlamak istersek;

CREATE USER kaya IDENTIFIED BY qwedcv89


DEFAULT TABLESPACE xyz
TEMPORARY TABLESPACE abc;
ifadesini kullanabiliriz. Bu durumda kaya kullancsnn altrd byk veri zerinde ilem
yapp geici alanlar kullanan sorgular, geici tablespace olarak abc tablespaceini kullanacaktr.
Oracle Veritaban 181

Profil tanmlamak iin de u ekilde bir ifade kullanabilirsiniz:

CREATE USER kaya IDENTIFIED BY qwedcv89


DEFAULT TABLESPACE xyz
TEMPORARY TABLESPACE abc
PROFILE prf1;

External Authentication
External authentication Microsoft SQL Serverdaki Windows authenticationa ok benzerdir. Kul-
lanclar yine veri tabannda tutulur; ancak kimlik denetlemesini iletim sistemi yapar. Microsoft
SQL Serverdaki Windows authenticationdan en nemli fark sadece Microsoft Windowsla deil
dier iletim sistemleri ile de entegre alabilmesidir. Bu tip kullanclar OPS$ kullanclar olarka
da adlandrlrlar. External authentication mekanizmasyla bir kullanc tanmlamak iin;

CREATE USER ops$kaya IDENTIFIED EXTERNALLY;

ifadesini kullanabiliriz. Bu durumda iletim sistemi zerinde kullanc ad kaya olan kullanc,
Oracle sistemine, ilgili iletim sistemi zerinden onaylanarak girecektir. Bu ilem Linux ve UNIX
trevleri iin olduka kolaydr; ancak Windows zerinde bir miktar karmaktr. Linux ve UNIX
trevlerinde /etc/passwd iinde kullancnn tanmlanm olmas yeterlidir. Windows zerindeki bir
kullancy Oracleda tanmlamak iin yapmamz gerekenler u ekildedir:

1 Windows iletim sistemi zerinde kullancy tanmlayn.


2. Tanmladnz kullancy Windows zerinde ora_dba grubuna ekleyin.
3 Start > Programs > Oracle - OraDb10g_home1 > Configuration and Migration Tools > Ad-
ministration Assistant for Windows zerinden OS Database Administrators ve OS Database
Operators gruplarna ekleyin.
4. SPFILE dosyasnda OS_AUTHENT_PREFIX=OPS$ eklinde tanmlana yapn.
5. CREATE USER OPS$kullanici IDENTIFIED EXTERNALLY; ifadesini SQL Plus zerinde
altrn.

Global Authentication
Oracle zerinde Microsoft SQL Serverdan farkl olarak bulunan bir authentication mekanizmas-
dr. Authentication ilemi, gelimi gvenlik opsiyonu ile salanan bir servis araclyla salanr
ve password authenticationdaki ifrelerin tutulmas sz konusu deildir. Burada kullanlan me-
kanizmalara rnek olarak biyometrik yntemler, Kerberos ve X.509 sertifikalar saylabilir. Dier
mekanizmalara gre olduka detayl bir yntemdir.
11
Oracle
zerinde
Programlama
11 Oracle zerinde
Programlama

PL/SQL Nedir?

SQL Plus

TOAD

PL/SQL ile Programlama

PL/SQLde Kontrol Yaplar

PL/SQLde Alfanmerik Tipler

PL/SQLde Mantksal Tipler

PL/SQLde Tarih ve Zaman Tipleri

Referans Tipleri

LOB (Large Object) Tipleri


Oracle zerinde Programlama
PL/SQL Nedir?
PL/SQLi (Procedural Language Extensions to the Structured Query Language) Microsoft SQL
Serverdaki T-SQLin (Transact SQL) Oracle sistemindeki karl olarak dnebilirsiniz. T-SQL
gibi PL/SQL de standart SQL dilinin, gnn gereksinimleri balamnda yetersiz kalmas ereve-
sinde ortaya kmtr. PL/SQL ile stored procedure, trigger gibi veri taban nesneleri oluturabi-
lirsiniz. PL/SQL ifadeleri Oracle veri taban zerinde alr.

PL/SQL dil olarak ilk bakta bir miktar yabanc gelebilir; ancak yeterli veri taban bilginiz varsa
almanz ok zor olmayacaktr. Her dilde olduu gibi bol bol pratik, PL/SQLdeki yetkinliklerinizi
abuk gelitirmeniz asndan ok faydal olacaktr. T-SQLden tandnz standart SQL dilinin
kapsad btn ifadeleri burada da kullanabileceksiniz. Bildiiniz 4 temel SQL ifadesi olan SE-
LECT, INSERT, UPDATE, DELETE ifadelerini aynen kullanabilirsiniz.

PL/SQL ifadelerini yazmak iin kullanabileceiniz temel ortam, Oracle yklemesiyle birlikte gelen
SQL Plustr. SQL Plus Microsoft SQL Server 2000 ve ncesindeki Query Analyzer, Microsoft
SQL Server 2005te SQL Server Management Studiodaki Query Windowa karlk gelen bir ara
olarak dnebilirsiniz; ancak her ikisine gre de daha ilkel bulabilirsiniz.

SQL Plus
SQL Plus Start > Programs > Oracle OraDb10g_home1 > Application Development > SQL
Plus yoluyla altrabilirsiniz. altrdnzda karnza ekil 1deki ekran grnts gelecek-
tir.

ekil 1: SQL Plus Al Ekran.

Program ilk atnzda Log On ekran karnza gelecektir. Bu ekranda User Name blmne
tanmladnz kullanclardan birini girmeniz gerekir. Veri taban olutururken tanmlanan 4 kul-
lancmz vard, bunlardan SYSTEM kullancsn burada kullanabiliriz. Host String blmne de
veri tabanmzn adn yazmalyz. Host Stringte kullanabileceimiz veri tabanlarn tnsnames.ora
dosyasndan da bulabiliriz. Bunun iin Windows Search ile tnsnames.ora dosyasn aratabilirsi-
niz. Baarl bir ekilde login olduunuzda karnza ekil 2deki gibi bir ekran gelecektir.
186 Blm 11

ekil 2: SQL Plus Al Ekran 2.

nce SQL Plus zerinden veri tabanmzda basit bir tablo oluturalm. Bunun iin standart
SQLden bildiimiz CREATE TABLE ifadesini kullanacaz. Bu tablonun oluturulmasn ekil
3de grebilirsiniz.

ekil 3: Tablo oluturmak.

Bu tabloyu oluturduktan sonra tabloya veri girii iin;

INSERT INTO Urun ( UrunId, UrunAdi) VALUES ( 1, ikolata);

yazalm. fadelerin sonunda noktal virgl ; koymay unutmayn. Microsoft SQL Serverda yaz-
dmz ifadelere gre ifadelerin sonunda ; bulunmas gerekir. Ayrca bu ifadeyi ya da ifade
blounu altrmak iin Entera basmanz yeterlidir.

Benzer ekilde bir sorgu yapmak iin de SQL Plusta

SELECT * FROM Urun;

yazarak Urun tablosunun iindeki verileri inceleyebiliriz. Yazdmz bu ifadeleri SQL Plus ekra-
nnda ekil 4te grebilirsiniz.
Oracle zerinde Programlama ve PL/SQL 187

ekil 4: SQL Plusta SQL fadeleri.

TOAD
SQL Plusa daha iyi bir alternatif olarak TOADu kullanabilirsiniz. http://www.toadsoft.com/lic_ag-
ree.html adresinden TOADun Oracle iin cretsiz (freeware) versiyonunu indirebilirsiniz.

TOAD Oracle, Microsoft SQL Server, IBM DB2 ve mySQL gibi veri tabanlar iin kullanlabilen
bir aratr. TOADu Microsoft SQL Server 2005 Management Studio gibi dnebilirsiniz. Hem
ynetim hem de programlama arayzlerini birlikte sunar.

ekil 5: TOAD Login Ekran.

ekil 5teki TOADun login ekrann Microsoft SQL Server Login ekranna benzer olarak dne-
bilirsiniz. Balanacanz veri tabann, hangi kullanc ile hangi rolle ve hangi sunucuya balana-
canz belirterek TOADun ana ekranna geebilirsiniz. Dikkat edeceiniz gibi Windows Authen-
tication eklinde bir seenek bulunmaz. Oracleda Windows Authentication eklinde bir seenek
bulunmaz; ancak external authentication ile Windows kullanclar ile Oracle sistemine login ola-
bilirsiniz. Bu opsiyonu kurmak Microsoft SQL Server kadar kolay ve dz deildir. Bu sebeple
Oraclen kendi kullanc (schema) sistemini kullanarak devam edeceiz. TOAD login ekrannda
bilgileri doru olarak girip Connect butonuna tkladmzda ana ekrana geebiliriz.
188 Blm 11

ekil 6: TOAD ana ekran.

TOAD ana ekrannda ekil 6dan grdnz gibi pek ok ii yapabilirsiniz. Buraya standart SQL
ve PL/SQL sorgularnz yazarak altrabilirsiniz. Sorgu yazarken, eer sorguda nesne kullan-
yorsak dikkat etmemiz gereken nokta nesne adndan nce schema adn yazmamz gereklilii-
dir. Schemalar Microsoft SQL Server 2005teki schemalara denk olarak dnebiliriz. SYSTEM
kullancsn da Microsoft SQL Server 2005deki dboya karlk gibi grebiliriz. Aslnda birebir bu
ekilde denkletirmeler sz konusu olmasa da bu benzetmeleri bir kolaylk olarak grebilirsiniz.

ekil 7: TOADda sorgu.


Oracle zerinde Programlama ve PL/SQL 189

TOADda sorgu yazmay ekil 7de grebilirsiniz. SQL ifadelerinin sonunda ; kullanmanz ya
da kullanmamanz sorgu sonucunu deitirmez. Sorguda daha nce oluturduumuz Urun tab-
losunu SYSTEM.Urun olarak kullandmza dikkat edin. Bu ekilde yazmazsanz hata alrsnz.
Sorguyu altrmak iin klavyeden F5 tuunu kullanabilirsiniz. Bununla birlikte TOAD zerindeki
toolbardan da sorgular altrabilirsiniz. Sorgu altrabileceiniz butonlar ekil 8den grebi-
lirsiniz.

ekil 8: TOAD sorgu altrma butonlar.

PL/SQL ile Programlama


PL/SQL ile programlamaya basit bir rnek ile balayalm. T-SQLdekine gre muhtemelen en ok
zorlayacak durum PL/SQL iinde kullanlabilecek fonksiyonlarn okluu olacaktr. PL/SQLde
byk ya da kk harf kullanarak kod yazabilirsiniz.

Uygulama 1: PL/SQL ile lk rnek Uygulama

1 DECLARE
2 UrunSayisi INTEGER;
3 BEGIN
4 SELECT
5 COUNT(*) INTO UrunSayisi
6 FROM Urun;
7 DBMS_OUTPUT.PUT_LINE(Urun Sayisi: || UrunSayisi);
8 END;

Uygulama 1deki kod olduka basit bir uygulamadr; ancak PL/SQL konusunda olduka nemli
bilgiler verir. Bu rnekte 1 ve 2 numaral satrlar tanmlama (declaration) bloudur. Altndaki kod
blounda kullanlacak deikenler, parametreler gibi yaplar burada tanmlanr. rneimizde 2
numaral satrda INTEGER tipinde, UrunSayisi adnda bir deiken tanmlanmtr. 3 numaral
satrda altrma blounun (execution block) baladn gsteren BEGIN ifadesi bulunuyor. r-
nekteki 8 numaral satrda bulunan END ifadesine kadar tm ifadeler altrma blounun iinde-
dir. 4, 5 ve 6 numaral satrlarda Urun tablosu iindeki satr saysn UrunSayisi deikeninin iine
atan basit bir sorguyu grebilirsiniz. 5 numaral satrdaki INTO ifadesini T-SQLde kullandmz
deikene deer atamadaki = gibi dnebilirsiniz. 7 numaral satrda ise T-SQLdeki print
ifadesine benzer bir i yapan DBMS_OUTPUT.PUT_LINE fonksiyonu bulunuyor. DBMS_OUTPUT.
PUT_LINE DBMS Output tamponuna yazma ilemi yapar. Bu fonksiyonun iinde kullandmz
|| iaretini T-SQLde alfanmerik ifadeleri birletirmek iin kullandmz + iaretinin yerine kul-
lanyoruz. T-SQLde print ifadesinde bu ekilde bir kt almak iin ise tanmladmz int de-
ikeni ncelikle alfanmerik bir tipe evirmemiz gerekir, nk print 2 ifadeyi otomatik olarak
alfanmerie dntrmez. Buradan da anlayacamz gibi DBMS_OUTPUT.PUT_LINE fonksiyo-
nu otomatik evirme (implicit conversion) yapmaktadr. Burada T-SQLde kullandmz SELECT
@UrunSayisi gibi bir ifade ile deikenin tad deeri yazdramayz. 8 numaral satrda da
alma blou sona ermektedir. Bu rnein T-SQLdeki benzer karln Uygulama 1.1de ince-
leyebilirsiniz.
190 Blm 11

Uygulama 1.1: Uygulama 1deki PL/SQL Kodunun T-SQLdeki Elenii

1 DECLARE @UrunSayisi int


2 SELECT
3 @UrunSayisi = COUNT(*)
4 FROM Urun
5 PRINT Urun Sayisi: + CONVERT( varchar, @UrunSayisi)

Uygulama 1deki rnei TOADda altrdnzda herhangi bir kt gremezsiniz. nk DBMS_


OUTPUT.PUT_LINE fonksiyonu bir alma ekrannda bir sonu retmez bir tampona yazar.
TOAD ile bu tampon blgeyi grntleyebiliriz. Bunun iin rnek uygulamay altrmadan nce
View mensnden DBMS Output seeneini sein. Karnza bo bir ekran gelecektir. Standart
Windows uygulamalarnda olduu gibi, daha nceden kod yazdnz pencereye dnmek iin Ctrl-
Tab kullanabilirsiniz ya da TOADun Window mensnden dier pencereye gei yapabilirsiniz.

ekil 9: Uygulama 1in almasnda sorgu ekran.

ekil 9da grebileceiniz gibi burada satr says ile ilgili herhangi bir sonu gremiyoruz, sadece
PL/SQL procedure successfully completed ifadesini grebilirsiniz.

ekil 10: TOAD DBMS Output penceresi.


Oracle zerinde Programlama ve PL/SQL 191

ekil 10da TOAD DBMS Output penceresini grebilirsiniz. Burada DBMS_OUTPUT.PUT_LINE


ifadesinin sonucu olan Urun Sayisi: 2 stringi yazlmtr.

PL/SQLde Kontrol Yaplar


PL/SQLde T-SQLdeki gibi IF-THEN-ELSE kontrol yaps bulunur. Bununla birlikte T-SQLde
bulunmayan CASE yaps da mevcuttur. CASE yaps C#taki ve Javadaki switch yaps eklinde
alr.

IF-THEN-ELSE
Uygulama 2: PL/SQL ile IF-THEN-ELSE

1 DECLARE
2 UrunSayisi INTEGER;
3 BEGIN
4 SELECT
5 COUNT(*) INTO UrunSayisi
6 FROM Urun;
7 IF UrunSayisi <= 2
8 THEN
9 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2 ||
|| den az ya da 2);
10 ELSE
11 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2 ||
|| den fazla...);
12 END IF;
13 END;

Uygulama 2deki kodun 7, 8, 9, 10, 11 ve 12 numaral satrlarda IF-THEN-ELSE yapsn gre-


bilirsiniz. PL/SQLdeki IF-THEN-ELSE yaps T-SQLdeki IF-ELSE blou ile ayn ekilde alr.
Uygulama 2.1de Uygulama 1deki PL/SQL kodunun T-SQL eleniini inceleyebilirsiniz.

Uygulama 2.1: Uygulama 1deki Kodun T-SQL Elenii

1 DECLARE @UrunSayisi int


2 SELECT
3 @UrunSayisi = COUNT(*)
4 FROM Urun
5 IF @UrunSayisi <= 2
6 PRINT Urun sayisi 2 + char(39) + den az ya da 2
7 ELSE
8 PRINT Urun sayisi 2 + char(39) + den fazla...

IF-THEN-ELSIF-ELSE
IF yapsnn en detayl ekli ELSIF ile kullanlan eklidir. ELSIF (ELSE IFin ksaltmas) yaps
T-SQLdeki ELSE IF ile ayn ekilde alr. ELSIF, stndeki IF ya da ELSIF bloundan false
ile kldnda alr ve tanmlad koul true sonu veriyorsa blou altrr; aksi takdirde ken-
dinden sonra gelen bloa geer.
192 Blm 11

Uygulama 3: PL/SQL ile ELSIF

1 DECLARE
2 UrunSayisi INTEGER;
3 BEGIN
4 SELECT
5 COUNT(*) INTO UrunSayisi
6 FROM Urun;
7 IF UrunSayisi < 2
8 THEN
9 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2 ||
|| den az...);
10 ELSIF UrunSayisi > 2
11 THEN
12 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2 ||
|| den fazla...);
13 ELSE
14 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2);
15 END IF;
16 END;

Uygulama 3de 7 numaral satrda eer UrunSayisi 2den kk deilse 10 numaral satrdaki
ELSIF alr. Eer UrunSayisi 2den bykse 12 numaral satr alr. Eer UrunSayisi
2den de byk deilse 2ye eit demektir. Bu durumda da 13 numaral satrdan dolay 14 numa-
ral satr alr.

Eer IF yaps ierisinde bir blok oluturumak istersek bunun iin T-SQLde olduu gibi BEGIN-
END blok yaplandrclar ile blou tanmlamalyz.

Uygulama 3.1: PL/SQL ile ELSIF

1 DECLARE
2 UrunSayisi INTEGER;
3 BEGIN
4 SELECT
5 COUNT(*) INTO UrunSayisi
6 FROM Urun;
7 IF UrunSayisi < 2
8 THEN
9 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2 || || den az...);
10 ELSIF UrunSayisi > 2
11 THEN
12 BEGIN
13 DBMS_OUTPUT.PUT_LINE(ELSIF blogu...);
14 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2 || || den
fazla...);
15 END;
16 ELSE
Oracle zerinde Programlama ve PL/SQL 193

17 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2);


18 END IF;
19 END;
Uygulama 3.1de 10 numaral satrdan balayan ELSIF blou 15 numaral satra kadar de-
vam eder. Eer UrunSayisi 2den bykse ELSIF iinde tanmlanan her 2 DBMS_OUTPUT.
PUT_LINE ifadesi de alacaktr. Her ne kadar yazdmz BEGIN-END blok yaplandrclarn
kullanmak zorunda olmasak da kodun okunurluunu artrmak asndan blok yaplandrclarn
kullanmak faydaldr.

e IF Yaplar
PL/SQLde i ie IF yaplar da kullanlabilir. alma ekli C#, Java ya da T-SQLden farkl de-
ildir.

Uygulama 4: PL/SQL ile e IF Yaps

1 DECLARE
2 UrunSayisi INTEGER;
3 UrunSayisiB INTEGER;
4 BEGIN
5 SELECT
6 COUNT(*) INTO UrunSayisi
7 FROM Urun;
8 SELECT
9 COUNT(*) INTO UrunSayisiB
10 FROM Urun
11 WHERE UrunAdi LIKE B%;
12 IF UrunSayisi < 2
13 THEN
14 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2 ||
|| den az...);
15 IF UrunSayisiB = 1
16 THEN
17 DBMS_OUTPUT.PUT_LINE(B ile
baslayan urun sayisi: || UrunSayisiB);
18 END IF;
19 ELSIF UrunSayisi > 2
20 THEN
21 BEGIN
22 DBMS_OUTPUT.PUT_LINE(ELSIF blogu...);
23 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2 ||
|| den fazla...);
24 END;
25 ELSE
26 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2);
27 END IF;
28 END;
194 Blm 11

Uygulama 4te 8 ile 11 numaral satrlardaki SELECT ifadesinde UrunSayisiB deikenine B


harfiyle balayan rnlerin says atanacaktr. Eer UrunSayisi 2den kkse 15 numaral
satrdaki i IF yaps da alacaktr. Eer UrunSayisiB 1e eitse de 17 numaral satr ala-
caktr.

IF Yaps ile lgili Dikkat Edilmesi Gereken Noktalar


1 Her IF iin mutlaka bir END IF bulunmaldr.
2. Her END IF kendinden nceki ilk IF ifadesine aittir.
3 END IF birleik yazlmaz.
4. END IFin sonunda mutlaka ; bulunmaldr.
5. ELSIF yazarken ELSEin son E harfi yoktur.

CASE
CASE yaps C# ve Javadaki switch yaps gibi alr. IF-THEN-ELSIF-ELSE yapsn daha
kolay ve okunakl hale getirir. PL/SQLdeki CASE yapsn T-SQLde SELECT ifadesinin iinde
kullanlan CASE ifadesiyle kartrmamak gerekir. T-SQLdeki CASE yaps result setin iindeki
tm kaytlar iin tek tek alrken PL/SQLde kaytlar baznda almaz. Kod yazm olarak her
ikisi de birbirine ok benzerdir.

Uygulama 5: PL/SQLde CASE rnei 1

1 DECLARE
2 UrunSayisi INTEGER;
3 BEGIN
4 SELECT
5 COUNT(*) INTO UrunSayisi
6 FROM Urun;
7 CASE UrunSayisi
8 WHEN 2 THEN
9 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2);
10 WHEN 3 THEN
11 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2);
12 ELSE
13 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 3 ||
|| ten fazla...);
14 END CASE;
15 END;

Uygulama 4te 7 14 numaral satrlar CASE blounu oluturur. 7 numaral satrdaki CASE Urun-
Sayisi ifadesi UrunSayisi deikeninin karlatrmada kullanlacan gsterir. 8 numaral
satr eer UrunSayisi deikeninin 2ye eitliini kontrol eder. Eer 2ye eitse 9 numaral sat-
ra geer, eit deilse 10 numaral satr ve UrunSayisi deikeninin 3e eit olup olmad kon-
trol eder. 3e eit olmas halinde 11 numaral satr alr; aksi takdirde 12 numaral satrdaki ELSE
ifadesine gelir. PL/SQLde CASE yapsnda ELSE ifadesi C# ve Javadaki switch ifadesindeki
default gibi alr. Eer ELSEten nce gelen WHEN ifadelerinin hibirinde true olumazsa ELSE
blou alr. WHEN bloklarnn sonunda C# ve Javadaki break ifadesinin yerine kullanlmas
gereken herhangi bir ifade yoktur.

Uygulama 5teki yapy IF-ELSIF-ELSE ile kurmak daha doru olacaktr. Uygulama 3deki gibi
bir IF yapsn CASE ile yazmak istersek PL/SQL bu konuda bize esneklik salamaktadr.
Oracle zerinde Programlama ve PL/SQL 195

Uygulama 6: PL/SQLde CASE rnei 2

1 DECLARE
2 UrunSayisi INTEGER;
3 BEGIN
4 SELECT
5 COUNT(*) INTO UrunSayisi
6 FROM Urun;
7 CASE TRUE
8 WHEN UrunSayisi < 2 THEN
9 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2 ||
|| den az...);
10 WHEN UrunSayisi > 2 THEN
11 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2 ||
|| den fazla...);
12 ELSE
13 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2);
14 END CASE;
15 END;

Uygulama 6da 7 numaral satr her durumda alacaktr. 8 numaral satrda UrunSayisi de-
ikeninin deerinin 2den kk olup olmad kontrol edilir. Eer 2den kkse 9 numaral satr
alr; aksi takdirde 10 numaral satrda UrunSayisi deikeninin deerinin 2den byk olup
olmad kontrol edilir. Eer 2den bykse 11 numaral satr alr; aksi takdirde 12 numaral
satrdaki ELSE ifadesi alr. Bu noktadan sonraki alma Uygulama 5teki ELSE blou ile ayn
ekildedir.

Uygulama 6daki rnee benzer olarak CASE ifadesinini farkl bir kullanm daha vardr. CASEin
bu kullanm esneklii daha da artrr ve zellikle karmak mantksal ilemler iin idealdir.

Uygulama 7: PL/SQLde CASE rnei 3

1 DECLARE
2 UrunSayisi INTEGER;
3 UrunSayisiB INTEGER;
4 BEGIN
5 SELECT
6 COUNT(*) INTO UrunSayisi
7 FROM Urun;
8 SELECT
9 COUNT(*) INTO UrunSayisi
10 FROM Urun
11 WHERE UrunAdi LIKE B%;
12 CASE
13 WHEN UrunSayisi < 2 AND UrunSayisiB = 1 THEN
14 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2 || || den az...);
15 WHEN UrunSayisi > 2 AND UrunSayisiB < 1 THEN
196 Blm 11

16 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2 ||
|| den fazla...);
17 ELSE
18 DBMS_OUTPUT.PUT_LINE(Urun Sayisi 2);
19 END CASE;
20 END;

Uygulama 7de 12 numaral satrdaki CASE ifadesi ne olursa olsun alacaktr ve CASE ile 1den
fazla sayda deiken kontrol edilebilecektir.

u ana kadar yaptmz rnekleri TOAD yerine SQL Plus ile yapmak istediinizde yazarken dik-
kat etmeniz gereken birka nokta vardr. DBMS_OUTPUT.PUT_LINE fonksiyonunun almas iin
SET SERVEROUTPUT ON ifadesini bir kere altrmalsnz. Bu ifadeyi Microsoft SQL Serverdaki
direktiflere benzetebilirsiniz. SET SERVEROUTPUT ON ifadesi TOADdaki View mensndeki
DBMS Output esinin almas ilevini grr. SET SERVEROUTPUT ON ifadesini altrdktan
sonra PL/SQL blounu yazabiliriz. Bloun sonunda / iaretini kullandmzda yazdmz blok
alacaktr. ekil 11de SQL Plus ile PL/SQL bloklarnn nasl altrldna ynelik ekran k-
tsn grebilirsiniz.

ekil 11: SQL Plus ile PL/SQL bloklarnn altrlmas.

PL/SQLde Deikenler
PL/SQLde veri tipleri 4 ana gruba ayrlr. Bu gruplar:

1 Basit (skaler) Tipler: T-SQLdeki basit tiplere ya da Java ve C#taki deer tipli deikenlere
benzetilebilir. Herhangi bir anda dorudan tek deer tarlar, bellekte dorudan tutulurlar.
2. Btnleik (kompozit) Tipler: Dizi gibi kendi iinde tek tek ilenebilecek, T-SQLde eksikli-
ini hissettiimiz tiplerdir. Java ve C#taki dizilere benzetebiliriz; ancak Java ve C#ta dizilerin
referans tipli olduunu unutmamak gerekir.
3 Referans Tipleri: Bir iareti (pointer) araclyla tad deerlere eriilebilen tiplerdir. T-
SQLde dorudan karl yoktur. Java ve C#taki referans tipli deikenlerle benzer mantkta
alrlar.
4. LOB (Large Object) Tipleri: ekil, metin gibi byk verileri tutmak iin gelitirilmi tiplerdir. T-
SQLdeki text, image gibi dnlebilir. znde referans tipli yaplara ok benzerdirler; nk
tadklar deer resmin ya da metnin balangcn gsteren bir iaretidir.
Oracle zerinde Programlama ve PL/SQL 197

PL/SQLde bir deikeni tanmlarken nce deikenin adn sonra da tipini yazarz.

DECLARE <deiken ad> <tip ad>;

Herhangi bir deikene deer atamas yaparken := iaretini kullanrz.

<deiken ad> := <deer>

BAST TPLER BTNLEK TPLER REFERANS TPLER LOB TPLER


BINARY_DOUBLE RECORD REF CURSOR BFILE
BINARY_FLOAT TABLE REF object_type BLOB
BINARY_INTEGER VARRAY CLOB
DEC NCLOB
DECIMAL
DOUBLE PRECISION
FLOAT
INT
INTEGER
NATURAL
NATURALN
NUMBER
NUMERIC
PLS_INTEGER
POSITIVE
POSITIVEN
REAL
SIGNTYPE
SMALLINT
CHAR
CAHARACTER
LONG
LONG RAW
NCHAR
NVARCHAR2
RAW
ROWID
STRING
UROWID
VARCHAR
VARCHAR2
BOOLEAN
DATE
TIMESTAMP
198 Blm 11

PL/SQLde Saysal Tipler


Saysal tipler adlarndan anlalabilecei gibi matematiksel ilemlerde kullanlabilecek tiplerdir.
Tam saylar, reel ve ondalkl saylar tutabileceiniz pek ok tip PL/SQLde mevcuttur.

BINARY_INTEGER
32 bitlik (4 byte) iaretli (signed), tam saysal tiptir. -231 ile 231 1 aralnda deerleri tutar. PLS_
INTEGER tipine benzer bir tiptir. NUMBER tipine gre ilem performan avantaj vardr ve NUMBER
tipine gre daha az yer kaplar.

NATURAL, NATURALN, POSITIVE, POSITIVEN, SIGNTYPE tipleri BINARY_INTEGER tipinin alt


tipleridir.

NATURAL ve POSITIVE tipleri sadece pozitif saylar tarlar. Dolaysyla iaretsiz tiplerdir diye-
biliriz. NATURAL tipinin POSITIVE tipinden tek fark 0 (sfr) deerini de alabilmesidir. NATURALN
ve POSITIVEN tiplerinin NATURAL ve POSITIVE tiplerinden tek fark null deer tayamamala-
rdr. NATURAL, POSITIVE, NATURALN ve POSITIVEN tiplerinin tayabilecei en byk deer
231 1dir. SIGNTYPE ise sadece -1, 0 ve 1 deerlerini tayabilir.

rnek 1: BINARY_INTEGER Tanmlama

1 DECLARE
2 bix BINARY_INTEGER;
3 nx NATURAL;
4 nnx NATURALN;
5 px POSITIVE;
6 pnx POSITIVEN;
7 stx SIGNTYPE;
8 BEGIN
9 bix := -55;
10 nx := null;
11 nnx := 0;
12 px := 7;
13 pnx := 88;
14 stx = -1;
15 END;

BINARY_FLOAT ve BINARY_DOUBLE
Java ve C#taki IEEE 754 standardndaki ondalkl tiplerdir. BINARY_FLOAT bir deer sonuna
eklenen f harfiyle (1.004f), BINARY_DOUBLE bir deer sonuna eklenen d harfiyle (3,05478d)
ayrtrlr.

rnek 2: BINARY_FLOAT ve BINARY_DOUBLE Tanmlama

1 DECLARE
2 bfx BINARY_FLOAT;
3 bdx BINARY_DOUBLE;
4 BEGIN
5 bfx := 10.054f;
6 bdx := 10.054d;
7 IF bfx = bdx
Oracle zerinde Programlama ve PL/SQL 199

8 THEN
9 DBMS_OUTPUT.PUT_LINE(Esit);
10 ELSE
11 DBMS_OUTPUT.PUT_LINE(Esit degil);
12 END IF;
13 END;

rnek 2deki 7 numaral satrdaki kontrolden FALSE sonucu kacaktr. Bu sebeple ak 8 nu-
maral satrdan deil 10 numaral satrdan devam edecektir ve DBMS Output penceresine Esit
degil yazacaktr.

NUMBER
PL/SQLdeki en genel saysal tiptir. Hem tam saylar hem de ondalkl saylar tutabilir. Deer
aral 1E-130 ile 10E125tir. NUMBER tipinde bir deikeni sadece NUMBER olarak tanmlaya-
bileceimiz gibi hassasiyet (precission) ve lek (scale) deerleriyle birlikte de tanmlayabiliriz.
Hassasiyet saynn toplam hane (dijit) saysdr, lek ise noktadan sonraki hane saysdr. Do-
laysyla hassasiyet iin yazdmz deer mutlaka lek iin yazdmz deerden byk olmak
zorundadr. NUMBER tipinde bir deikeni sadece hassasiyet deeri ile de tanmlayabiliriz. Bunun
anlam lek deerinin yani ondalk hane saysnn 0 (sfr) olmasdr. En fazla 38 hanelik hassa-
siyet deeri ile tanmlanabilirken lek deeri -84 ile 127 arasnda deiir. lek deerinin negatif
olmas tam saynn yuvarlanmas anlamna gelir. rnein lek deeri -2 olan bir NUMBER dei-
kene 257 deeri 200 olarak atanacaktr.

DEC, DECIMAL, DOUBLE PRECISION, FLOAT, INTEGER, INT, NUMERIC, REAL ve SMALLINT
tipleri NUMBER tipinin alt tipleridir.

DEC, DECIMAL ve NUMERIC tipleri NUMBER gibi tanmlanrken alabilecei en byk lek deeri
38dir.

DOUBLE PRECISION ve FLOAT tiplerinde ondalkl ksm 126 bitte tutulur, bu da yaklak 38
ondalkl haneye karlk gelir.

REAL tipinde ondalkl ksm 63 bitte tutulur, bu da yaklak 18 ondalkl haneye karlk gelir.

INTEGER, INT ve SMALLINT tiplerinde de en fazla hassasiyet seviyesi 38dir. T-SQLdeki tam
saysal tipler gibi dnmek doru deildir; nk PL/SQLdeki bu tiplerde ondalkl ksm tanm-
lanabilir.

rnek 3: NUMBER Tanmlama

1 DECLARE
2 nx1 NUMBER;
3 nx2 NUMBER(3);
4 nx3 NUMBER(3,2);
5 nx4 NUMBER(3,-1);
6 ix1 INTEGER;
7 ix2 INTEGER(3,1);
8 dpx DOUBLE PRECISION;
9 fx FLOAT;
10 BEGIN
11 nx1 := 10;
12 nx2 := 267;
200 Blm 11

13 nx3 := 1.25;
14 nx4 := 254;
15 ix1 := 8;
16 ix2 := 4.7;
17 dpx := 16.874;
18 fx := 6.8;
19 DBMS_OUTPUT.PUT_LINE(nx4 : || nx4);
20 IF fx = dpx
21 THEN
22 DBMS_OUTPUT.PUT_LINE(Esit);
23 ELSE
24 DBMS_OUTPUT.PUT_LINE(Esit degil);
25 END IF;
26 IF nx4 = 250
27 THEN
28 DBMS_OUTPUT.PUT_LINE(nx4 = 250);
29 ELSE
30 DBMS_OUTPUT.PUT_LINE(nx4 <> 250);
31 END IF;
32 END;

rnek 3deki kodun DBMS kts;

nx4 : 250
Esit
nx4 = 250

eklinde olacaktr. Bu rnekte nx4 deikeninin tanmnda lein -1 olmasndan dolay 254 de-
eri 250ye dntrlecektir. Eer lek -2 olsayd 200e dntrlecekti. 20 numaral satrdaki
FLOAT tipinde bir deikenle DOUBLE PRECISION tipinde bir deikenin karlatrlmasnda da
bu tipler arasnda bir nceki rnekte kullandmz BINARY_FLOAT ve BINARY_DOUBLE tiplerin-
den farkl olarak eitlik olduunu grebilirsiniz.

PLS_INTEGER
PLS_INTEGER tipinde de BINARY_INTEGER tipindeki gibi -231 ile 231 1 arasndaki tam saylar
tutulabilir. PLS_INTEGER tipi hem NUMBER tipinden hem de BINARY_INTEGER tipinden daha
hzl alr. Bunun NUMBER ve BINARY_INTEGER ilemleri yazlmsal olarak yaparken PLS_IN-
TEGER tipinin donanmsal olarak yapmasdr.

BINARY_INTEGER tipi eski versiyonlardan bu yana gelen bir tiptir. Eer yeni bir uygulama geli-
tiriyorsanz PLS_INTEGER tipini kullanmak daha iyi olacaktr.

rnek 4: PLS_INTEGER Tanmlama

1 DECLARE
2 pix PLS_INTEGER;
3 bix BINARY_INTEGER;
4 BEGIN
5 pix := 25;
Oracle zerinde Programlama ve PL/SQL 201

6 bix := 25;
7 IF pix = bix
8 THEN
9 DBMS_OUTPUT.PUT_LINE(Esit);
10 ELSE
11 DBMS_OUTPUT.PUT_LINE(Esit degil);
12 END IF;
13 END;

rnek 4 altrdnzda PLS_INTEGER tipinde tanan bir deerle BINARY_INTEGER tipinde


tanan bir deer eer aynysa eitlik sonucunu reteceini grebilirsiniz.

PL/SQLde Alfanmerik Tipler


Alfanmerik tiplerde saysal olarak yorumlanmayacak karakterler ve string tipler tutulur.

CHAR
Belli uzunlukta alfanmerik ifadeleri tutmak iin kullanlr. En fazla uzunluu 32767 karakterdir.
Eer bir uzunluk tanmlanmazsa tek karakter tutar. CHARACTER veri tipini CHAR veri tipiyle ayn
ekilde kullanabilirsiniz.

rnek 5: CHAR Tanmlama

1 DECLARE
2 cx1 CHAR;
3 cx2 CHAR;
4 cx3 CHAR(4);
5 cx4 CHARACTER;
6 BEGIN
7 cx1 := A;
8 cx2 := a;
9 cx3 := ABCD;
10 cx4 := A;
11 IF cx1 = cx2
12 THEN
13 DBMS_OUTPUT.PUT_LINE(Esit);
14 ELSE
15 DBMS_OUTPUT.PUT_LINE(Esit degil);
16 END IF;
17 IF cx1 = cx4
18 THEN
19 DBMS_OUTPUT.PUT_LINE(Esit);
20 ELSE
21 DBMS_OUTPUT.PUT_LINE(Esit degil);
22 END IF;
23 IF cx1 = SUBSTR(cx3, 1, 1)
24 THEN
19 DBMS_OUTPUT.PUT_LINE(Esit);
202 Blm 11

20 ELSE
21 DBMS_OUTPUT.PUT_LINE(Esit degil);
22 END IF;
23 END;

rnek 5i altrdnzda u ekilde bir DBMS kts ile karlarsnz:

Esit degil
Esit
Esit

Bu rnein DBMS ktsndan anlalaca gibi A harfi ve a harfi birbirine eit deildir. 23
numaral satrda kullandmz SUBSTR() fonksiyonu, adndan da anlalabilecei gibi alfan-
merik bir yapdan istediimiz bir paray almak iin kullanlr. SUBSTR fonksiyonunun kullanm
T-SQLdeki SUBSTRING() fonksiyonu gibidir. lk argman para alnacak alfanmerik deer ya
da deikendir. kinci argman, bu deer ya da deikenin kanc karakterinden itibaren para
alnacadr. nc argman, ikinci argmanda belirtilen karakter dahil olmak zere ka tane
karakter alnacan gsterir. Eer nc argman girilmezse, ilk argmanda belirtilen deer ya
da deikenin, ikinci argmanda belirtilen karakterinden sonuna kadar tm karakterleri alnr.

LONG ve LONG RAW


LONG ve LONG RAW tipleri T-SQLdeki LONG tipinden ok farkldr. PL/SQLde LONG ve LONG RAW
32760 bytea kadar alfanmerik deer tutar. Dolaysyla VARCHAR2 tipine benzerdirler. LONG
ve LONG RAW tipleri arasnda veri tabanna INSERT ve SELECT ile yaplan ilemlerde ve veri
tutma biimlerinde farkllklar vardr.

rnek 6: LONG ve LONG RAW Tanmlama

1 DECLARE
2 lx1 LONG;
3 lrx1 LONG RAW;
4 lx2 LONG;
5 lx3 LONG;
6 lrx2 LONG RAW;
7 lx4 LONG(3);
8 lrx3 LONG RAW(3);
9 BEGIN
10 lx1 := ABC;
11 lrx1 := ABC;
12 lx3 := ABC;
13 lx4 := ABC;
14 lrx3 = ABC;
15 IF lx1 = lrx1
16 THEN
17 DBMS_OUTPUT.PUT_LINE(Esit);
18 ELSE
19 DBMS_OUTPUT.PUT_LINE(Esit degil);
20 END IF;
21 lx2 := CONCAT(lx1, lrx1);
Oracle zerinde Programlama ve PL/SQL 203

22 DBMS_OUTPUT.PUT_LINE(lx2);
23 lx2 := CONCAT(lx1, lx3);
24 DBMS_OUTPUT.PUT_LINE(lx2);
25 lrx2 := CONCAT(lx1, lrx1);
26 DBMS_OUTPUT.PUT_LINE(lrx2);
27 END;

rnek 6y altrdmzda aldmz DBMS kts u ekildedir:

Esit degil
ABC0ABC
ABCABC
0ABC0ABC

15 numaral satrda LONG tipindeki, tuttuu deer ABC olan lx1 deikeniyle LONG RAW tipin-
deki, tuttuu deer ABC olan lrx1 deikeni karlatrldnda FALSE sonucu oluur ve 18
numaral satrdaki ELSE blouna der. Dolaysyla LONG ve LONG RAW deikenleri dorudan
karlatrmak istediimiz sonucu retmez. 21 numaral satrda LONG tipindeki lx1 ile lrx1 de-
ikenlerini CONCAT() fonksiyonuyla birletirip LONG tipindeki lx2 deikenine atadk. 22 nu-
maral satrda lx2 deikeninin deerinin ABC0ABC olduunu grdk. 23 numaral satrda
LONG tipindeki lx2 deikenine LONG tipindeki lx1 ve lx3 deikenlerinin birletirilmesi sonucu
oluan deeri atadk ve 24 numaral satrda lx2 deikenininin deerinin ABCABC olduunu
grdk. Benzer ekilde 25 numaral satrda bu sefer LONG RAW tipindeki lrx2 deikeninin iine
LONG tipindeki lx1 ve LONG RAW tipindeki lrx1 deikenlerinin birletirilmesi sonucu oluan
deeri atadk ve 26 numaral satrda sonucun 0ABC0ABC olduunu grdk. Dolaysyla LONG
tipindeki deikenlerle LONG RAW tipindeki deikenleri bir arada kullanrken dikkatli olmakta
fayda vardr.

rnek 7: LONG ve LONG RAW Tiplerinin CHAR ile Karlatrlmas

1 DECLARE
2 lx1 LONG(3);
3 lrx1 LONG RAW(3);
4 cx1 CHAR(3);
5 BEGIN
6 lx1 := ABC;
7 lrx1 := ABC;
8 cx1 := ABC;
9 IF lx1 = lrx1
10 THEN
11 DBMS_OUTPUT.PUT_LINE(Esit);
12 ELSE
13 DBMS_OUTPUT.PUT_LINE(Esit degil);
14 END IF;
15 IF lx1 = cx1
16 THEN
17 DBMS_OUTPUT.PUT_LINE(Esit);
18 ELSE
19 DBMS_OUTPUT.PUT_LINE(Esit degil);
204 Blm 11

20 END IF;
21 IF cx1 = lrx1
22 THEN
23 DBMS_OUTPUT.PUT_LINE(Esit);
24 ELSE
25 DBMS_OUTPUT.PUT_LINE(Esit degil);
26 END IF;
27 END;

rnek 7yi altrdmzda aldmz DBMS kts u ekildedir:

Esit degil
Esit
Esit degil

Bu rnekten de anlalabilecei gibi CHAR tipindeki verilerle LONG tipindeki veriler karlatrlabi-
lirken LONG RAW tipindeki verilerin dorudan karlatrlmas istediimiz sonular vermeyebilir.

ROWID ve UROWID
T-SQLde olmayan tiplerdir. ROWID ve UROWID herhangi bir tablodaki kaydn yeri hakknda bilgi
tutarlar. Bu bilgi fiziksel ve mantksal olmak zere 2 ekildedir. Fiziksel rowid herhangi bir tabloda
satr iin ayrdedici bir zelliktir. Mantksal rowid zerinde index olan bir tablo iin ayrdedicidir.
UROWID hem fiziksel hem de mantksal rowid tutabilir. Eer yeni bir uygulama yazyorsanz ve
bu tip bir veriye ihtiyacnz varsa UROWID tipini tercih etmek daha iyi olacaktr. rnein ROWID ve
UROWID tiplerini tm deerleri ayn olan 2 satrdan birini silerken kullanabilirsiniz.

rnek 8: ROWID ve UROWID Tipleri

1 DECLARE
2 rx1 ROWID;
3 urx1 UROWID;
4 BEGIN
6 SELECT
7 rowid
8 INTO rx1
9 FROM Urun
10 WHERE UrunId = 2;
11 SELECT
12 rowid
13 INTO urx1
14 FROM Urun
15 WHERE UrunId = 2;
16 DBMS_OUTPUT.PUT_LINE(rx1);
17 DBMS_OUTPUT.PUT_LINE(urx1);
18 IF rx1 = urx1
19 THEN
20 DBMS_OUTPUT.PUT_LINE(Esit);
21 ELSE
Oracle zerinde Programlama ve PL/SQL 205

22 DBMS_OUTPUT.PUT_LINE(Esit degil);
23 END IF;
24 END;

rnek 8i altrdmzda aldmz DBMS kts u ekildedir:

AAAM2eAABAAAO5aAAD
AAAM2eAABAAAO5aAAD
Esit

Bu rnekten ROWID tipindeki rx1 ve UROWID tipindeki urx1 deerlerinin esit olduunu grebiliriz.
Bununla birlikte DBMS ktsndaki AAAM2eAABAAAO5aAAD ifadeleri sizde farkl deerlerde
olacaktr. Bu karakter dizisi bir anlam tar. lk 6 karakter (rneimizde AAAM2e) veri taban
segmentini ifade eder. Bu gruba nesne numaras (object number) denir. Sonraki 3 karakter (rne-
imizde AAB) satrn bulunduu fiziksel dosyay ifade eder. Bu gruba dosya numaras (file num-
ber) denir. Sonraki 6 karakter (rneimizde AAAO5a) veri dosyasnn iindeki blou ifade eder.
Ayn tablespace iinde olan fakat farkl veri dosyasnda olan 2 satr ayn blok numarasna sahip
olabilir. Bu gruba blok numaras (block number) denir. Son 3 karakter de (rneimizde AAD)
blok iindeki satr numarasn ifade eder. Bu gruba satr numaras (row number) denir.

rnek 9: ROWID ve UROWID Tipleri

1 DECLARE
2 rx1 ROWID;
3 rx2 ROWID;
4 BEGIN
6 SELECT
7 rowid
8 INTO rx1
9 FROM Urun
10 WHERE UrunId = 2;
11 SELECT
12 rowid
13 INTO rx2
14 FROM Urun
15 WHERE UrunId = 3;
16 DBMS_OUTPUT.PUT_LINE(rx1);
17 DBMS_OUTPUT.PUT_LINE(rx2);
18 END;

rnek 9u altrdmzda aldmz DBMS kts u ekildedir:

AAAM2eAABAAAO5aAAD
AAAM2eAABAAAO5aAAA

Bu ktdan Urun tablosundaki UrunId deerleri 2 ve 3 olan satrlarn ayn segmentte, ayn veri
dosyasnda, ayn blok iindeki farkl yerlerde olduunu grebiliriz.

VARCHAR2
Deiken uzunluklu alfanmerik verileri tutmak iin kullanlr. Verinin VARCHAR2 tipinde nasl tu-
tulduu veri tabannn karakter setine gre deiiklik gsterir. En fazla 32767 karakter tutulabilir.
206 Blm 11

2000 bytetan uzun deerlerde performans d ykselir. Bu sebeple 2000 bytetan daha uzun
verileri tutarken bu durumu dikkate almakta fayda vardr.

STRING ve VARCHAR veri tipleri VARCHAR2 veri tipinin alt tipleridir. VARCHAR ile VARCHAR2 veri
tipleri ayndr. VARCHAR veri tipinin varlk sebebi ileri srmlerde farkl ekilde kullanlabilecek
ayrlm bir tip yaratmaktr. Bu sebeple VARCHAR2 veri tipini kullanmak daha iyi olacaktr.

rnek 10: VARCHAR2 Tipi ve Dier Alfanmerik Tiplerle Karlatrma

1 DECLARE
2 vx1 VARCHAR2(10);
3 cx1 CHAR(10);
4 sx1 STRING(10);
5 lx1 LONG(10);
6 BEGIN
7 vx1 := ABC;
8 cx1 := ABC;
9 sx1 := ABC;
10 lx1 := ABC;
11 IF vx1 != cx1
12 THEN
13 DBMS_OUTPUT.PUT_LINE(vx1 != cx1);
14 ELSE
15 DBMS_OUTPUT.PUT_LINE(vx1 = cx1);
16 END IF;
17 IF vx1 != sx1
18 THEN
19 DBMS_OUTPUT.PUT_LINE(vx1 != sx1);
20 ELSE
21 DBMS_OUTPUT.PUT_LINE(vx1 = sx1);
22 END IF;
23 IF vx1 != lx1
24 THEN
25 DBMS_OUTPUT.PUT_LINE(vx1 != lx1);
26 ELSE
27 DBMS_OUTPUT.PUT_LINE(vx1 = lx1);
28 END IF;
29 END;

rnek 10u altrdmzda aldmz DBMS kts u ekildedir:

vx1 != cx1
vx1 = sx1
vx1 = lx1

Bu rnekten grebileceimiz gibi VARCHAR2 tipiyle CHAR tipini karlatrmak sakncaldr. Her ne
kadar LONG tipiyle karlatrmak eit sonucunu verse de LONG tipi ile VARCHAR2 tipinini kapasi-
telerinin farkl olmas sebebiyle bu tip bir karlatrmay tercih etmemekte fayda vardr.
Oracle zerinde Programlama ve PL/SQL 207

PL/SQLde Mantksal Tipler


PL/SQLde 1 tane mantksal tip bulunmaktadr. Bu tip BOOLEAN tipidir. Mantksal bir tip TRUE ya
da FALSE deerlerinden birini tutar.

BOOLEAN
PL/SQLde BOOLEAN veri tipi TRUE ya da FALSE deerlerini tutar; ancak dikkat edilmesi gereken
nokta BOOLEAN bir veri tipini DBMS_OUTPUT.PUT_LINE() fonksiyonu ile yazdramayz.

rnek 11: BOOLEAN Veri Tipi

1 DECLARE
2 bx BOOLEAN;
3 BEGIN
4 bx := TRUE;
5 IF bx = TRUE
6 THEN
7 DBMS_OUTPUT.PUT_LINE(bx = TRUE);
8 ELSIF bx = FALSE
9 THEN
10 DBMS_OUTPUT.PUT_LINE(bx = FALSE);
11 ELSE
12 DBMS_OUTPUT.PUT_LINE(bx = null);
13 END IF;
14 END;

rnek 10u altrdmzda aldmz DBMS kts u ekildedir:

bx = TRUE

Bu rnekte 10 numaral satrdaki ELSE blounu eklemimizin sebebi eer bx deikeni tanmlan-
mazsa ya da bx deikenine null deeri atanrsa 11 numaral satrdaki ELSE blouna girilecek ve
DBMS kts olarak bx = null yazlacaktr.

PL/SQLde Tarih ve Zaman Tipleri


Tarih ve zaman tipleri herhangi bir tarihi ya da saati tutar. PL/SQLde pek ok tarihsel gsterim
ekli olmasna ramen bu tipleri temel olarak inceleyeceiz.

DATE
DATE veri tipi Saniye detaynda tarih ve zaman verisi tutar.

rnek 12: DATE Veri Tipi

1 DECLARE
2 dx DATE;
3 BEGIN
4 dx := SYSDATE;
5 DBMS_OUTPUT.PUT_LINE(dx);
6 END;

rnek 12yi altrdmzda aldmz DBMS kts u ekildedir:

02-DEC-07
208 Blm 11

SYSDATE() fonksiyonu T-SQLdeki GETDATE() fonksiyonuna karlk gelmektedir ve sistem ta-


rih ve zamann getirir. Bu noktadan itibaren INTERVAL yapsna geebiliriz.

rnek 13: INTERVAL YEAR TO MONTH

1 DECLARE
2 BaslangicTarihi DATE;
3 BitisTarihi DATE;
4 ix INTERVAL YEAR(3) TO MONTH;
5 cYilFarki CHAR(3);
6 cAyFarki CHAR(2);
7 iYilFarki INT;
8 iAyFarki INT;
7 BEGIN
8 BaslangicTarihi := 01-JAN-00;
9 BitisTarihi := SYSDATE;
10 DBMS_OUTPUT.PUT_LINE(Gun Farki: || TO_
CHAR(BitisTarihi - BaslangicTarihi));
11 iYilFarki := FLOOR((BitisTarihi - BaslangicTarihi) /
365);
12 cYilFarki := TO_CHAR(iYilFarki);
13 iAyFarki := FLOOR(((BitisTarihi - BaslangicTarihi)
iYilFarki * 365) / 30);
14 cAyFarki := TO_CHAR(iAyFarki);
15 ix := CONCAT(CONCAT(TRIM(iYilFarki), -),
TRIM(iAyFarki));
16 DBMS_OUTPUT.PUT_LINE(ix);
17 END;

rnek 13 altrdmzda aldmz DBMS kts u ekildedir:

Gun Farki: 2892


+007-11

Bu rnekten grebileceimiz gibi uygulamann alt tarih (2 Aralk 2007) ile 1 Ocak 2000 tarihi
arasnda 2892 gn vardr. 2892 gn de 7 yl 11 aya karlk gelmektedir. Bu rnekte TO_CHAR()
fonksiyonu herhangi bir tipi CHAR tipine eviren fonksiyondur. BOOLEAN tipini CHAR tipine evire-
mez. TO_CHAR() fonksiyonunu T-SQLdeki CONVERT() fonksiyonunun zellemi bir hali olarak
dnebiliriz. FLOOR() fonksiyonu burada, ondalkl saynn ondalkl ksmn atarak tam say
ksmn almamz salar. Bu rnekten de grebileceiniz gibi INTERVAL YEAR TO MONTH tipine
CHAR tipinde YIL-AY deerini alabilmektedir.

rnek 14: INTERVAL YEAR TO MONTH

1 DECLARE
2 ix1 INTERVAL YEAR(3) TO MONTH;
3 ix2 INTERVAL YEAR(3) TO MONTH;
4 ix3 INTERVAL YEAR(3) TO MONTH;
5 ix4 INTERVAL YEAR(3) TO MONTH;
6 dx DATE;
Oracle zerinde Programlama ve PL/SQL 209

7 BEGIN
8 ix1 := INTERVAL 10-7 YEAR TO MONTH;
9 ix2 := INTERVAL 10 YEAR;
10 ix3 := INTERVAL 7 MONTH;
11 ix4 := ix2 + ix3;
12 DBMS_OUTPUT.PUT_LINE(ix4);
13 dx := SYSDATE;
14 dx := dx + ix4;
15 DBMS_OUTPUT.PUT_LINE(dx);
12 END;

rnek 14 altrdmzda aldmz DBMS kts u ekildedir:

+010-07
02-JUL-18

Bu rnekten grlebilecei gibi 11 numaral satrda 2 INTERVAL YEAR TO MONTH toplanabil-


mektedir. 14 numaral satrda da INTERVAL YEAR TO MONTH tipinin DATE tipiyle toplanabildiini
gryoruz. Bu rnekteki INTERVAL YEAR TO MONTH tipindeki deikenler tanmlanrken YEAR
ifadesinin yanndaki 3 rakam en fazla 3 haneli yl deeri tayabileceini gsterir ve en fazla 4
olabilir.

Benzer ekilde kullanabileceimiz INTERVAL DAY TO SECOND tipi de mevcuttur.

DATE ve INTERVAL lemleri


1. Argman lem 2. Argman Sonu Tipi
DATE + INTERVAL DATE
DATE - INTERVAL DATE
INTERVAL + DATE DATE
DATE - DATE INTERVAL
INTERVAL + INTERVAL INTERVAL
INTERVAL - INTERVAL INTERVAL
INTERVAL * NUMERIC INTERVAL
NUMERIC * INTERVAL INTERVAL
INTERVAL / NUMERIC INTERVAL

TIMESTAMP
TIMESTAMP veri tipi DATE veri tipinin bir varyasyonudur. DATE tipi gibi kullanlabilir.

rnek 15: TIMESTAMP Veri Tipi

1 DECLARE
2 tx TIMESTAMP;
3 BEGIN
4 tx := SYSDATE;
5 DBMS_OUTPUT.PUT_LINE(tx);
6 tx := 05-JUL-07 10:42:35.313 PM
7 END;4
210 Blm 11

rnek 15i altrdmzda aldmz DBMS kts u ekildedir:

02-DEC-07 12.00.00.000000000

6 numaral satrdaki gibi TIMESTAMP tipine deer atamas yaplabilir.

Btnleik Tipler
Btnleik tipler herhangi bir basit tipten, referans tipinden ya da LOB tipinden tretilebilen dizi-
lerdir.

rnek 16: VARRAY Veri Tipi

1 DECLARE
2 TYPE PIXA IS VARRAY(4) OF PLS_INTEGER;
3 px PIXA;
4 BEGIN
5 px := PIXA(0, 0, 0, 0);
6 px(1) := 3;
7 px(2) := 4;
8 DBMS_OUTPUT.PUT_LINE(px(1));
9 DBMS_OUTPUT.PUT_LINE(px(2));
10 END;

rnek 16y altrdmzda aldmz DBMS kts u ekildedir:

3
4

Bu rnekte greceiniz gibi bir diziyi kullanmadan nce bir tip olarak tanmlamamz gerekmekte-
dir. 2 numaral satrda bu tanm yaplmaktadr. En genel ekilde tip tanmlamas u ekildedir:

TYPE <yeni tip ad> IS VARRAY(<eleman says>) OF <tip>

Burada yeni tip ad oluturduumuz dizi tipine verdiimiz addr, tip ise mevcut tiplerden biridir. Dizi
indis deerleri 1den balar.

Bu rnekte grdmzn dnda btnleik tip tanmlar da sz konusudur.

rnek 17: Bileik Tipler

1 DECLARE
2 TYPE TBLARRAY IS TABLE OF VARCHAR2(3);
3 TYPE TBLARRAY2 IS TABLE OF PLS_INTEGER INDEX BY PLS_
INTEGER;
4 TYPE TBLARRAY3 IS TABLE OF PLS_INTEGER INDEX BY
VARCHAR(3);
5 tx1 TBLARRAY;
6 tx2 TBLARRAY2;
7 tx3 TBLARRAY3;
8 BEGIN
9 tx1 := TBLARRAY(, , );
10 tx1(1) := ABC;
11 tx1(2) := DEF;
Oracle zerinde Programlama ve PL/SQL 211

12 DBMS_OUTPUT.PUT_LINE(tx1(1));
13 DBMS_OUTPUT.PUT_LINE(tx1(2));
14 tx2(1) := 10;
15 tx2(2) := 15;
16 DBMS_OUTPUT.PUT_LINE(tx2(1));
17 DBMS_OUTPUT.PUT_LINE(tx2(2));
18 tx3(abc) := 20;
19 tx3(def) := 25;
20 DBMS_OUTPUT.PUT_LINE(tx3(abc));
21 DBMS_OUTPUT.PUT_LINE(tx3(def));
22 END;

rnek 17yi altrdmzda aldmz DBMS kts u ekildedir:

ABC
DEF
10
15
20
25

Bu rnekte greceiniz gibi PL/SQL, herhangi bir genel amal programlama diline gre bile zen-
gin saylabilecek seenekler sunmaktadr. 2 numaral satrda grdmz tanmlama rnek 16ya
gre eleman says tanmlamamaktadr. Bylece TBLARRAY tipinde tanmladmz herhangi bir
deikenin eleman says snr l olmaktan kmtr; ancak hala rnek 16daki gibi 9 numaral sa-
trda TBLARRAY tipinde tanmladmz deikene ilk deerlerini vermek durumundayz. TBLAR-
RAY tipi PLS_INTEGER tipindeki deerlerden oluan bir dizi tipidir. 3 numaral satrda, TBLARRAY
tipine gre oluturduumuz farkllk INDEX BY ifadesidir. INDEX BY ifadesi dizi tipini tanmlarken
indis deerlerinin hangi tipte olduunu tanmlamaya yarar. TBLARRAY2 tipinde ilk PLS_INTEGER
ifadesi, TBLARRAY2 tipinden oluturulacak bir deikenin PLS_INTEGER tipinde deerler tuta-
can gsterirken, satrn sonundaki INDEX BY PLS_INTEGER ifadesi de deikenin indis de-
erlerinin PLS_INTEGER ile gsterileceini ifade eder. 14 ve 15 numaral satrlarda grdnz
gibi tx2 tipinin indisleri de deerleri de PLS_INTEGER tipindedir. Ayrca bu tanmla artk dizinin ilk
deerlerini nceden vermek zorunluluumuz ortadan kalkt. 4 numaral satrdaki tip tanmnda ise
3 numaral satrdan sadece deiken indislerinin nasl tutulaca deimitir. TBLARRAY3 tipinde
tanmlanan bir dizinin indisleri VARCHAR2(3) tipinde olacaktr ve iinde PLS_INTEGER tipinde
deerler tutacaktr. Buna ait kullanm da 18 ve 19 numaral satrlarda grebilirsiniz. Herhangi bir
dizide dizinin ilk elemanna erimek iin FIRST, son elemanna erimek iin de LAST ifadelerini
kullanabiliriz. Bununla ilgili rnei rnek 18de grebilirsiniz:

rnek 18: FIRST ve LAST

1 DECLARE
2 TYPE TBLARRAY IS TABLE OF VARCHAR2(3);
3 TYPE TBLARRAY2 IS TABLE OF PLS_INTEGER INDEX BY PLS_
INTEGER;
4 TYPE TBLARRAY3 IS TABLE OF PLS_INTEGER INDEX BY
VARCHAR(3);
5 tx1 TBLARRAY;
6 tx2 TBLARRAY2;
212 Blm 11

7 tx3 TBLARRAY3;
8 BEGIN
9 tx1 := TBLARRAY(, , );
10 tx1(1) := ABC;
11 tx1(2) := DEF;
12 DBMS_OUTPUT.PUT_LINE(tx1(1));
13 DBMS_OUTPUT.PUT_LINE(tx1(tx1.LAST));
14 tx2(1) := 10;
15 tx2(2) := 15;
16 DBMS_OUTPUT.PUT_LINE(tx2(tx2.FIRST));
17 DBMS_OUTPUT.PUT_LINE(tx2(2));
18 tx3(abc) := 20;
19 tx3(def) := 25;
20 DBMS_OUTPUT.PUT_LINE(tx3(abc));
21 DBMS_OUTPUT.PUT_LINE(tx3(tx3.LAST));
22 END;

rnek 18i altrdmzda aldmz DBMS kts u ekildedir:

ABC
10
15
20
25

Bu rnekte 13 numaral satrn almasndan sonucu olumaktadr; nk 9 numaral satrda


dizinin 3. elemann olarak tanmladk.

RECORD
RECORD tipi T-SQLde olmayan bir tiptir. C#taki struct gibi dnlebilir.

rnek 19: RECORD Tanmlama

1 DECLARE
2 TYPE REC_URUN IS RECORD(ID INTEGER, AD
VARCHAR2(10));
3 rUrun REC_URUN;
4 BEGIN
5 SELECT;
6 UrunId, UrunAdi
7 INTO rUrun
8 FROM Urun
9 WHERE ROWNUM = 1;
10 DBMS_OUTPUT.PUT_LINE(Urun ID: || rUrun.ID ||
Adi: || rUrun.AD);
11 END;
Oracle zerinde Programlama ve PL/SQL 213

rnek 19u altrdmzda aldmz DBMS kts u ekildedir:

Urun ID: 1
Adi: Biskvi

2 numaral satrda INTEGER tipinde bir deer ve VARCHAR2 tipinde bir deer alan REC_URUN
adnda bir RECORD oluturduk. 3 numaral satrda bu tipte bir deiken tanmladk. 5, 6, 7, 8 ve 9
numaral satrlardan oluan SELECT cmlecii ile rUrun deikeninin iine ID ve AD bilgileri ata-
dk. SELECT cmleciinde T-SQLde olmayan bir alan olan ROWNUM kullandk. ROWNUM, SELECT
ifadesinin sonucunda oluan kmenin sra numarasn alan bir deerdir. Dolaysyla ROWNUM =
1 olduu iin ilk satr verilerini RECORDn iine atm durumdayz. 10 numaral satrda da bu de-
erleri tek tek yazdrdk. RECORD, CURSOR ile birlikte kullanldnda daha gl bir yapyla kar
karya kalacaz.

Referans Tipleri
Referans tipleri bir iareti araclyla bellekte asl veri blounun tutulduu adresi gsteren veri
tipidir. Esnek tipler olturabilmek asndan olduka nemlidir.

REF CURSOR
REF CURSOR tipine gemeden nce daha basit bir tip olan CURSOR tipinden bahsetmek gere-
kir. CURSOR tipi T-SQLdeki CURSORlara karlk gelir; ancak kullanmnda ok sayda detay
vardr. Mantksal olarak da T-SQLdeki CURSORlarla ayn mantkta alr.

rnek 20: CURSOR Tanmlama

1 DECLARE
2 CURSOR curUrun IS
3 SELECT
4 UrunId, UrunAdi
5 FROM Urun;
6 ID INTEGER;
7 AD VARCHAR2(10);
8 BEGIN
9 OPEN curUrun;
10 LOOP
11 FETCH curUrun INTO ID, AD;
12 EXIT WHEN NOT curUrun%FOUND;
13 DBMS_OUTPUT.PUT_LINE(ID || || AD);
14 END LOOP;
15 CLOSE curUrun;
16 END;

rnek 20yi altrdmzda aldmz DBMS kts u ekildedir:

1 - Biskvi
2 - ikolata

2, 3, 4 ve 5 numaral satrlar CURSOR tanmn oluturur. 3, 4 ve 5 numaral satrlardaki SELECT


cmleciinin sonucu curUrun adl CURSOR iine satr satr atlacaktr; ancak bu ilem bu blm-
de yaplmaz. Burada sadece CURSOR iin tanm mevcuttur. 9 numaral satrda CURSOR aldktan
sonra, bir sonraki konuda ileyeceimiz LOOP dngs iinde CURSOR tanmna gre satr satr
ileme yaplacaktr. 11 numaral satrda ilk star CURSOR deikenleri olan ID ve AD deikenle-
214 Blm 11

rine alnr. 12 numaral satr LOOP dngsnn curUrun iinde satr bulunamadnda kmas
iin yazlmtr. curUrun%FOUND ifadesi T-SQLdeki CURSOR iin kullandmz WHILE dng-
sndeki @@FETCH_STATUS != -1 ifadesi ile ayn ekilde alr. 13 numaral satrda CURSOR
deikenleri DBMS kts olarak yazlr. 15 numaral satrda da CURSOR kapatlr. OPEN ile alan
bir CURSOR bellein etkin kullanm asndan mutlaka CLOSE ile kapatlmaldr.

rnek 20: T-SQLde CURSOR Tanmlama

1 DECLARE @ID INT, @AD VARCHAR(10)


2 DECLARE curUrun INSENSITIVE CURSOR FOR
3 SELECT
4 UrunId, UrunAdi
5 FROM Urun
6 OPEN vurUrun
7 FETCH NEXT FROM curUrun INTO @ID, @AD
8 WHILE @@FETCH_STATUS != -1
9 BEGIN
10 PRINT CONVERT(VARCHAR, @ID) + + @AD
11 FETCH NEXT FROM curUrun INTO ID, AD
12 END
13 CLOSE curUrun
14 DEALLOCATE curUrun

rnek 20.1de rnek 20deki PL/SQL ile kullanlan CURSOR yapsnn T-SQL karln grebi-
lirsiniz.

rnek 21: CURSOR Deerlerinin RECORD ine Atlmas

1 DECLARE
2 TYPE REC_URUN IS RECORD (ID INTEGER, AD VARCHAR2(10));
3 TYPE REC_URUN_ARR IS TABLE OF REC_URUN INDEX BY PLS_
INTEGER;
4 rUrun REC_URUN;
5 rUrunArr REC_URUN_ARR;
6 CURSOR curUrun IS
7 SELECT
8 UrunId, UrunAdi
9 FROM Urun;
10 ROWN PLS_INTEGER;
11 BEGIN
12 OPEN curUrun;
13 ROWN := 1;
14 LOOP
15 FETCH curUrun INTO rUrun;
16 EXIT WHEN NOT curUrun%FOUND;
17 rUrunArr(ROWN) := rUrun;
18 DBMS_OUTPUT.PUT_LINE(rUrunArr(ROWN).ID ||
|| rUrunArr(ROWN).AD);
Oracle zerinde Programlama ve PL/SQL 215

19 END LOOP;
20 CLOSE curUrun;
21 END;

rnek 21i altrdmzda aldmz DBMS kts u ekildedir:

1 - Biskvi
2 - ikolata

2 numaral satrda CURSOR iin alan SELECT sorgusunun kayt desenine uygun ekilde bir
RECORD oluturduk. 3 numaral satrda da CURSOR zerinden REC_URUN tipindeki kaytlarmz
toplayacamz deiken uzunluklu, PLS_INTEGER indisli, REC_URUN tipinde bir dizi tipi tanmla-
dk. 4 numaral satrda CURSORdan dnen her satr tutacamz kayt deikenini tanmladk. 5
numaral satrda da bu kayt deikenlerinin hepsini toplayacamz diziyi tanmladk. 10 numaral
satrda REC_URUN_ARR tipindeki dizinin indisini tutmak iin PLS_INTEGER tipinde bir deiken
tanmladk. 13 numaral satrda dizi indisleri 1den balad iin ROWN deerini 1 yaptk. 15 nu-
maral satrda rnek 20ye gre farkl olarak CURSORdan dnen kayd olduu gibi REC_URUN ti-
pindeki rUrun adl kayt deikenine atadk. 17 numaral satrda da REC_URUN_ARR tipindeki rU-
runArr dizisinin ROWN numaral indisindeki alana rUrun kaydn yerletirdik. 18 numaral satrda
rUrunArr(ROWN).ID ve rUrunArr(ROWN).AD ifadelerini rUrunArr dizisinin her elemannn
REC_URUN kayt tipinde olmasndan dolay, kayt deseninde tanml deikenlerle kullanabildik.

rnek 22: REF CURSOR Deerlerinin RECORD ine Atlmas

1 DECLARE
2 TYPE REC_URUN IS RECORD (ID INTEGER, AD VARCHAR2(10));
3 TYPE URUN_CUR_TYPE IS REF CURSOR RETURN REC_URUN;
4 rUrun REC_URUN;
5 cUrunType URUN_CUR_TYPE;
6 BEGIN
7 OPEN cUrunType FOR
8 SELECT
9 UrunId, UrunAdi
10 FROM Urun;
11 LOOP
12 FETCH cUrunType INTO rUrun;
13 EXIT WHEN NOT cUrunType%FOUND;
14 DBMS_OUTPUT.PUT_LINE(rUrun.ID || ||
rUrun.AD);
15 END LOOP;
16 CLOSE cUrunType;
17 END;

rnek 22yi altrdmzda aldmz DBMS kts u ekildedir:

1 - Biskvi
2 - ikolata

2 numaral satrda rnek 21deki gibi RECORD tipinde kayt desenimizi tanmladk. 3 numaral
satrda da REF CURSOR tipimizi tanmladk. 4 ve 5 numaral satrlarda bu tiplere ait deikenleri-
mizi oluturduk. 7, 8, 9 ve 10 numaral satrlarda URUN_CUR_TYPE adnda REF CURSOR tipinde
216 Blm 11

REC_URUN tipinde deer dndren CURSOR yapmz hem tanmladk, hem de atk. Bu yap T-
SQLdeki CURSOR yapsna daha ok benzemektedir; ancak T-SQLde RECORD yapsna benzer
yaplar olmad iin bu rnein bire bir T-SQL karl yoktur. 12 numaral satrda oluturduu-
muz REF CURSOR tipinin iindeki deeri REC_URUN tipinin iine yerletirdik. 14 numaral satrda
da o satr iin rUrun adl kayttaki ID ve AD alanlarnn deerlerini yazdrdk.

LOB (Large Object) Tipleri


Yapsal olmayan byk verilerin tutulmas iin kullanl tiplerdir. En fazla tutabilecekleri veri mik-
tar 4GBtr. Asl verilerini iareti mantyla tutarlar.

BFILE
BFILE veri tipi, byk verilerinin veri taban zerinde deil iletim sisteminin zerindeki dosya
sistemi zerinde tutulmasn salayan bir tiptir. BFILE aslnda bu fiziksel dosyaya ait adresi tutar.
BFILE tipindeki veri deitirilemez. Kullanm transaction mant erevesinde risklidir; nk
transaction ile alan bir tip deildir ve transactiona dahil edilmezler. Replikasyon ile replike
edilemezler.

BLOB (Binary Large Object)


BLOB veri tipinin BFILE veri tipinden farklar, tuttuu verinin veri taban dosyalar iinde tutulmas
ve transactiona dahil olmas ve replike edilebilir olmasdr. BLOB veri tipinde veri binary olarak
saklanr. Microsoft SQL Server 2005 ile birlikte gelen BLOB tipi gibidir.

CLOB (Character Large Object)


CLOB veri tipinin BLOB veri tipinden fark tuttuu verinin binary yerine alfanmerik olmasdr. Dier
zellikleri BLOB tipi gibidir. Microsoft SQL Server 2005 ile birlikte gelen CLOB tipi gibidir.

NCLOB
NCLOB veri tipinin CLOB veri tipinden fark NCHAR tipinden olumasdr. Bunun anlam yerel alfa-
belerin de rahatlkla kullanlabileceidir.

PL/SQLde Dng Yaplar


LOOP Dngs
LOOP dngs normalde koulsuz bir dng tipidir. EXIT ifadesi iletilene kadar dng tekrarla-
maya devam eder. LOOP ile CURSOR konusunda da rnek grmtk.

rnek 23: LOOP Dngs

1 DECLARE
2 ix PLS_INTEGER;
3 BEGIN
4 ix := 1;
5 LOOP
6 IF ix != 5
7 THEN
8 ix := ix + 1;
9 DBMS_OUTPUT.PUT_LINE(ix);
10 ELSE
11 EXIT;
12 END IF;
13 END LOOP;
14 END;
Oracle zerinde Programlama ve PL/SQL 217

rnek 23 altrdmzda aldmz DBMS kts u ekildedir:

2
3
4
5

Bu rnekte dikkat etmemiz gereken en nemli nokta 4 numaral satrda eer ix deikenine de-
er atamas yapmazsak 6 numaral satrdaki karlatrmadan beklenmedik ekilde FALSE deeri
retilmesidir. Bu sebeple LOOP dng yapsn kullanrken kontrol deikenine ilk deer atamas-
n yapmak nemlidir. 5 ile 13 numaral satrlar arasnda tanmlanan LOOP dngsnden kmak
iin bu blok iinde kod aknda mutlaka EXIT ifadesinin almas gerekir; aksi takdirde sonsuz
dng oluacaktr. rneimizde eer ix deikeninin deeri 5e eit olursa 10 numaral satrdaki
ELSE blou alr ve EXIT ifadesi de bylece alm olur ve LOOP dngs sonlandrlarak
program ak 13 numaral satrdan itibaren devam eder.

EXIT WHEN fadesi


LOOP dngsnde koullu k salamak iin kullanlan bir ifadedir. IF blou yerine kullanla-
bilir.

rnek 24: LOOP Dngs ve EXIT WHEN fadesi

1 DECLARE
2 ix PLS_INTEGER;
3 BEGIN
4 ix := 1;
5 LOOP
6 EXIT WHEN ix = 5;
7 ix := ix + 1;
8 END LOOP;
9 END;

rnek 24 altrdmzda aldmz DBMS kts u ekildedir:

2
3
4
5

Bu rnekte LOOP dngs her dndnde 6 numaral satrda EXIT WHEN ix = 5 ifadesiyle
karlaarak ix deerinin 5e eit olup olmadn kontrol edecektir. Eer ix 5e eitse EXIT ifa-
desi alacak ve program ak 8 numaral satrdan devam edecektir.

WHILE LOOP Dngs


WHILE LOOP dngs EXIT WHEN ifadesi ile kullanlan LOOP dngsne ok benzerdir. Bu
dng tipinde WHILE ile tanmlanan koul saland srece dng iterasyona devam eder.

rnek 25: WHILE - LOOP Dngs

1 DECLARE
2 ix PLS_INTEGER;
3 BEGIN
218 Blm 11

4 ix := 1;
5 WHILE ix < 5
6 LOOP
7 ix := ix + 1;
8 END LOOP;
9 END;

rnek 25i altrdmzda aldmz DBMS kts u ekildedir:

2
3
4
5

Bu rnekte 5 numaral satrdaki ix < 5 koulu saland srece program ak 8 numaral


satra gelmez. Dolaysyla koul salanana kadar ka defa alacan bilmediimiz yaplarda
kullanlmas uygundur. EXIT ifadesinin olmamas sebebiyle koullu kn salanmas semantik
olarak saland iin LOOP dngsne tercih edilmelidir. WHILE ifadesinin yanndaki koulun
tipi mutlaka BOOLEAN olmaldr. 0 (sfr) dndaki tm deerler TRUE, 0 (sfr) FALSEtur gibi bir
durum sz konusu deildir.

FOR LOOP Dngs


FOR LOOP dngs de WHILE LOOP dngsne benzer yapdadr; ancak en nemli fark
koula bal olmaktan ok iterasyon saysnn bilindii yaplarda kullanlr. WHILE ile geiken-
dir.

rnek 26: FOR - LOOP Dngs

1 BEGIN
2 FOR ix IN 2..5
3 LOOP
4 DBMS_OUTPUT.PUT_LINE(ix);
5 END LOOP;
6 END;

rnek 26y altrdmzda aldmz DBMS kts u ekildedir:

2
3
4
5

Bu rnekte WHILE LOOP dngsne gre kontrol ettiimizde DECLARE blmnde bir dei-
ken tanmlamaya ihtiyacmz yoktur. 2 numaral satrdaki FOR ix IN 2..5 ifadesi ile ix dei-
keni otomatikman tanmlanm olur. 2 numaral satrn anlam, 2den 5e kadar olan saylar her
dngde 1er artrarak ix deikenine atama yapmaktr.

rnek 27: FOR - LOOP Dngs

1 BEGIN
2 FOR ix IN REVERSE 2..5
3 LOOP
Oracle zerinde Programlama ve PL/SQL 219

4 DBMS_OUTPUT.PUT_LINE(ix);
5 END LOOP;
6 END;

rnek 27yi altrdmzda aldmz DBMS kts u ekildedir:

5
4
3
2

Bu rnekte 2 numaral satrda IN ifadesinden sonra kullandmz REVERSE ifadesi dngnn


2den 5e kadar 1er artrarak deil, 5ten 2ye kadar 1er eksilterek dnmesini salayacaktr ve
her seferinde ix deikenine 5ten itibaren 1er eksilterek deer atamas yapacaktr.

Procedure Oluturmak
PL/SQLde procedure olturmak T-SQLden ok farkl deildir. PL/SQLde Procedurelar T-
SQLdeki SP (stored procedure)ler gibi IN, OUT ve IN OUT ynl parametrelere sahiptirler,
PL/SQLdeki procedurelarda RETURN yoktur, bunun yerine FUNCTION kullanlr.

rnek 28: PL/SQLde Procedure

1 CREATE OR REPLACE PROCEDURE UrunYaz


2 (
3 ID IN PLS_INTEGER,
4 AD IN VARCHAR2
5 )
6 AS
7 RowCount PLS_INTEGER;
8 BEGIN
9 SELECT
10 COUNT(*) INTO RowCount
11 FROM Urun
12 WHERE UrunId = ID;
13 IF RowCount = 0
14 THEN
15 INSERT INTO Urun(UrunId, UrunAdi) VALUES(ID,
AD);
16 END IF;
17 END;

rnek 28deki kodu altrdnzda UrunYaz adnda bir procedure SYSTEM schemas iin login
olduumuz veri taban zerinde daha nceden yazlmamsa yaratlacaktr, eer daha nceden
varsa stne yazlacaktr. Bunu salayan 1 numaral saturdaki CREATE OR REPLACE ifadesidir.
Bunun yerine sadece CREATE ya da REPLACE de kullanlabilir. 3 ve 4 numaral satrlarda Urun-
Yaz procedurenn argmanlardr. 3 numaral satrda ID adnda, PLS_INTEGER tipinde, IN yani
dardan gelen bir argman tanmlanmtr. 4 numaral satrda AD adnda, VARCHAR2 tipinde, IN
ynnde dier argman tanmlanmtr. 7 numaral satrda proceduren iinde kullanacamz
RowCount adnda, PLS_INTEGER tipinde bir deiken ayn IDye sahip tabloda baka kayt
olup olmadn kontrol etmek amacyla, satr saysn tutmak zere tanmlanmtr. 9, 10, 11 ve
220 Blm 11

12 numaral satrlardali SELECT cmleciiyle RowCount deerine UrunYaz procedurena ID


argmanyla gelen deere sahip UrunIdli alanlarn says atanmtr. 13 numaral satrda eer
bu IDye sahip bir kayt yoksa 15 numaral satrdaki INSERT cmlecii almas iin RowCount
deikeninin 0 olup olmad kontrol edilmektedir. Eer RowCount 0 ise INSERT alr, aksi
takdirde procedure sonlanr.

Bu procedure altrmak iin yazmamz gereken kod rnek 29daki gibidir:

rnek 29: PL/SQL ile Procedure altrmak

1 DECLARE
2 IDx PLS_INTEGER := 4;
3 ADx VARCHAR2(10) := Gofret;
4 BEGIN
5 UrunYaz(ID => IDx, AD => ADx);
6 END;

rnek 29da 2 ve 3 numaral satrlarda UrunYaz procedurena argman olarak gndereceimiz


deerleri tanmladk. 5 numaral satrda da UrunYaz proceduren bu deerlerle altrdk.

rnek 30: PL/SQL ile OUT Parametreli Procedure

1 CREATE OR REPLACE PROCEDURE UrunYazOut


2 (
3 ID IN PLS_INTEGER,
4 AD IN VARCHAR2,
5 EKLENDI OUT BOOLEAN
6 )
7 AS
8 RowCount PLS_INTEGER;
9 BEGIN
10 SELECT
11 COUNT(*) INTO RowCount
12 FROM Urun
13 WHERE UrunId = ID;
14 IF RowCount = 0
15 THEN
16 INSERT INTO Urun(UrunId, UrunAdi) VALUES(ID,
AD);
17 EKLENDI := TRUE;
18 ELSE
19 EKLENDI := FALSE;
20 END IF;
21 END;

rnek 30da 5 numaral satrda EKLENDI adnda, BOOLEAN tipinde, OUT ynl bir argman ta-
nmladk. Eer 16 numaral satrda INSERT ilemine gelinirse EKLENDI deeri TRUE olur; aksi
takdirde FALSE olur. rnek 31de de UrunYazOut procedurenn nasl altrldn grebi-
lirsiniz.
Oracle zerinde Programlama ve PL/SQL 221

rnek 31: PL/SQL ile Out Argmanl Procedure altrmak

1 DECLARE
2 IDx PLS_INTEGER := 4;
3 ADx VARCHAR2(10) := Gofret;
4 DURUM BOOLEAN;
5 BEGIN
6 UrunYazOut(ID => IDx, AD => ADx, EKLENDI => DURUM);
7 IF DURUM = TRUE
8 THEN
9 DBMS_OUTPUT.PUT_LINE(Eklendi);
10 ELSE
11 DBMS_OUTPUT.PUT_LINE(Eklenmedi);
12 END IF;
13 END;

rnek 31de 4 numaral satrda UrunYazOut procedurendan OUT parametre (argman) yoluyla
gelecek deeri tutmak iin bir BOOLEAN deiken oluturduk. 6 numaral satrda da IN ynl ar-
gmanlar gibi OUT ynl argmanmz da oluturduk. 7 numaral satrdan itibaren IF bloundan
DURUM deikeninin deerine gre DBMS ktsna Eklendi ya da Eklenmedi yazacaktr.

Fonksiyon Oluturmak
PL/SQLde fonksiyonlar T-SQLdeki fonksiyonlara ok benzer zellikler gsterir. IN, OUT ve IN
OUT ynl argmanlarla alrlar ve RETURN ifadesi ile bir deer dndrrler. C# ve Javadaki
dnm tipi void olmayan metotlar gibidir.

rnek 32: PL/SQLde Fonksiyon

1 CREATE OR REPLACE FUNCTION UrunAdiOku


2 (
3 ID IN PLS_INTEGER
4 )
5 RETURN VARCHAR2
6 AS
7 AD VARCHAR2(10);
8 BEGIN
9 SELECT
10 UrunAdi INTO AD
11 FROM Urun
12 WHERE UrunId = ID;
13 RETURN AD;
14 END;

rnek 32deki kodu altrdnzda UrunAdiOku adnda fonksiyonumuz eer daha nce yara-
tlmamsa yaratlacaktr; aksi takdirde stne yazlacaktr. Procedurelardaki gibi fonksiyonlarda
da CREATE ve REPLACE ifadeleri tek balarna kullanlabilir.
222 Blm 11

rnek 33: PL/SQL ile Fonksiyon altrmak

1 DECLARE
2 IDx PLS_INTEGER := 4;
3 ADx VARCHAR2(10);
4 BEGIN
5 ADx := UrunAdiOku(ID => IDx);
6 DBMS_OUTPUT.PUT_LINE(ADx);
7 END;

rnek 33de 3 numaral satrda VARCHAR2(10) tipinde tanmalanan ADx isimli deiken Uru-
nAdiOku fonksiyonundan dnen deeri tutacak deikendir. 5 numaral satrda ADx deikenine
UrunAdiOku fonksiyonundan dnen deerin atamas yaplmtr. Bu atama srasnda tip uyumu
ok nemlidir. Eer uyumsuz tipler kullanrsanz istenmeyen sonularla karlaabilirsiniz. 6 nu-
maral satrda da ADx deikenine atanan fonksiyon dn deeri DBMS ktsna yazdrlr.

Вам также может понравиться