Saturday, May 12, 2012

Hibernate With Spring DAO

In this tutorial you will see how to integrate spring DAO and hibernate. I assume you are comfortable with both spring and hibernate. At the end of this example you will learn  how to use Spring DAO . Here I am using MyEcplise IDE and Oracle 10g Database.
****************************************************************
CREATE TABLE  "CONTACTS" 
   ( "ID" NUMBER(22,0) NOT NULL ENABLE, 
 "FIRSTNAME" VARCHAR2(4000 CHAR), 
 "LASTNAME" VARCHAR2(4000 CHAR), 
 "CELL_NO" VARCHAR2(4000 CHAR), 
 "EMAIL_ID" VARCHAR2(4000 CHAR), 
 "WEBSITE" VARCHAR2(4000 CHAR), 
 "BIRTHDATE" TIMESTAMP (6), 
 "CREATED" VARCHAR2(255 CHAR), 
  PRIMARY KEY ("ID") ENABLE
   )
/
*****************************************************************
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
 <property name="dialect">
  org.hibernate.dialect.Oracle10gDialect
 </property>
 <property name="connection.url">
  jdbc:oracle:thin:@localhost:1521:xe
 </property>
 <property name="connection.username">venkat</property>
 <property name="connection.password">venkat</property>
 <property name="connection.driver_class">
  oracle.jdbc.driver.OracleDriver
 </property>
 <property name="myeclipse.connection.profile">Spring_JDBC</property>
 <mapping resource="com/venkat/hibernate/Contacts.hbm.xml" />
</session-factory>

</hibernate-configuration>
*********************************************************************************
<?xml version="1.0" encoding="UTF-8"?>
<beans
 xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:p="http://www.springframework.org/schema/p"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">


 <bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="configLocation"
   value="file:src/hibernate.cfg.xml">
  </property>
 </bean>
 <bean id="ContactsDAO" class="com.venkat.hibernate.ContactsDAO">
  <property name="sessionFactory">
   <ref bean="sessionFactory" />
  </property>
 </bean></beans>
*******************************************************************************
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.venkat.hibernate.Contacts" table="CONTACTS" schema="VENKAT">
        <id name="id" type="java.math.BigDecimal">
            <column name="ID" precision="22" scale="0" />
            <generator class="assigned" />
        </id>
        <property name="firstname" type="java.lang.String">
            <column name="FIRSTNAME" length="4000" />
        </property>
        <property name="lastname" type="java.lang.String">
            <column name="LASTNAME" length="4000" />
        </property>
        <property name="cellNo" type="java.lang.String">
            <column name="CELL_NO" length="4000" />
        </property>
        <property name="emailId" type="java.lang.String">
            <column name="EMAIL_ID" length="4000" />
        </property>
        <property name="website" type="java.lang.String">
            <column name="WEBSITE" length="4000" />
        </property>
        <property name="birthdate" type="java.util.Date">
            <column name="BIRTHDATE" length="7" />
        </property>
        <property name="created" type="java.lang.String">
            <column name="CREATED" />
        </property>
    </class>
