自己动手写代码,整合Spring和Hibernate(三)之DAOSupport和DAOTemplate
2014-04-20 15:01
323 查看
在《自己动手写代码,整合Spring和Hibernate》系列博文的前两篇中,我们需要为每个DAO类定义一个SessionFactory,需要在DAO的每个方法中获取Session、关闭Session。我们可以写一个公用的DAO类,然后让其他DAO类继承它,实现代码复用。
公用DAO类(抽象类):
spring配置文件:
以上是使用继承达到了代码的复用,下面使用组合模式达到相同的目的。
公用DAO类(为了区别继承,另外命名,非抽象类):
注:每一个具体的DAO类,最终都需要注入一个sessionFactory。
公用DAO类(抽象类):
package com.zzj.dao; import java.io.Serializable; import org.hibernate.Session; import org.hibernate.SessionFactory; public abstract class DAOSupport { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } /** * 保存 * @param t * @return */ protected Serializable save(Object t){ Session session = sessionFactory.openSession(); session.beginTransaction(); Serializable id = session.save(t); session.getTransaction().commit(); session.close(); return id; } protected Object findByID(Class<?> clazz, Serializable id){ Session session = sessionFactory.openSession(); Object t = session.get(clazz, id); session.close(); return t; } }CustomerDAO类:
package com.zzj.dao; import com.zzj.entity.Customer; public class CustomerDAO extends DAOSupport{ /** * 查询 * @param ID * @return */ public Customer findByID(String ID){ return (Customer) findByID(Customer.class, ID); } /** * 保存 * @param customer * @return */ public String save(Customer customer){ return (String) super.save(customer); } }
spring配置文件:
<?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.xsd"> <!-- 配置数据源 --> <!-- <bean name="dataSource" class="com.zzj.base.MyDataSource"> <property name="url"> <value>jdbc:oracle:thin:@localhost:1521:orcl</value> </property> <property name="username"> <value>system</value> </property> <property name="password"> <value>1223</value> </property> <property name="driveClass"> <value>oracle.jdbc.driver.OracleDriver</value> </property> </bean> --> <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="JdbcUrl"> <value>jdbc:oracle:thin:@localhost:1521:orcl</value> </property> <property name="User"> <value>system</value> </property> <property name="Password"> <value>1223</value> </property> <property name="DriverClass"> <value>oracle.jdbc.driver.OracleDriver</value> </property> </bean> <!-- 配置sessionFactory对象 --> <bean name="sessionFactory" class="com.zzj.base.MySessionFactory"> <property name="dataSource" ref="dataSource"/> <property name="dialect"> <value>org.hibernate.dialect.Oracle9Dialect</value> </property> <property name="mappings"> <list> <value>com/zzj/entity/Customer.hbm.xml</value> </list> </property> </bean> <!-- 配置DAO --> <bean id="customerDAO" class="com.zzj.dao.CustomerDAO"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> </beans>
以上是使用继承达到了代码的复用,下面使用组合模式达到相同的目的。
公用DAO类(为了区别继承,另外命名,非抽象类):
package com.zzj.dao; import java.io.Serializable; import org.hibernate.Session; import org.hibernate.SessionFactory; public class DAOTemplate { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } /** * 保存 * @param t * @return */ protected Serializable save(Object t){ Session session = sessionFactory.openSession(); session.beginTransaction(); Serializable id = session.save(t); session.getTransaction().commit(); session.close(); return id; } protected Object findByID(Class<?> clazz, Serializable id){ Session session = sessionFactory.openSession(); Object t = session.get(clazz, id); session.close(); return t; } }CustomerDAO类:
package com.zzj.dao; import com.zzj.entity.Customer; public class CustomerDAO{ private DAOTemplate daoTemplate; public void setDaoTemplate(DAOTemplate daoTemplate) { this.daoTemplate = daoTemplate; } /** * 查询 * @param ID * @return */ public Customer findByID(String ID){ return (Customer) daoTemplate.findByID(Customer.class, ID); } /** * 保存 * @param customer * @return */ public String save(Customer customer){ return (String) daoTemplate.save(customer); } }Spring配置文件:
<?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.xsd"> <!-- 配置数据源 --> <!-- <bean name="dataSource" class="com.zzj.base.MyDataSource"> <property name="url"> <value>jdbc:oracle:thin:@localhost:1521:orcl</value> </property> <property name="username"> <value>system</value> </property> <property name="password"> <value>1223</value> </property> <property name="driveClass"> <value>oracle.jdbc.driver.OracleDriver</value> </property> </bean> --> <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="JdbcUrl"> <value>jdbc:oracle:thin:@localhost:1521:orcl</value> </property> <property name="User"> <value>system</value> </property> <property name="Password"> <value>1223</value> </property> <property name="DriverClass"> <value>oracle.jdbc.driver.OracleDriver</value> </property> </bean> <!-- 配置sessionFactory对象 --> <bean name="sessionFactory" class="com.zzj.base.MySessionFactory"> <property name="dataSource" ref="dataSource"/> <property name="dialect"> <value>org.hibernate.dialect.Oracle9Dialect</value> </property> <property name="mappings"> <list> <value>com/zzj/entity/Customer.hbm.xml</value> </list> </property> </bean> <!-- 配置DAOTemplate --> <bean name="daoTemplate" class="com.zzj.dao.DAOTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 配置DAO --> <bean id="customerDAO" class="com.zzj.dao.CustomerDAO"> <property name="daoTemplate" ref="daoTemplate"></property> </bean> </beans>上面两种方法中,推荐使用组合。 当然了,具体使用哪种方式,就看个人喜好了。
注:每一个具体的DAO类,最终都需要注入一个sessionFactory。
相关文章推荐
- 自己动手写代码,整合Spring和Hibernate(一)和FactoryBean的使用
- Spring整合Hibernate,不用HibernateDaoSupport与HibernateTemplate而用Hibernate自己的api分析说明
- 自己动手写代码,整合Spring和Hibernate(二)之配置数据源
- Spring整合Hibernate,不用HibernateDaoSupport与HibernateTemplate而用Hibernate自己的api分析说明
- spring3.2 hibernate3.6 整合中 超类的使用HibernateDaoSupport
- spring入门(12)-spring与hibernate整合完成增删改查的操作(继承HibernateDaoSupport调用hibernateTemplate类)
- Spring与Hibernate整合的HibernateDaoSupport应用中的“内存泄露”问题(学习心得)
- 继承HibernateDaoSupport实现DAO(spring整合hibernate)
- Spring 整合 Hibernate、声明式的事务管理、HibernateTemplate(HibernateDaoSupport)
- spring入门(12)-spring与hibernate整合完成增删改查的操作(继承HibernateDaoSupport调用hibernateTemplate类)
- 继承HibernateDaoSupport实现DAO(spring整合hibernate)
- Spring 整合HibernateDaoSupport(业务Dao继承CommonDaoImpl)
- Spring整合hibernate(3)之基于HibernateDaoSupport的整合
- Spring与Hibernate整合的HibernateDaoSupport应用中的“内存泄露”问题(学习心得)
- hibernate4 和 spring3 整合注意事项:HibernateDaoSupport没有了找到篇好文章,我之前遇到的问题都在这都能找到。其实出现这些问题的关键就是hibernate4和hib
- spring与hibernate整合之:继承HibernateDAOSupport方式+理解xml与AutoWired、Resource的区别
- spring与hibernate整合之HibernateDAOSupport
- spring与hibernate整合之:继承HibernateDAOSupport方式+理解xml与AutoWired、Resource的区别
- Spring学习_07_Spring整合Hibernate(HibernateTemplate,HibernateDaoSupport)
- SSH整合,"sessionFactory " or "hibernateTemplate " is required異常 继承HibernateDaoSupport