Sansür, bir toplumun kendine olan güvensizliğini yansıtır ve otoriter rejimlerin belirgin bir özelliğidir.

--Potter Stewart

14.02.2008

HSQLDB

HSQLDB tamamen Java ile yazılmış küçük boyutlu, açık kaynak kodlu bir veri tabanı yönetim sistemi. HSQLDB 1.8.0 ile daha güçlü bir veri tabanı motoruyla 8GB büyüklüğünde veri depolamaya izin veriyor. Yanında gelen veri tabanı yönetim aracları ile 3.3MB yer kaplıyor. Küçük ve kullanım kolaylığı sayesinde her türlü java proje geliştirim ve test aşamasında tercih edilebilir bir seçenek olarak göze çarpıyor. İstemci uygulamaların hizmet alabileceği bir sunucu olarak çalıştırılabileceği gibi uygulama içinden de diğer uygulamalardan bağımsız ayağa kaldırılabiliyor. hsqldb.jar kütüphanesini geliştirmekte olduğumuz uygulamanın lib dizinine kopyalayarak ister .bat kütükleri ile ister Ant görevleri olarak sunucuyu ve veri tabanı yönetim konsolunu çalıştırabiliriz:



<!-- Global properties for this build -->

<property name="src.java.dir" value="src" />

<property name="lib.dir" value="lib" />

<property name="build.dir" value="bin" />


<!-- Classpath declaration -->

<path id="project.classpath">

<fileset dir="${lib.dir}">

<include name="**/*.jar" />

<include name="**/*.zip" />

</fileset>

</path>


<!-- Run HSQLDB Server -->

<target name="hsqldb.run.server" description="Start HSQLDB server">

<java classname="org.hsqldb.Server" fork="yes" classpathref="project.classpath" failonerror="true" />

</target>


<!-- Run HSQLDB Manager -->

<target name="hsqldb.run.dbmanager" description="Start HSQLDB manager">

<java classname="org.hsqldb.util.DatabaseManagerSwing" fork="yes" classpathref="project.classpath" failonerror="true">

<arg value="-url" />

<arg value="jdbc:hsqldb:hsql://localhost/" />

<arg value="-driver" />

<arg value="org.hsqldb.jdbcDriver" />

</java>

</target>



Sunucu çalıştırıldığı esnada “test.” ile başlayan kütükler yaratıyor ve bu kütüklerde kalıcı veriyi saklıyor. Bu kütükleri silerek sıfırdan veri tabanı sunucusu çalıştırabiliyorsunuz. Ayrıntılı bilgi, belgeleme ve kaynak kod için http://www.hsqldb.org/ adresini inceleyebilirsiniz.

1.02.2008

Spring JDBC Kalıplarının (Templates) Kullanımı

Hibernate, iBATIS, JPA, vb. veri erişim teknolojilerinin sağladığı artılar bir yana bırakıp veri tabanına daha alt düzey erişimlerde bulunmak için JDBC tercihi yapılabilir. JDBC soyutlaması için Spring üç ayrı kalıp sınıfı sunmaktadır:


  • JdbcTemplate (parametreleri indeks değerleri ile atama)

  • NamedParameterJdbcTemplate (parametreleri isimlerle atama)

  • SimpleJdbcTemplate (Java 5 için)



JdbcTemlate Kullanımı


JdbcTemplate bean tanımını şu şekilde yazılır:


<bean id="jdbcTemplate"

class="org.springframework.jdbc.core.JdbcTemplate">

<property name="dataSource">

<ref local="dataSource" />

</property>

</bean>


dataSource tanımlama ve Spring’in veri erişim katmanı için sunduğu desteğe şu blog girdisinde bahsetmiştik. Dao sınıfımız da JdbcDaoSupport sınıfını kalıtmalıdır:


public class OgrenciDaoImpl extends JdbcDaoSupport

implements OgrenciDao{

...

}