</hibernate-mapping>
*************************************************************************
package com.venkat.hibernate; import java.math.BigDecimal; import java.util.Iterator; import java.util.List; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestSpringDAO { /** * @param args */ public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); ContactsDAO dao= context.getBean("ContactsDAO",ContactsDAO.class); Contacts contact=new Contacts(new BigDecimal(234)); dao.save(contact); List<Contacts> list=dao.findAll(); System.out.println("contacts Size "+list.size()); for (Iterator iterator = list.iterator(); iterator.hasNext();) { Contacts contacts = (Contacts) iterator.next(); System.out.println("contact ID is "+contacts.getId()); } } }
******************************************************************************
package com.venkat.hibernate; import java.util.List; import org.hibernate.LockMode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; /** * A data access object (DAO) providing persistence and search support for * Contacts entities. Transaction control of the save(), update() and delete() * operations can directly support Spring container-managed transactions or they * can be augmented to handle user-managed Spring transactions. Each of these * methods provides additional information for how to configure it for the * desired type of transaction control. * * @see com.venkat.hibernate.Contacts * @author Venkat */ public class ContactsDAO extends HibernateDaoSupport { private static final Logger log = LoggerFactory .getLogger(ContactsDAO.class); protected void initDao() { // do nothing } public void save(Contacts transientInstance) { log.debug("saving Contacts instance"); try { getHibernateTemplate().save(transientInstance); log.debug("save successful"); } catch (RuntimeException re) { log.error("save failed", re); throw re; } } public void delete(Contacts persistentInstance) { log.debug("deleting Contacts instance"); try { getHibernateTemplate().delete(persistentInstance); log.debug("delete successful"); } catch (RuntimeException re) { log.error("delete failed", re); throw re; } } public Contacts findById(java.math.BigDecimal id) { log.debug("getting Contacts instance with id: " + id); try { Contacts instance = (Contacts) getHibernateTemplate().get( "com.venkat.hibernate.Contacts", id); return instance; } catch (RuntimeException re) { log.error("get failed", re); throw re; } } public List findByExample(Contacts instance) { log.debug("finding Contacts instance by example"); try { List results = getHibernateTemplate().findByExample(instance); log.debug("find by example successful, result size: " + results.size()); return results; } catch (RuntimeException re) { log.error("find by example failed", re); throw re; } } public List findByProperty(String propertyName, Object value) { log.debug("finding Contacts instance with property: " + propertyName + ", value: " + value); try { String queryString = "from Contacts as model where model." + propertyName + "= ?"; return getHibernateTemplate().find(queryString, value); } catch (RuntimeException re) { log.error("find by property name failed", re); throw re; } } public List<Contacts> findAll() { log.debug("finding all Contacts instances"); try { String queryString = "from Contacts"; return getHibernateTemplate().find(queryString); } catch (RuntimeException re) { log.error("find all failed", re); throw re; } } public Contacts merge(Contacts detachedInstance) { log.debug("merging Contacts instance"); try { Contacts result = (Contacts) getHibernateTemplate().merge( detachedInstance); log.debug("merge successful"); return result; } catch (RuntimeException re) { log.error("merge failed", re); throw re; } } public void attachDirty(Contacts instance) { log.debug("attaching dirty Contacts instance"); try { getHibernateTemplate().saveOrUpdate(instance); log.debug("attach successful"); } catch (RuntimeException re) { log.error("attach failed", re); throw re; } } public void attachClean(Contacts instance) { log.debug("attaching clean Contacts instance"); try { getHibernateTemplate().lock(instance, LockMode.NONE); log.debug("attach successful"); } catch (RuntimeException re) { log.error("attach failed", re); throw re; } } public static ContactsDAO getFromApplicationContext(ApplicationContext ctx) { return (ContactsDAO) ctx.getBean("ContactsDAO"); } }
********************************************************************************
package com.venkat.hibernate; import java.math.BigDecimal; import java.util.Date; /** * Contacts entity. @author MyEclipse Persistence Tools */ public class Contacts implements java.io.Serializable { // Fields private BigDecimal id; private String firstname; private String lastname; private String cellNo; private String emailId; private String website; private Date birthdate; private String created; // Constructors /** default constructor */ public Contacts() { } /** minimal constructor */ public Contacts(BigDecimal id) { this.id = id; } /** full constructor */ public Contacts(BigDecimal id, String firstname, String lastname, String cellNo, String emailId, String website, Date birthdate, String created) { this.id = id; this.firstname = firstname; this.lastname = lastname; this.cellNo = cellNo; this.emailId = emailId; this.website = website; this.birthdate = birthdate; this.created = created; } // Property accessors public BigDecimal getId() { return this.id; } public void setId(BigDecimal id) { this.id = id; } public String getFirstname() { return this.firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } public String getLastname() { return this.lastname; } public void setLastname(String lastname) { this.lastname = lastname; } public String getCellNo() { return this.cellNo; } public void setCellNo(String cellNo) { this.cellNo = cellNo; } public String getEmailId() { return this.emailId; } public void setEmailId(String emailId) { this.emailId = emailId; } public String getWebsite() { return this.website; } public void setWebsite(String website) { this.website = website; } public Date getBirthdate() { return this.birthdate; } public void setBirthdate(Date birthdate) { this.birthdate = birthdate; } public String getCreated() { return this.created; } public void setCreated(String created) { this.created = created; } }

Spring DAO

We'll wrap up discussion on the Spring JDBC support by using the DAO support classes that Spring provides out of the box. We'll see how this makes our DAO classes cleaner than ever.

org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport
Extension of JdbcDaoSupport that exposes a SimpleJdbcTemplate as well. Only usable on Java 5 and above. 


*************************************************************
package com.venkat;


import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


import com.venkat.dao.CricketDAO;


public class TestCricket {


public static void main(String[] args) {


ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
CricketDAO dao= context.getBean("cricketDao",CricketDAO.class);
System.out.println(dao.getCricketCount());
}


}
*****************************************************************
package com.venkat.dao;

import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;

public class CricketDAO extends SimpleJdbcDaoSupport{
public int getCricketCount()
{
String sql="select count(*) from CRICKET";
return this.getJdbcTemplate().queryForInt(sql);
}

}
****************************************************************
package com.venkat.model;

public class Cricket {
private int id;
private String playername;
private int runs;
private int rank;
public Cricket(int id, String playername, int runs, int rank) {
super();
this.id = id;
this.playername = playername;
this.runs = runs;
this.rank = rank;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPlayername() {
return playername;
}
public void setPlayername(String playername) {
this.playername = playername;
}
public int getRuns() {
return runs;
}
public void setRuns(int runs) {
this.runs = runs;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}

}
*****************************************************************<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<bean id="cricketDao" class="com.venkat.dao.CricketDAO">
<property name="dataSource" ref="dataSource"/>
</bean>


<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver">
</property>
<property name="url"
value="jdbc:oracle:thin:@localhost:1521:xe">
</property>
<property name="username" value="venkat"></property>
<property name="password" value="venkat"></property>
</bean></beans>
***************************************************************
CREATE TABLE  "CRICKET" 
   ( "ID" NUMBER, 
 "PLAYERNAME" VARCHAR2(4000), 
 "RUNS" NUMBER, 
 "RANK" NUMBER, 
  CONSTRAINT "CRICKET_PK" PRIMARY KEY ("ID") ENABLE
   )
/