Yayın bilgisine linkten erişim sağlayabilirsiniz.
BİLGİ PAYLAŞINCA GÜZEL
27 Haziran 2014 Cuma
WEB TABANLI DOKÜMAN YÖNETİM SİSTEMİ
Karabük Üniversitesi'nde yapılan ISITES 2014 bilimsel etkinliğinde sunumunu yaptığım "WEB TABANLI DOKÜMAN YÖNETİM SİSTEMİ" başlıklı bildiri yayınlandı.
Java HashMap Sınıfı
Kurumsal yazılım uygulamalarında model yapısı genellikle
kullanılan bir yapıdır. MVC yapısından birini temsil eder. Ancak yazılım
geliştiricilerin çoğu model yapısını geliştirme kısmında kodlamasını yaparlar.
Bu şekilde tanımlanan modeller kısmen statik bir yapıdadır. Çünkü kodlanmış bir
model yapısı sabittir. Model ile ilgili yeni bir ihtiyaç olması halinde kod
kısmında model için değişiklik yapılması gerekmektedir. Bu açıdan bakıldığında
kodlanan modeller yazılım esnekliğini azaltan bir durum olarak görülebilir.
Çözüm olarak dinamik model yapısı düşünülebilir. Dinamik model yapısı için en
uygun kütüphanelerden biri Java HashMap kütüphanesi olabilir. HashMap sınıfı Map üst sınıfından türemiştir.
Map ara yüzü anahtar-değer ikililerini bir arada tutmak için tasarlanmıştır.
Matematikteki fonksiyonların yazılım tarafında karşılığı olan Map veri yapıları
yazılım mimarisinde sıkça kullanılır. Örneğin yazılımımızda bulunan nesnelere
birer kimlik numarası vererek bu numara ile nesne arasında anahtar-değer
ilişkisi kurabiliriz. Böylelikle istediğimiz nesneye kimlik numarası
aracılığıyla rahatlıkla erişebiliriz. Java Map ara yüzü herhangi bir sıralama
kısıtı getirmez. Map’e eklenen anahtar-değer ikililerinin eklendiği sırada
kalacağı garanti değildir. HashMap verilen anahtardan hash fonksiyonu
yardımıyla bir dizi indeksi oluşturur. Verilen değer de bu dizi indeksindeki
belleğe yerleştirilir. Hash fonksiyonları çok temel matematiksel işlemler
kullandıklarından hızlıdırlar. Dolayısıyla HashMap’de verilere erişim sabit
zamanda olur. HashMap performansı için önemli olan iki parametre ilk kapasite
ve yük faktörüdür. Varsayılan olarak ilk kapasite 11′dir. Yük faktörü HashMap
koleksiyonumuzun herhangi bir anda maksimum doluluk oranını ölçer. Bu değer
varsayılan olarak %75 dir. HashMap’de doluluk oranı bu değerin üzerine
çıktığında kapasite artırımına gidilerek değerler tekrar hash’lenir. HashMap bu
özelliği dikkate alındığında MVC yapılarından olan model için esnek bir şekilde
kullanılabilir. Model olarak
kullanıldığında HashMap sınıfı yeni eklenen özelliği otomatik olarak
oluşturulur. Böylece sürekli olarak kod kısmında
değişiklik yapılmasına gerek kalmayacaktır. Veri tabanında tabloya yeni bir
kolon eklendiğinde ve bu tablodan HashMap sınıfı ile veri alındığında kod
kısmında değişiklik yapılmadan veriler güncel olarak gelecektir. Belli
dezavantajları bulunmaktadır. Dezavantajlardan biri şudur; Bir HashMap sınıfı
veri yüklendiğinde kendi içerindeki özellikler sıralı değildir. Zaten bu model
yapılarında çok aranan bir durum olarak da ele alınmadığından bir eksiklik
olarak da görülmeyebilir. Diğer dezavantajı web servislerinde model olarak
kullanımı tercih edilmeyebilir. Çünkü web servislerinde kodlanan model yapıları
başka programlama dili kullanan bir yazılımda kullanıldığında karşılığı oluşması
gerekir. Web servislerinde model yapısı olarak HashMap kullanılırsa Java
programlama dili dışında diğer programlama dillerinde karşılığı olan bir model
oluşması gerekir. Diğer programlama
dillerinde bunun garantisi olmadığından dolayı tercih edilmeyebilir.
24 Mayıs 2014 Cumartesi
Oracle listagg kullanımı
Mahmut hocanın ders listesini virgülle yan yana getirelim.
Tablo
--------------------------------------------------------------
HOCA DERS
--------------------------------------------
Merve Matematik
Mustafa Fizik
Aynur Kimya
Mete Biyoloji
Merve Geometri
Sql
---------------------------------------------
select
HOCA,
listagg
(DERS, ',')
WITHIN GROUP
(ORDER BY DERS) as DERSLER
FROM Tablo
GROUP BY HOCA
Sonuç
-----------------------------
Merve Matematik, Geometri
Mustafa Fizik
Mete Biyoloji
Aynur Kimya
Zk Framework ile istemci tarayıcı türünü ve işletim sistemini anlamak
Web erişimlerinde http isteklerinin mobil veya bilgisayardan geldiğini anlamak
için aşağıdaki kod parçasını Zk Framework için java sınıfında kullanılabilir.
String str=Executions.getCurrent().getHeader("User-Agent");
if(str.indexOf("Windows")>0){
System.out.println("Windows");
}else if(str.indexOf("iPad")>0){
System.out.println("iPad");
}else if(str.indexOf("iPhone")>0){
System.out.println("iPhone");
}
için aşağıdaki kod parçasını Zk Framework için java sınıfında kullanılabilir.
String str=Executions.getCurrent().getHeader("User-Agent");
if(str.indexOf("Windows")>0){
System.out.println("Windows");
}else if(str.indexOf("iPad")>0){
System.out.println("iPad");
}else if(str.indexOf("iPhone")>0){
System.out.println("iPhone");
}
15 Nisan 2014 Salı
1 Ocak 2014 Çarşamba
Sql ile çift kayıtları silme
Bir tabloda bir kolona göre tekrarlanmış veriler olabilir. Sadece bir kayıt kalmasını isteyebiliriz.
Örnek Oracle sql :
Bir tabloda bir kayda ait tarihine göre en yeni kaydın kalmasını istiyorsak
delete
from tablo
WHERE rowid not in
(SELECT max(rowid)
FROM tablo
GROUP BY kayitId);
en eski kaydın kalmasını istiyorsak
delete
from tablo
WHERE rowid not in
(SELECT min(rowid)
FROM tablo
GROUP BY kayitId);
şeklinde çalıştırabiliriz.
Örnek Oracle sql :
Bir tabloda bir kayda ait tarihine göre en yeni kaydın kalmasını istiyorsak
delete
from tablo
WHERE rowid not in
(SELECT max(rowid)
FROM tablo
GROUP BY kayitId);
en eski kaydın kalmasını istiyorsak
delete
from tablo
WHERE rowid not in
(SELECT min(rowid)
FROM tablo
GROUP BY kayitId);
şeklinde çalıştırabiliriz.
30 Ağustos 2013 Cuma
Spring Hibernate Entegrasyonu
Java web uygulamalarında Spring framework xml dosyası olarak kullanılmaktadır.
Spring'in işlevi tomcat v.b sunucularda uygulama başlarken sistemde kullanılan
nesnelerin konfigürasyonunu sağlar. Hibernate sunucu ile konfigürasyonu
yapılması gereken bir iş çatısıdır. Dolayısıyla Spring dosyasında
hibernate tanımı yapmak uygulama açısından daha performanslı olacaktır.
Spring kullanmak için jar kütüphanelerini indirmeniz gerekmektedir.
http://repo.springsource.org/libs-milestone-local/org/springframework/spring/4.0.0.M3/spring-framework-4.0.0.M3-dist.zip
adresinden indirebilirsiniz. İndirdiğiniz jar dosyalarını WebRoot-->WEB-INF-->lib
klasörü altına kopyalayın. Bu klasör web uygulamasında her zaman kütüphane yeridir.
Java web uygulamalarında Spring dosyası
WebRoot-->WEB-INF klasörü altında bulunur.
Spring dosya ismi genellikle applicationContext.xml olarak tanımlanır.
Spring tamamladıktan sonra Hibernate için kütüphane indirmemiz gerekiyor.
http://www.hibernate.org/subprojects/ogm/download.html adresinden indirebilirsiniz.
İndirilen hibernate kütüphaneleri lib klasörü altına kopyalanır.
Spring - Hibernate entegrasyonu sağlayan applicationContext.xml dosyası
aşağıdaki gibi olacaktır.
-------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="iso-8859-9"?>
<!DOCTYPE beans PUBLIC
"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${hibernate.connection.driver_class}" />
<property name="url" value="${hibernate.connection.url}" />
<property name="username" value="${hibernate.connection.username}" />
<property name="password" value="${hibernate.connection.password}" />
</bean>
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>WEB-INF/conn.properties</value>
</list>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="mappingLocations">
<list>
<value>classpath*:hibernate/*.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=${hibernate.dialect}
hibernate.hbm2ddl.auto=update
</value>
</property>
<property name="lobHandler">
<bean class="org.springframework.jdbc.support.lob.DefaultLobHandler" />
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="dao" class="Dao">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="service" class="Service">
<property name="dao" ref="dao" />
</bean>
<bean id="serviceBean"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref bean="service" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>
-------------------------------------------------------------------------------------------------------
Xml dosyasında tanımladığımız değişkenler bulunmaktadır. Bu değişkenler aşağıdaki adımlarla
göstereceğiz.
Java modellemede bir üst sınıf kullanacağız. Veri aktarımında kullanacağımız nesneleri bu
üst sınıftan kalıtım veya interface yaparak işlem gerçekleştirilecektir. (src dosyası altında oluşturuyoruz.)
Üst sınıf
----------------------------------------------
public class BaseModel{
}
Örnek bir işlem için bir model sınıf oluşturalım. (src dosyası altında oluşturuyoruz.)
--------------------------------------------------------
import java.io.Serializable;
public class GenelModel extends BaseModel implements Serializable{
private String LABEL;
private String VALUE;
public GenelModel() {
super();
}
public GenelModel(String id, String ad) {
this.LABEL=id;
this.VALUE=ad;
}
public String getLABEL() {
return LABEL;
}
public void setLABEL(String label) {
LABEL = label;
}
public String getVALUE() {
return VALUE;
}
public void setVALUE(String value) {
VALUE = value;
}
}
Spring Xml dosyasında Dao ve Service java nesnelerinin değişkenlerini kullandık. src klasörü altında bu java sınıflarını
tanımlamamız gerekiyor. Sınıfların tanımı aşağıdaki gibidir.
Servis.java
import java.util.HashMap;
public class Service {
private Dao dao;
public Dao getDao() {
return dao;
}
public void setDao(Dao dao{
this.dao = dao;
}
public ArrayList getTestList(HashMap params) throws Exception {
// TODO Auto-generated method stub
return dao.getTestList();
}
public void savaModel(BaseModel model) throws Exception {
// TODO Auto-generated method stub
dao.save(model);
}
}
Dao.java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import net.sf.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class Dao extends HibernateDaoSupport{
public Session openSession() {
return (Session) SessionFactoryUtils.getSession(getSessionFactory(), false);
}
public Query getQuery(String query) throws HibernateException {
Session session = this.openSession();
return (Query) session.createQuery(query);
}
public void CloseSession(){
openSession().close();
}
public ArrayList getTestList(HashMap params) throws Exception {
Criteria criteria = openSession().createCriteria(BaseModel.class);
return (ArrayList) criteria.list();
}
public void savaModel(BaseModel model) throws Exception {
// TODO Auto-generated method stub
openSession().save(model);
}
}
Hibernate iş çatısında her tabloya karşılık bir java nesnesi bulunmaktadır.
Java modellerini ve tablolarını ilişkilendiren hbm.xml dosyalarıdır. Yukarıdaki
Spring xml dosyasında hbm.xml dosyalarının buluanacağı dizin tanımı var.
Classpath olarak hibernate olarak tanımlanmış. Yani src/hibernate klasörünü oluşturuyoruz.
Tanımladığımız GenelModel java sınıfına karşılık gelen bir tablo olsun.
Tablo ismi GENEL dir. Tablo ile GenelModel java sınıfını birleştiren
hibernate hbm.xml dosyasını src klasörü altına oluşturalım.
Dosya ismi
Genel.hbm.xml dir.
-----------------------------------------------------------------------------------------------------
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="true" default-access="field">
<class name="GenelModel" table="GENEL" lazy="false">
<id name="VALUE" column="VALUE">
<generator class="native"/>
</id>
<property name="LABEL" column="LABEL" />
</class>
</hibernate-mapping>
-----------------------------------------------------------------------------------------------------
Spring Xml dosyasında conn.properties dosya tanımı bulunuyor. Bu dosyayı da oluşturuyoruz.
Dosya oluşturulma yeri WEB-INF klasörü altında conn.properties olacaktır. İçeriği aşağıdaki gibidir.
----------------------------------------------------------------------------------------------------
hibernate.connection.driver_class = org.gjt.mm.mysql.Driver
hibernate.connection.username = root
hibernate.connection.password = root
hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
hibernate.connection.url = jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8
----------------------------------------------------------------------------------------------------
Örneğimizde mysql veritabanı kullandık. Mysql kütüphanesini Spring ve Hibernate benzer olarak indirip tanımlamanız gerekmektedir.
Burdan indirebilirsiniz http://www.java2s.com/Code/Jar/m/Downloadmysqljar.htm
Tekrar hatırlatalım java web uygulamalarındaki kütüphane yeri WEB-INF/lib klasörüdür.
En son olarak tanımladığımı Spring xml dosyasını (applicationContext.xml) web.xml'de tanımlamamız gerekir.
web.xml dosyası WEB-INF klasörü altındadır ve aşağıdaki gibidir.
---------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>ASTIDEN07092011</display-name>
<!--
<icon> <small-icon></small-icon> <large-icon></large-icon> </icon>
-->
<!-- Spring ApplicationContext -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml
</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
</web-app>
---------------------------------------------------------------------------------------------------------
Tüm tanımları yaptıktan sonra Web uygulamanızda kullanacağınız framework e göre aşağıdaki
java metodunu kullanabiliriz.
public testMetod() throws Exception {
Service service= (Service) getBean("serviceBean");
// veri getirme örneği. Veritabanında GENEL tablosunda veri olduğunu varsayıyoruz.
HashMap params=new HashMap();
ArrayList<GenelModel> liste=service.getTestList(params);
for(GenelModel model:liste){
System.out.println(model.getLABEL);
}
//veri kayıt örneği.
//saveModel metodunda BaseModel tanımlanmıştı.
//Ama GenelModel nesnesini ekledik. Bu hataya neden olmaz. Çünkü BaseModel, GenelModel'in üst sınıfıdır.
//Bu şekildeki bir kullanım programa esneklik sağlar.
GenelModel model2=new GenelModel();
model2.setLABEL("test değer");
service.savaModel(model2);
//setVALUE kullanmadık. Nedeni ise hbm.xml dosyasında tabloda bu sütün otomatik artan değer almaktadır.
//Bu yüzden değer set etmeye gerek yoktur.
}
Not:Yukarıdaki metodu web uygulamasında bir butona click event olarak tanımlayabilirsiniz.
Örnekte basit bir model olan GenelModel kullandık.
Bu modellerin üst sınıfı BaseModel dir. Üst sınıf kullanmamızın nedeni uygulamaya esneklik
kazandırmak. Çünkü bir model daha oluşturduğumuzda ve bu modele ait veri getiren veya veri kaydeden metodlar, dao ve servis
sınıflarında tekrar yazılması gerekebilirdi.(ör:saveModel metodu tüm kayıt işlemlerinde kullanılabilir.)
Halbuki işlem gören metodda yani testMetod'da liste getirilirken Arraylist generic olarak
BaseModel'den kalıtım yapmış bir model sınıfı kullanılmaktadır.
(Örnekte standart metodumuz getTestList kullandık.)
İsteğinize bağlı olarak
Birden fazla java modeli tanımlayabilirsiniz. Buna bağlı olarak hbm.xml dosyalarını da oluşturmanız gerekir.
Bazı modeller birbirine many to one veya one to many olarak gerçekleşebilir.
Örneğin ders modeli ve öğrenci modeli olsun. Öğrenci modeli içerisinde ders modeli listesi bulunabilir.
Öğrenci modeli için hbm.xml dosyasında Ders modeli için one to many xml tag'ini kullanmanız gerekir.
Spring ve hibernate entegrasyonu sağlayan yapı temel olarak yukarıdaki adımlardan oluşur.
Umarım yararlı bir bilgi olur.
Spring'in işlevi tomcat v.b sunucularda uygulama başlarken sistemde kullanılan
nesnelerin konfigürasyonunu sağlar. Hibernate sunucu ile konfigürasyonu
yapılması gereken bir iş çatısıdır. Dolayısıyla Spring dosyasında
hibernate tanımı yapmak uygulama açısından daha performanslı olacaktır.
Spring kullanmak için jar kütüphanelerini indirmeniz gerekmektedir.
http://repo.springsource.org/libs-milestone-local/org/springframework/spring/4.0.0.M3/spring-framework-4.0.0.M3-dist.zip
adresinden indirebilirsiniz. İndirdiğiniz jar dosyalarını WebRoot-->WEB-INF-->lib
klasörü altına kopyalayın. Bu klasör web uygulamasında her zaman kütüphane yeridir.
Java web uygulamalarında Spring dosyası
WebRoot-->WEB-INF klasörü altında bulunur.
Spring dosya ismi genellikle applicationContext.xml olarak tanımlanır.
Spring tamamladıktan sonra Hibernate için kütüphane indirmemiz gerekiyor.
http://www.hibernate.org/subprojects/ogm/download.html adresinden indirebilirsiniz.
İndirilen hibernate kütüphaneleri lib klasörü altına kopyalanır.
Spring - Hibernate entegrasyonu sağlayan applicationContext.xml dosyası
aşağıdaki gibi olacaktır.
-------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="iso-8859-9"?>
<!DOCTYPE beans PUBLIC
"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${hibernate.connection.driver_class}" />
<property name="url" value="${hibernate.connection.url}" />
<property name="username" value="${hibernate.connection.username}" />
<property name="password" value="${hibernate.connection.password}" />
</bean>
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>WEB-INF/conn.properties</value>
</list>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="mappingLocations">
<list>
<value>classpath*:hibernate/*.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=${hibernate.dialect}
hibernate.hbm2ddl.auto=update
</value>
</property>
<property name="lobHandler">
<bean class="org.springframework.jdbc.support.lob.DefaultLobHandler" />
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="dao" class="Dao">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="service" class="Service">
<property name="dao" ref="dao" />
</bean>
<bean id="serviceBean"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref bean="service" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>
-------------------------------------------------------------------------------------------------------
Xml dosyasında tanımladığımız değişkenler bulunmaktadır. Bu değişkenler aşağıdaki adımlarla
göstereceğiz.
Java modellemede bir üst sınıf kullanacağız. Veri aktarımında kullanacağımız nesneleri bu
üst sınıftan kalıtım veya interface yaparak işlem gerçekleştirilecektir. (src dosyası altında oluşturuyoruz.)
Üst sınıf
----------------------------------------------
public class BaseModel{
}
Örnek bir işlem için bir model sınıf oluşturalım. (src dosyası altında oluşturuyoruz.)
--------------------------------------------------------
import java.io.Serializable;
public class GenelModel extends BaseModel implements Serializable{
private String LABEL;
private String VALUE;
public GenelModel() {
super();
}
public GenelModel(String id, String ad) {
this.LABEL=id;
this.VALUE=ad;
}
public String getLABEL() {
return LABEL;
}
public void setLABEL(String label) {
LABEL = label;
}
public String getVALUE() {
return VALUE;
}
public void setVALUE(String value) {
VALUE = value;
}
}
Spring Xml dosyasında Dao ve Service java nesnelerinin değişkenlerini kullandık. src klasörü altında bu java sınıflarını
tanımlamamız gerekiyor. Sınıfların tanımı aşağıdaki gibidir.
Servis.java
import java.util.HashMap;
public class Service {
private Dao dao;
public Dao getDao() {
return dao;
}
public void setDao(Dao dao{
this.dao = dao;
}
public ArrayList getTestList(HashMap params) throws Exception {
// TODO Auto-generated method stub
return dao.getTestList();
}
public void savaModel(BaseModel model) throws Exception {
// TODO Auto-generated method stub
dao.save(model);
}
}
Dao.java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import net.sf.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class Dao extends HibernateDaoSupport{
public Session openSession() {
return (Session) SessionFactoryUtils.getSession(getSessionFactory(), false);
}
public Query getQuery(String query) throws HibernateException {
Session session = this.openSession();
return (Query) session.createQuery(query);
}
public void CloseSession(){
openSession().close();
}
public ArrayList getTestList(HashMap params) throws Exception {
Criteria criteria = openSession().createCriteria(BaseModel.class);
return (ArrayList) criteria.list();
}
public void savaModel(BaseModel model) throws Exception {
// TODO Auto-generated method stub
openSession().save(model);
}
}
Hibernate iş çatısında her tabloya karşılık bir java nesnesi bulunmaktadır.
Java modellerini ve tablolarını ilişkilendiren hbm.xml dosyalarıdır. Yukarıdaki
Spring xml dosyasında hbm.xml dosyalarının buluanacağı dizin tanımı var.
Classpath olarak hibernate olarak tanımlanmış. Yani src/hibernate klasörünü oluşturuyoruz.
Tanımladığımız GenelModel java sınıfına karşılık gelen bir tablo olsun.
Tablo ismi GENEL dir. Tablo ile GenelModel java sınıfını birleştiren
hibernate hbm.xml dosyasını src klasörü altına oluşturalım.
Dosya ismi
Genel.hbm.xml dir.
-----------------------------------------------------------------------------------------------------
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="true" default-access="field">
<class name="GenelModel" table="GENEL" lazy="false">
<id name="VALUE" column="VALUE">
<generator class="native"/>
</id>
<property name="LABEL" column="LABEL" />
</class>
</hibernate-mapping>
-----------------------------------------------------------------------------------------------------
Spring Xml dosyasında conn.properties dosya tanımı bulunuyor. Bu dosyayı da oluşturuyoruz.
Dosya oluşturulma yeri WEB-INF klasörü altında conn.properties olacaktır. İçeriği aşağıdaki gibidir.
----------------------------------------------------------------------------------------------------
hibernate.connection.driver_class = org.gjt.mm.mysql.Driver
hibernate.connection.username = root
hibernate.connection.password = root
hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
hibernate.connection.url = jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8
----------------------------------------------------------------------------------------------------
Örneğimizde mysql veritabanı kullandık. Mysql kütüphanesini Spring ve Hibernate benzer olarak indirip tanımlamanız gerekmektedir.
Burdan indirebilirsiniz http://www.java2s.com/Code/Jar/m/Downloadmysqljar.htm
Tekrar hatırlatalım java web uygulamalarındaki kütüphane yeri WEB-INF/lib klasörüdür.
En son olarak tanımladığımı Spring xml dosyasını (applicationContext.xml) web.xml'de tanımlamamız gerekir.
web.xml dosyası WEB-INF klasörü altındadır ve aşağıdaki gibidir.
---------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>ASTIDEN07092011</display-name>
<!--
<icon> <small-icon></small-icon> <large-icon></large-icon> </icon>
-->
<!-- Spring ApplicationContext -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml
</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
</web-app>
---------------------------------------------------------------------------------------------------------
Tüm tanımları yaptıktan sonra Web uygulamanızda kullanacağınız framework e göre aşağıdaki
java metodunu kullanabiliriz.
public testMetod() throws Exception {
Service service= (Service) getBean("serviceBean");
// veri getirme örneği. Veritabanında GENEL tablosunda veri olduğunu varsayıyoruz.
HashMap params=new HashMap();
ArrayList<GenelModel> liste=service.getTestList(params);
for(GenelModel model:liste){
System.out.println(model.getLABEL);
}
//veri kayıt örneği.
//saveModel metodunda BaseModel tanımlanmıştı.
//Ama GenelModel nesnesini ekledik. Bu hataya neden olmaz. Çünkü BaseModel, GenelModel'in üst sınıfıdır.
//Bu şekildeki bir kullanım programa esneklik sağlar.
GenelModel model2=new GenelModel();
model2.setLABEL("test değer");
service.savaModel(model2);
//setVALUE kullanmadık. Nedeni ise hbm.xml dosyasında tabloda bu sütün otomatik artan değer almaktadır.
//Bu yüzden değer set etmeye gerek yoktur.
}
Not:Yukarıdaki metodu web uygulamasında bir butona click event olarak tanımlayabilirsiniz.
Örnekte basit bir model olan GenelModel kullandık.
Bu modellerin üst sınıfı BaseModel dir. Üst sınıf kullanmamızın nedeni uygulamaya esneklik
kazandırmak. Çünkü bir model daha oluşturduğumuzda ve bu modele ait veri getiren veya veri kaydeden metodlar, dao ve servis
sınıflarında tekrar yazılması gerekebilirdi.(ör:saveModel metodu tüm kayıt işlemlerinde kullanılabilir.)
Halbuki işlem gören metodda yani testMetod'da liste getirilirken Arraylist generic olarak
BaseModel'den kalıtım yapmış bir model sınıfı kullanılmaktadır.
(Örnekte standart metodumuz getTestList kullandık.)
İsteğinize bağlı olarak
Birden fazla java modeli tanımlayabilirsiniz. Buna bağlı olarak hbm.xml dosyalarını da oluşturmanız gerekir.
Bazı modeller birbirine many to one veya one to many olarak gerçekleşebilir.
Örneğin ders modeli ve öğrenci modeli olsun. Öğrenci modeli içerisinde ders modeli listesi bulunabilir.
Öğrenci modeli için hbm.xml dosyasında Ders modeli için one to many xml tag'ini kullanmanız gerekir.
Spring ve hibernate entegrasyonu sağlayan yapı temel olarak yukarıdaki adımlardan oluşur.
Umarım yararlı bir bilgi olur.
Kaydol:
Kayıtlar (Atom)