Spring 訪問數據庫的三個方法(1)

Spring提供訪問數據庫的有三種方式: HibernateDaoSupport,HibernateTemplate(推薦使用),jdbcTemplatejava

前提:mysql

Spring若是想整合hibernate的話,首先就應該得到SessionFactory這個類,而後再經過得到session就能夠進行訪問數據庫了,即Spring提供的類HibernateDaoSupport,HibernateTemplate應該是有setSessionFactory,在使用的時候注入一下就能夠了spring

<bean id="sessionFactory"
	class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
	<property name="dataSource" ref="dataSource"></property>
	<property name="annotatedClasses">
		<list>
			<value>com.zcy.model.User</value>
			<value>com.zcy.model.Log</value>
		</list>
	</property>
	<property name="hibernateProperties">
		<props>
			<prop key="hibernate.dialect">
				org.hibernate.dialect.OracleDialect
			</prop>
			<prop key="hibernate.hbm2ddl.auto">update</prop>
			<prop key="hibernate.show_sql">
				true
			</prop>
		</props>
	</property>
</bean>

1.對於HibernateTemplate:sql

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
  <property name="sessionFactory" ref="sessionFactory"></property>
</bean>

而後在程序中直接用就能夠了,以下:數據庫

@Component("u")
public class UserDaoImpl_HibernateTemplate implements UserDao {
  private HibernateTemplate  hibernateTemplate;
 
  @Resource
  public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
    this.hibernateTemplate = hibernateTemplate;
  }
 

  public void save(User user) {
    hibernateTemplate.save(user);
  }
}

2.對於HibernateDaoSupport:session

public final void setSessionFactory(SessionFactory sessionFactory)

public final SessionFactory getSessionFactory()

public final void setHibernateTemplate(HibernateTemplate hibernateTemplate)

public final HibernateTemplate getHibernateTemplate()

從它類裏的方法能夠知道,在使用的時候只須要將sessionFactory注入給HibernateDaoSupport,而後就能夠經過getHibernateTemplate()來得到HibernateTemplate,這樣就可使用HibernateTemplate了,就和上面使用HibernateTemplate的同樣的(顯然這有點繞了一點彎,我的感受仍是直接使用HibernateTemplate就能夠了,不過根據我的喜愛或項目的需求而定)this

下面是實現設計的方法:spa

service:

public class UserService {
 private UserDao userDao;
 
public void setUserDao(UserDao userDao) {
  this.userDao = userDao;
}
   
public void add(User user){
    userDao.save(user);
}
dao:

public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
  public void save(User user) {
    this.getHibernateTemplate().save(user);
  }
}
bean.xml:

<bean id="userService" class="com.zcy.service.UserService">
  <property name="userDao" ref="userDao"></property>
</bean>


<bean id="userDao" class="com.zcy.dao.impl.UserDaoImpl">
  <property name="sessionFactory" ref="sessionFactory"></property>
</bean>

這裏的sessionFacotry注入不是給類UserDaoImpl 的,而是給繼承HibernateDaoSupport類的sessionFactory,使用HibernateDaoSupport好處就是咱們再也不須要關心關閉、是否鏈接成功等問題(在使用spring封裝的這些類,即HibernateDaoSupport,HibernateTemplate,jdbcTemplate,都不須要關心是否關閉,是否鏈接的問題,由於spring已這些操做封裝給注入好了),這樣用起來很方便。.net

可是這個很差就是Java只支持單繼承,因此惟一的繼承給了HibernateDaoSupport有點惋惜。另外注意的是由於HibernateDaoSupport已經有setSessionFactory(SessionFactory sessionFactory)這個方法了,因此在UserDaoImpl 的類裏就不須要寫了,而且HibernateDaoSupport的setSessionFactory的方法時final的,因此重寫還會報錯的。hibernate

對於jdbcTemplate之後再作整理吧。

相關文章
相關標籤/搜索