Friday, October 22, 2004

SELECT / UPDATE / INSERT / DELETE Yazmaktan Kurtulun!

Java bilgi işlem programlarımızda, bir veri yapısını hafızada işlerken, Java Bean kullanırız. Programın ileri satırlarında, bu nesneyi veri tabanına yazmamız, veya tekrar okuma vakti gelir çatar. Ne yapacağız?

Normâlde Bean'leri veri tabanına yazmak için JDBC üzerinden INSERT komutu kullanırız. Ve tekrar aynı nesneyi okumak gerektiğinde de SELECT... Bu liste böyle uzar gider.

Hâlbuki, sıfır SQL yazarak bir Java nesnesini veri tabanına yazmamız, oradan da okumamız mümkündür. Yeni teknolojiler sayesinde tek yapmamız gereken, bir XML "eşleme" dosyasını kullanarak hangi Bean özelliğinin (attribute) hangi veri taban tablosunun hangi kolonuna eşlendiğini bir kere belirtmektir. Sonra, bu yeni teknoloji kütüphanesine session.save(bizimnesne) gibi bir komut vererek, SQL'in arka planda otomatik olarak üretilmesini ve işletilmesini sağlayabiliriz.

Bu tür teknolojilere kalıcılık (persistence) teknolojisi diyoruz. Kalıcılığın Java dünyasındaki gözde gerçekleştirimlerinden birisi JDO, diğeri de Hibernate'tir.

JDO hakkında sitemizde bazı yazılar çıkmıştı. Bu yazının konusu Hibernate olacak.

Kurmak

Önce, Hibernate sitesinden en son sürümü indirin. Herhangi bir dizinde açın. Bu yazıda gösterilen demo'yu da indirin, ve ayrı bir yere açın.

Demo'nun çalışması için Hibernate dizisinden bazı jar dosyalarına ihtiyacımız olacak (yer tutmaması için bu dosyalar zip'e eklenmedi). Aşağıdaki listede görülen dosyaları, demomumuzun lib/ dizini kopyalayın.


* cglib-full-2.0.1.jar
* commons-collections-2.1.jar
* commons-dbcp-1.1.jar
* commons-lang-1.0.1.jar
* commons-logging-1.0.3.jar
* commons-pool-1.1.jar
* dom4j-1.4.jar
* ehcache-0.7.jar
* hibernate2.jar
* jta.jar
* xalan-2.4.0.jar
* xerces-2.4.0.jar

Demo için MySql olduğunu varsayıyoruz.

MySql veri tabanını demoya hazırlamak için, demo/code/src/sql/tablo.sql programcığını, TEST veri tabanı üzerinde mysql komut satırından "source" komutunu kullanarak işletin. Tablomuz böylece yaratılmış olacak.

$ cd mysql/bin
$ ./mysql

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 52 to server version: 3.23.52-max-nt

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> connect test

Connection id: 53
Current database: test

mysql> source demodizini/code/src/sql/tablo.sql

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)



Tablo yaratıldı. Şimdi demo'yu işletelim.

$ ant clean compile test -find

Nasıl Yaptık?

Hibernate, veri tabanına kalıcılık yapmak için, bir eşleme dosyasına ihtiyaç duyar. Tabana yazılacak her nesne, bir XML eşleme dosyasında tanımlanmalıdır. Tanım dosyasının soneki, ".hbm.xml" şeklinde olur.

DEMO/code/src/com/test/Account.hbm.xml dosyasında bu tür bir eşlemeyi görebilirsiniz. Aşağıda da bu tanımı veriyoruz.

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >

<hibernate-mapping package="com.test">

<class name="Account" table="Tablo">
<id name="bizimId" column="bizimId" type="int">
<generator class="increment"c/>
</id>
<property name="bir" column="bir" />
<property name="iki" column="iki" />
<property name="uc" column="uc" />
<property name="dort" column="dort" />
</class>

</hibernate-mapping>

Bu tanımdaki class name, tabana yazılacak Java nesnesinin ismi olmalıdır. Property name ibaresinden sonra gelen kelime, Java nesnesinin get/set ile tanımlı özellik (property) leridir, ve bu satırda, hangi veri taban kolonuna eşlendiği belirtilir.

Generator class tanımı, bir ID kolonunun nasıl muâmele göreceğini söyler. ID'lerin muamelesi bildiğimiz gibi bilgi işlem programlarında klasik problemlerden biridir, ve değişik çözüm yolları vardır. Bu çözümlerin Hibernate'deki yansımaları da mevcuttur. Eğer ID'nin Java işlem mantığı tarafında verilmesini istiyorsak, generator class="assigned" derdik. Eğer Hibernate kütüphanesinin bu işi yapmasını istiyorsak (otomatik birer birer arttırarak meselâ), o zaman generator class="increment" kullanırız, nitekim demo bu en basit yolu seçmiştir.

Daha birçok ID muamele yöntemi vardır. Detaylar için Hibernate belgelerine bakınız.

Java bean nesnesi, çok basit olduğu için burada verilmeyecek. Bu, üzerinde sadece temel tiplere dayalı özelliklerin ve bunların get/set metotlarının olduğu bir nesnedir. Olağan kurucu (default constructor)'ın tanımlanması şarttır, fakat geri kalanı oldukça basit.

Ve şimdi, gelelim esas sihrin olduğu satırlara!

  // bellekte yarat
Account acc = new Account();

// hibernate i hazirla
Configuration cfg = new Configuration();
cfg.addClass(Account.class);
SessionFactory sf = cfg.buildSessionFactory();
Session s = sf.openSession();
Transaction t = s.beginTransaction();

// bean'e veri koy
acc.setBir(1);
acc.setIki(0);
acc.setUc(0);
acc.setDort(null);

// veri tabanina yaz!!
s.save(acc);

// commit et, baglantiyi kapat
t.commit();
s.close();

Olanlar: Account nesnesini hafızada yarattık. Sonraki satırlarda Hibernate'i hazır duruma getirdik (bu çâğırımları merkezi bir nesnede toplayabilirsiniz, tekrar tekrar yazılmasına gerek yok). acc.setXX ile Java Bean nesnesine istediğimiz değerleri veriyoruz. Veeeeeee.... s.save(acc) ile nesnemiz tabana otomatik olarak yazılıyor!

(Commit ve close komutları, veri tabanı dünyasında da hatırladığımız kavramlar)

Arka planda (bizim yazmamızın gerekmediği) olaylar şunlar: Hibernate'e Account nesnesini tabana yazması söylendi. O da, bizim tanımladığımız XML eşleme dosyasına baktı, ve buradaki eşlemeden uygun bir SQL INSERT komutu yarattı. Bu komutu MySql'a işletti, ve geri dönüp kontrolü bize verdi.

Diğer Tanımlar

Hibernate'in veri tabanına bağlanması için giriş (login) ismi, şifre gibi uygulama seviyesinde bir kere tanımlanan değerler, DEMO/code/resources/hibernate.properties altında bulunabilir.

hibernate.connection.url jdbc:mysql:///test
hibernate.connection.username admin
hibernate.connection.password

Burada, test adlı veri tabanına, admin kullanıcısı üzerinde boş şifre ile bağlanıyoruz.

Eğer demo'muzu Oracle'da işletmek istesek, yapacağımız tek değişiklik bu properties dosyasında olacaktır, tek satır kod bile değiştirmemize gerek kalmayacaktır!

Kaynaklar


* Hibernate Sitesi
* Demo
* WebLogic 6.1 için yazılmış lan ve Servlet ile kullanımı gösteren birHibernate örneği

No comments: