Spring – Ders 21 Spring & Hibernate & Oracle – 02
Merhaba Arkadaslar,
Bu yazimda bir onceki yazida oldugu gibi yine Spring ve Hibernate entegrasyonunu gerceklestirecegiz. Bir onceki ornekte HibernateTemplate sinifini kullanmistik. HibernateTemplate sinifi Hibernate Sessionlarini yonetmek ve veritabanina Hibernate araciligi ile erismek/(via access) ten sorumludur.
Burada ise bir baska yaklasim olarak HibernateDaoSupport sinifini kullanacagiz.
HibernateDaoSupport sinifini , HibernateTemplate sinifinin wrapper sinifi olarak dusunebiliriz, yani daha gelismis halidir.
Employee.java
package erguder.levent._21.spring_hibernate._02; public class Employee { private int id; private String name; private String surname; private int salary; // getter setter methods @Override public String toString() { return "Employee [id=" + id + ", name=" + name + ", surname=" + surname + ", salary=" + salary + "]"; } }
Employee , POJO sinifimizi olusturduk ve gerekli getter/setter metotlariyla toString() metodunu override halini sinimiza ekledik.Bir onceki ornekte notasyon ile entity sinif tanimi yapmistik burada ise xml dosyasi ile bu tanimlamayi yapalim.
Bunun icin projemizde paketimizin uzerine sag tiklayalim —> New —> Other –> Hibernate XML mapping file (hbm.xml) secenegini secip next diyelim.Sonrasinda next finish dedigimizde Eclipse bizim icin Employee.hbm.xml dosyasini olusturacaktir.
Employee.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated Aug 8, 2013 1:48:43 PM by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="erguder.levent._21.spring_hibernate._02.Employee" table="EMPLOYEE"> <id name="id" type="int"> <column name="ID" /> <generator class="assigned" /> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <property name="surname" type="java.lang.String"> <column name="SURNAME" /> </property> <property name="salary" type="int"> <column name="SALARY" /> </property> </class> </hibernate-mapping>
DAO interface yapimizi tanimlayalim ;
EmployeeDao.java
public interface EmployeeDao { void hire(Employee emp); void updateInfo(Employee emp); void discharge(Employee emp); Employee findByName(String name); }
Arabirimimiz uygulayalim ;
EmployeeDaoImpl sinifimizda EmployeeDao arabimini uygulayacagiz ve HibernateDaoSupport sinifindan kalitacagiz.
EmployeeDaoIm.java
package erguder.levent._21.spring_hibernate._02; import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; public class EmployeeDaoImpl extends HibernateDaoSupport implements EmployeeDao { @Override public void hire(Employee emp) { getHibernateTemplate().save(emp); } @Override public void updateInfo(Employee emp) { getHibernateTemplate().update(emp); } @Override public void discharge(Employee emp) { getHibernateTemplate().delete(emp); } @Override public Employee findByName(String name) { List list = getHibernateTemplate().find("from Employee where name=?", name); return (Employee) list.get(0); } }
Burada dikkat edersek getHibernate() metodunu cagirdiktan sonra zincirleme olarak save, update, delete ve find metotlarini cagiriyoruz.
HibernateDaoSupport sinifini inceledigimizde , getHibernateTemplate metodunun HibernateTemplate turunden bir referans degiskeni dondurdugunu gorebiliriz.
public final HibernateTemplate getHibernateTemplate() { return this.hibernateTemplate; }
xml konfigurasyon dosyamizi inceleyelim ;
tutorial_21.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd "> <!-- Veritabani Konfigurasyonu --> <bean id="dataSourceId" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value ="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/> <property name="username" value="springhibernate"/> <property name="password" value="springhibernate"/> </bean> <bean id="empDaoId" class="erguder.levent._21.spring_hibernate._02.EmployeeDaoImpl"> <property name="sessionFactory" ref="hibernateSessionFactory" /> </bean> <bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSourceId" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> <prop key="hibernate.hbm2ddl.auto">create</prop> </props> </property> <property name="mappingResources"> <list> <value>/erguder/levent/_21/spring_hibernate/_02/Employee.hbm.xml </value> </list> </property> </bean> </beans>
Bir onceki ornekte kullandigimiz xml konfigurasyon yapimizi burada da kullaniyoruz. Burada bir onceki ornekten farkli olarak SessionFactory olusturmak icin, AnnotationSessionFactoryBean yerine LocalSessionFactoryBean kullandik.
AnnotationSessionFactoryBean sinifi LocalSessionFactoryBean nin alt sinifidir. AnnotationSessionFactoryBean sinifi hem xml konfigurasyonuna hem annotation konfigurasyonuna izin verir.
Bu ornegimizde Employee sinifimizin , entity tanimlamasini xml ile yaptigimiz icin (Employee.hbm.xml) aslinda iki sinifi da kullanabiliriz.
Emloyee.hbm.xml dosyamizi ise Spring e mappingResource ozelligini/property kullanarak tanitiyoruz ve dosyamizin bulundugu dizini veriyoruz.
<property name="mappingResources"> <list> <value>/erguder/levent/_21/spring_hibernate/_02/Employee.hbm.xml </value> </list> </property>
Diger konfigurasyonlar ile ilgili bilgiler bir onceki yazida verilmisti.
SpringHibernateTest.java
package erguder.levent._21.spring_hibernate._02; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringHibernateTest { public static void main(String[] args) { ApplicationContext appContext = new ClassPathXmlApplicationContext("tutorial_21.xml"); EmployeeDao empDao = (EmployeeDao) appContext.getBean("empDaoId"); // insert record // kayit ekleyelim Employee emp = new Employee(); emp.setId(1); emp.setName("Levent"); emp.setSurname("Erguder"); emp.setSalary(10000); empDao.hire(emp); Employee emp2 = new Employee(); emp2.setId(2); emp2.setName("Burak"); emp2.setSurname("Okumus"); emp2.setSalary(20000); empDao.hire(emp2); // select // kaydi sorgulayalim Employee emp3 = empDao.findByName("Levent"); System.out.println(emp3); // update // guncelleme islemi yapalim emp3.setSalary(15000); empDao.updateInfo(emp3); System.out.println(emp3); // delete // silme islemi yapalim empDao.discharge(emp3); } }
Test sinifimizi inceleyecek olursak ;
2 tane Employee sinifindan referans degisken olusturyoruz ve gerekli deger atamalarini yapiyoruz.
hire metodunu yeni kayit eklemek icin kullaniyorduk.
findByName metoduna Levent argumanini veriyoruz ve sorgulama islemini gerceklestiriyoruz.
setSalary metodu guncelleme islemi yapmaktadir. Burada maas bilgisini guncelliyoruz.
discharge metodunda kayit silme islemini gerceklestiriyoruz.
Ornegimizi calistirip sonuclari inceleyelim fakat ilk olarak update ve delete islemini yorum satiri haline getirelim ve adim adim inceleyelim.
Veritabanimizi inceledigimizde kayitlarin basariyla eklendigini goruyoruz ;
Cikti olarak da ismi Levent olan kaydin bilgisini getirdigimiz icin ;
Employee [id=1, name=Levent, surname=Erguder, salary=10000]
update islemini yapmak icin ilgili yorum satirini kaldiralim ve tekrar calistiralim;
update islemi gerceklesti ve update islemi sonrasi ekrana ikinci bir cikti daha yazdirdigimiz icin
Employee [id=1, name=Levent, surname=Erguder, salary=10000]
Employee [id=1, name=Levent, surname=Erguder, salary=15000]
silme islemini gerceklestirmek icin yorum satirini kaldiralim ve tekrar calistiralim ;
Employee [id=1, name=Levent, surname=Erguder, salary=10000]
Employee [id=1, name=Levent, surname=Erguder, salary=15000]
Sonuc olarak once 2 adet kayit eklendi , sonra guncelleme gerceklesti, sonrasinda ise ilgili kayit silindi.
Maven Project :SpringProject_v21
Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
injavawetrust
Leave a Reply