Dao sınıfımıza bağımlılık aktarımı ile jdbcTemplate bağlayalım:


<bean id="ogrenciDao" class="dao.OgrenciDao">

<property name="jdbcTemplate" ref="jdbcTemplate" />

</bean>



Veri Tabanına JdbcTemlate ile Kayıt Ekleme:


private static final String OGRENCI_INSERT =

"insert into ogrenci (id, ad, soyad) " +

"values (?,?,?)";


public void saveOgrenci(Ogrenci ogrenci) {

getJdbcTemplate().update(OGRENCI_INSERT,

new Object[] { ogrenci.getId(), ogrenci.getAd(),

ogrenci.getSoyad() });

}



Veri Tabanından JdbcTemlate ile Kayıt Sorgulama


private static final String OGRENCI_SELECT =

"select id, ad, soyad from ogrenci";


private static final String OGRENCI_BY_ID_SELECT =

OGRENCI_SELECT + " where id=?";


public Ogrenci getOgrenciById(long id) {

List matches = getJdbcTemplate().query(OGRENCI_BY_ID_SELECT,

new Object[] { Long.valueOf(id) },

new RowMapper() {

public Object mapRow(ResultSet rs, int rowNum)

throws SQLException, DataAccessException {

Ogrenci ogrenci = new Ogrenci();

ogrenci.setId(rs.getInt(1));

ogrenci.setAd(rs.getString(2));

ogrenci.setSoyad(rs.getString(3));

return ogrenci;

}

});

return matches.size() > 0 ? (Ogrenci) matches.get(0) : null;

}



Burada sorgudan dönen her sıra için JdbcTemplate, RowMapper sınıfının mapRow() yöntemini işletecektir.



NamedParameterJdbcTemplate Kullanımı


NamedParameterJdbcTemplate için yapılması gereken bean tanımları ve örnekler şu şekildedir:


<bean id="jdbcTemplate"

class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">

<property name="dataSource">

<ref local="dataSource" />

</property>

</bean>



public class OgrenciDaoImpl extends NamedParameterJdbcDaoSupport

implements OgrenciDao{

...



private static final String OGRENCI_INSERT =

"insert into ogrenci (id, ad, soyad) " +

"values (:id, :ad, :soyad)";




public void saveOgrenci(Ogrenci ogrenci) {

Map parameters = new HashMap();

parameters.put("id", ogrenci.getId());

parameters.put("password", ogrenci.getAd());

parameters.put("firstName", ogrenci.getSoyad());

getNamedParameterJdbcTemplate().update(OGRENCI_INSERT, parameters);

}


...


}


SimpleJdbcTemplate Kullanımı


Java 5’in getirdiği autoboxing, değişken sayıda parametre geçebilme gibi yenilikleri kullanan SimpleJdbcTemplate için yapılması gereken bean tanımları ve örnekler şu şekildedir:


<bean id="jdbcTemplate"

class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">

<property name="dataSource" ref="dataSource" />

</bean>



public class OgrenciDaoImpl extends SimpleJdbcDaoSupport

implements OgrenciDao{

...


public void saveOgrenci(Ogrenci ogrenci) {

getSimpleJdbcTemplate().update(OGRENCI_INSERT,

ogrenci.getId(), ogrenci.getAd(),

ogrenci.getSoyad());

}



public Ogrenci getOgrenciById(long id) {

List<Ogrenci> matches = getSimpleJdbcTemplate().query(

OGRENCI_BY_ID_SELECT,

new ParameterizedRowMapper<Ogrenci>() {

public Ogrenci mapRow(ResultSet rs, int rowNum)

throws SQLException {

Ogrenci ogrenci = new Ogrenci();

ogrenci.setId(rs.getInt(1));

ogrenci.setAd(rs.getString(2));

ogrenci.setSoyad(rs.getString(3));

return ogrenci;

}

},

id

);

return matches.size() > 0 ? matches.get(0) : null;

}


...

}