İçindekiler
m
DbUtils Nedir…………………………………………………………………………… 1
Bağımlılıkları……………………………………………………………………………. 1
DbUtils Sınıfı……………………………………………………………………………. 2
close()…………………………………………………………………………….. 2
closeQuietly()…………………………………………………………………. 2
o
commitAndClose()…………………………………………………………. 3
commitAndCloseQuietly()……………………………………………….4
loadDriver()……………………………………………………………………. 4
rollback()………………………………………………………………………… 5
i.c
ResultSetHandler Arayüzü………………………………………………………. 5
QueryRunner Sınıfı………………………………………………………………….. 5
query()……………………………………………………………………………. 5
update()………………………………………………………………………….. 6
Örnek………………………………………………………………………………………. 6
Sözlük……………………………………………………………………………………… 7
EK-A………………………………………………………………………………………… 8
EK-B………………………………………………………………………………………… 9
DbUtils Nedir dil
JDBC (java veritabanı bağlanırlığı - Java Database Connectivity ) kodlaması büyük
miktarda tekrarlanan kodların yazılmasını gerektirir. Bu kadar çok kodun yazılamasına bağlı
va
olarak basit hatalar programcının başına bela olur. JDBC kodu yazmak çok zor olmamasına
karşın ızdırap verici bir hale gelebilir.
DbUtils bileşeni (component) karmaşık olmayan ve JDBC(java veritabanı bağlanırlığı -
Java Database Connectivity ) ile çalışmayı kolaylaştıran bir grup sınıftır. Birçok JDBC
görevini geliştirici için çok az sayılacak derecede kolaylaştırır. Bugünlerde veri kalıcılığını
sağlamak için geliştirilmiş birçok paket (package) ve framework olmasına rağmen JDBC
hala birçok Java ve Java 2 Enterprise Edition (J2EE) geliştiricileri için geçim kaynağıdır. Bu
ja
yüzden JDBC ile çalışmayı kolaylaştıran her yenilik iyi bir haberdir.
Bağımlılıkları
w.
DbUtils ücretsiz download edilebilir bir bileşendir. Başka hiçbir ortak (commons)
bileşene bağımlı değildir. Bilgisayarınızda:
•Java geliştirme aracı JDK 1.2 (Java Development Kit) veya daha yeni bir sürümü
•JDBC 2.0 veya daha yeni bir sürümü
olması yeterlidir.
Bu doküman benzerleri arasında en iyisi olmayabilir ama kendi kendinize hızlı bir
şekilde anlamanıza olanak sağlar. Bir sonraki bölümde DbUtils’de sıkça kullanılan sınıfları ve
ww
bunların uygulamalarını göreceksiniz. Buradaki örnekleri ve kodları kolayca anlayarak
projelerinizde kullanabilirsiniz. Örneklerimizde iki sınıfa :
¾ [Link]
¾ [Link]
ve bir arayüze :
¾ [Link]
değineceğiz. Kullanımlarına dair örneklere geçmeden önce ne yaptıklarına bize ne
sunduklarına bir göz atalım.
1
DbUtils Sınıfı
m
DbUtils sınıfı bağlantıyı (connection) kapatma ve JDBC sürücülerini (drivers) yükleme
gibi alışılmış görevleri yerine getiren yardımcı metotlar sağlar.
Bu sınıfın önemli metotları arasında:
¾ close: Bu metot bağlantıyı kapatırken değiştirge (parametre, parameter) olarak
o
aldığı değerin boş (null) olup olmadığını kontrol eder. Üç tane bindirilmiş (overload) metot
içerir. Bu metot değiştirge olarak connection (bağlantı), resultSet (sonuç kümesi) veya
statement (deyim) tipinde bir değer alır ve boş (null) olup olmadığını kontrol eder, eğer
değer boş ise kapatmayı engeller.
i.c
Metotların ön ürünü (prototype):
public static void close([Link] conn)
throws [Link]
public static void close([Link] rs)
dil
throws [Link]
public static void close([Link] stmt)
throws [Link]
şeklindedir.
Metotların tanımı (definition):
va
public static void close(Connection conn) throws SQLException {
if (conn != null) {
[Link]();
}
}
public static void close(ResultSet rs) throws SQLException {
if (rs != null) {
ja
[Link]();
}
}
public static void close(Statement stmt) throws SQLException {
w.
if (stmt != null) {
[Link]();
}
}
¾ closeQuietly: Bu metot da close metodu gibi değiştirge (parametre,
parameter)olarak aldığı connection, statement ya da resultSet değeri boş ise kapatmayı
ww
engeller. close metodundan farklı olarak SQL istisnası (SQLException) oluşursa istisnayı
(exception)gizler. Bu istisnayı işlemeyi (exception handling) düşünmüyorsak faydalı bir
metottur. Bindirilmiş closeQuietly(Connection conn, Statement stmt,ResultSet rs) metodu
Connection, Statement, ve ResultSet’ in kullanıldığı ve son blokta kapatılmalarının zorunlu
olduğu durumlarda özellikle kullanılır. Bu metodu kullanarak son blokta sadece bu metodu
kullanmak yeterli olabilecektir.
2
Metodun ön ürünü:
m
public static void closeQuietly([Link] conn)
public static void closeQuietly([Link] conn,
[Link] stmt,
[Link] rs)
o
public static void closeQuietly([Link] rs)
public static void closeQuietly([Link] stmt)
i.c
Metodun tanımı:
public static void closeQuietly(Connection conn) {
try {
close(conn);
} catch (SQLException sqle) {
// quiet (sessiz kalır)
}
}
ResultSet rs) {
closeQuietly(rs);
closeQuietly(stmt);
closeQuietly(conn);
dil
public static void closeQuietly(Connection conn, Statement stmt,
va
}
public static void closeQuietly(ResultSet rs) {
try {
ja
close(rs);
} catch (SQLException sqle) {
// quiet (sessiz kalır)
}
}
w.
public static void closeQuietly(Statement stmt) {
try {
close(stmt);
} catch (SQLException sqle) {
// quiet (sessiz kalır)
}
}
ww
¾ commitAndClose(Connection conn): Bu metot eğer bağlantının değeri boş
değilse bağlantıda yapılan değişikleri onaylar, bağlantıyı kapatır.
Metodun ön ürünü:
public static void commitAndClose([Link] conn)
throws [Link]
3
Metodun tanımı:
m
public static void commitAndClose(Connection conn) throws SQLException {
if (conn != null) {
[Link]();
[Link]();
}
}
o
¾ commitAndCloseQuietly(Connection conn): Bu metot bağlantıyı (Connection)
üstlenir (commits) ve kapatma işlemi sırasında oluşan sql istisnalarının (SQLException) açığa
i.c
çıkmasını engeller.
Metodun ön ürünü:
public static void commitAndCloseQuietly([Link] conn)
Metodun tanımı:
}
try {
commitAndClose(conn);
dil
public static void commitAndCloseQuietly(Connection conn) {
} catch (SQLException sqle) {
}
// quiet (sessiz kalır)
va
¾ loadDriver(String driverClassName): Bu metot JDBC sürücüsünü yükler (load)
ve kaydeder (register). Bu metot sayesinde ClassNotFoundEXception (sınıf bulunamadı
istisnası) istisnasını ele almamıza gerek kalmaz. loadDriver metodu sayesinde kod daha
anlaşılır olur. Sürücünün yüklenip yüklenemediğine dair kolay anlaşılır mantıksal (boolean)
bir değer döndürülür.
Metodun ön ürünü:
ja
public static boolean loadDriver([Link] driverClassName)
Metodun tanımı:
public static boolean loadDriver(String driverClassName) {
w.
try {
[Link](driverClassName).newInstance();
return true;
} catch (ClassNotFoundException e) {
// TODO Logging?
//[Link]();
ww
return false;
} catch (IllegalAccessException e) {
// TODO Logging?
//[Link]();
// Constructor is private, OK for DriverManager contract
return true;
4
} catch (InstantiationException e) {
// TODO Logging?
m
//[Link]();
return false;
} catch (Throwable t) {
return false;
}
o
}
¾ rollback(Connection conn): Bu metot bağlantının değeri boş değilse bağlantı
üzerinde yapılan herhangi bir değişikliği geri çeker (rollback).
i.c
Metodun ön ürünü:
public static void rollback([Link] conn)
throws [Link]
Metodun tanımı:
}
}
[Link]();
dil
public static void rollback(Connection conn) throws SQLException {
if (conn != null) {
va
ResultSetHandler Arayüzü
Bu arayüz (interface) [Link] sonuç kümesini ele alır ve sonucu işleyerek
uygulamamız için gerekli ve kolay kullanılacak hale çevirir. Bu bileşen ArrayHandler,
ArrayListHandler, BeanHandler, BeanListHandler, MapHandler, MapListHandler, ve
ScalarHandler sınıflarını gerçekleştirimini (implementation) sağlar.
ResultSetHandler arayüzünün tek bir metodu vardır ve ön ürünü (protoype)
ja
public [Link] handle([Link] rs)
throws [Link]
şeklindedir. Yani herhangi bir ResultSetHandler (sonuç kümesi işleyici)gerçekleştirimi sonuç
kümesini girdi olarak alır, işler ve sonucu nesne olarak döndürür. Dönüş değeri türü
w.
[Link] olduğu için ilkeller (primitives) dışında herhangi bir türde olabilir. Eğer
yukarıdaki yedi işleyici gerçekleştiriminden hiçbiri amacınıza uygun değilse kendi
gerçekleştiriminizi yazabilirsiniz.
ww
QueryRunner Sınıfı
Bu sınıf sql sorgularını (Query) kolaylaştırmak için tasarlanmıştır. Birçok karmaşık
günlük görevin bakımını üstlenir ve ResultSetHandler ile beraber kullanılırsa yazmamız
gereken kodu büyük ölçüde azaltır. İki hazırlayıcı (constructor) metodu vardır, bunlardan biri
5
değiştirge almazken, diğeri [Link] (veri kaynağı) türünde değiştirge alır. Yani
bir metoda değiştirge olarak veri tabanı bağlantısı sağlanmamışsa hazırlayıcıya sağlanan
m
veri kaynağı yeni bağlantı oluşturmak için kullanılır ve işleme devam edilir.
Bu sınıftaki önemli metotlar:
¾ query(Connection conn,String sql,Object[] params,ResultSetHandler rsh):
Bu metot Object (nesne) dizisindeki elemanların sorgu sonuçlarının dönüştürüleceği türleri
belirtmek için kullanıldığı bir seçme (select) sorgusudur(query). Bu metot kendi içinde
o
sorgunun ve sonuç kümesinin oluşturulmasını ve kapsamını kontrol eder. ResultSetHandler
sonuç kümesindeki verinin uygulama tarafından daha kolay kullanılır bir hale
dönüştürülmesinden sorumludur.
i.c
¾ query(String sql,Object[] params, ResultSetHandler rsh): Bu metot bir
önceki metotla benzerdir; tek fark bağlantının, metoda sağlanması yerine hazırlayıcıya
(constructor) verilen veri kaynağından (DataSource) elde edilmesi ya da setDataSource (veri
kaynağını günle)metodu kullanılarak değer verilmesidir.
¾ query(Connection conn, String sql, ResultSetHandler rsh): Bu hiçbir
değiştirgeye ihtiyaç duymayan bir seçme sorgusudur.
dil
update(Connection conn, String sql, Object[] params): Bu metot ekle
(insert), günle (update) veya sil (delete) deyimini işletmek için kullanılır. Object (nesne)
dizisi değiştirme argümanlarını (değiştirgelerini) tutar.
Örnek
va
Şimdi bir veri tabanından bazı veriler getireceğimiz bir örneğe bakalım. Bu örnek için
MYSQL veri tabanı kullanılmıştır. Bu veri tabanını kullanmak için MYSQL JDBC sürücüsüne
ihtiyacınız olacak. Kullandığımız MYSQL veri tabanı localhost üzerinde 3306 nolu kapıda
(port) çalıştığını varsayacağız. Kullanacağımız öğrenci tablosunun (OgrTablo) yapısı:
Kolonlar Tür ,
OgrNo int
ja
Isim varchar
EK-A bölümünde öğrenci tablosundan (EK-B) veri getireceğiz ve ihtiyaçlarımızı
karşılayacak şekilde değiştireceğiz. JDBC kullanıyor olmamıza rağmen ne kadar az JDBC
kodu yazdığımıza dikkat edin. (kullanıcı adı ve parola uygulanacak tasarıma göre
w.
değiştirilmelidir.)
Kodu adım adım incelersek:
1. JDBC sürücü sınıfı yüklenir ve DriverManager (aygıt yönetici)aracılığıyla
veritabanı bağlantısı sağlanır.
2. QueryRunner (sorgu çalıştır) türünde bir sınıf yaratır.
ww
3. Bağlantı, sql sorgusu, sonuç kümesi işleyici ve sorgu sonuçlarının
dönüştürüleceği tür bilgilerini girdi olarak alan sorgu metodu kullanırız. Sonuç
kümesini işlemek için [Link]
kullanırız. MapListHandler sonuç kümesini alır ve işleyerek [Link] tipinde
[Link] örnekleri döndürür. Yani Map türünde öğelerden oluşan bir liste
döndürür. Böylece her satırında [Link] referansı olan ismi de haritaListesi
bir liste ([Link]) oluşturulmuş olur.
6
4. Listedeki her haritaListesi değişkeni için isim ve öğrenci numarası niteliklerini
yazdırarak liste üzerinde ilerleriz.
m
5. Sorgu sonuçlarının dönüştürüleceği tür bilgisini değiştirge olarak almayan bir
sorgu işleten metot (QueryRunner) kullanacağız. Burada BeanListHandler
(bileşen listesi işleyici) kullanacağız, böylece sonuç kümesini belirliyeceğimiz bir
bileşen (bean) listesi halinde işleyebiliriz. Örnekte bileşen sınıfı olarak
OgrenciBileseni sınıfı kullanılmıştır (EK-B).
o
6. Örnekte bileşen listesi üzerinde ilerleyerek bileşenlere erişirken OgrenciBileseni
niteliklerini ekrana yazdırırız.
Not: Ek-B’ de OgrenciBileseni sınıfı içindeki OgrNo değişkeni int türünde olmalıdır
i.c
çünkü öğrenci tablosundaki (OgrTablo) OgrNo int türündedir.
Böylece OgrenciBileseni sınıfı ve OgrTablo tablosu alanları eşlenerek OgrenciBileseni
sınıfını degiştirge olarak belirlemek yeterli olur. Tablo alanları bileşen niteliklerine aktarılırken
aynı alan isimleri kullanılır. Eğer bileşenin yaratılmasında daha fazla kontrol sahibi olmak
isterseniz, sonuç kümesindeki satırları nesnelere çeviren BeanListHandler([Link]
tür, RowProcessor donusturulecekTur) hazırlayıcı metodunu kullanabilirsiniz. OgrenciBileseni
sınıfının değiştirge olarak kullanılması halinde BasicRowProcessor() metodu görevi
gerçekleştirmek üzere kullanılır. Tüm bunlar işinize yaramadıysa BeanListHandler
dil
hazırlayıcısı için yeni bir yanım yapabilirsiniz.
Programın çıktısı veritabanındaki bilgilere göre değişecektir fakat muhtemel çıktı:
***MapListHandler-eşlem işleyici listesi kullanıyor***
No -> 20022016
İsim -> emre karan
No ->9820676
va
İsim -> serkan bakar
***BeanListHandler-bileşen listesi işleyici kullanıyor***
No -> 20022016
İsim ->emre karan
No -> 9820676
İsim -> serkan bakar
Şeklinde olacaktır.
ja
Sözlük
Overloading: bindirme
w.
Exception: istisna, aykırı durum
İnterface: arabirim
Constructor: hazırlayıcı, konstrüktör
Exception handling: istisna işleme, aykırı durum ele alma
Parameter: değiştirge, parametre, argüman
Function: metot
Bean: bileşen
ww
7
EK-A
m
package ornek;
import [Link].*;
import [Link]*;
o
import [Link];
import [Link];
import [Link];
public class DbutilsOrnegi {
i.c
public static void main(String[] args){
Connection baglantı = null;
String jdbcURL = "jdbc:mysql://[Link]:3306/test";
String jdbcSurucu = "[Link]";
try{
[Link](jdbcDriver);
dil
//kullanıcı adı "emre" şifre ""
baglantı = [Link](jdbcURL,"emre","");
QueryRunner sorguCalistirici = new QueryRunner();
[Link]("***MapListHandler-eşlem işleyici listesi
kullanıyor***");
va
List eslemListesi = (List) [Link](baglantı,
"SELECT OgrNo, Isim FROM OgrTablo WHERE OgrNo IN (?,?)",
new String[] {"1","2"}, new MapListHandler());
for(int sayac = 0; sayac < [Link](); sayac++){
Map degerler = (Map) [Link](sayac);
[Link]("\tNo -> " + [Link]("ogrno")));
ja
[Link]("\t Isim -> " + [Link]("isim"));
}
[Link]("***BeanListHandler-bileşen listesi işleyici
kullanıyor***");
List bilesenListesi = (List) [Link](baglantı,
w.
"SELECT OgrNo, Isim From OgrTablo",
new BeanListHandler([Link]));
for (int sayac = 0; sayac < [Link](); sayac++ ){
OgrTablo vals = (OgrTablo) [Link](i);
[Link]("\tNo -> " + [Link]());
[Link]("\tIsim -> " + [Link]());
ww
}
}catch (SQLException istisna){
[Link]();
}finally{
[Link](baglantı);
}
}
}
8
EK-B
m
package ornek;
public class OgrTablo {
public int ogrNo;
public String isim;
o
public OgrTablo(){
}
public void ismiGunle(String isim){
[Link] = isim;
i.c
}
public String isimOku(){
return isim;
}
public void ogrNoGunle(int ogrNo){
[Link] = ogrNo;
dil
}
public int ogrNoOku(){
return ogrNo;
}
}
va
İlyas Emre KARAN
20022016
ja
w.
ww