在Spring和Hibernate整合的项目中,通常会使用Spring提供的HibernateTemplate来对数据库进行增删改查操作,原理LZ就不做解释,本文只讲解配置。
首先,applicationContext.xml 中添加dataSource与sessionFactory两个bean:
<context:property-placeholder location="/WEB-INF/jdbc.properties" />
<!-- 定义数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 定义SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle10gDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingDirectoryLocations">
<list>
<value>classpath*:com/williamwu/cms/model/</value>
</list>
</property>
</bean>
1. 先讲讲对HibernateTemplate的封装
@SuppressWarnings("unchecked")
public abstract class CommonDao extends HibernateDaoSupport implements ICommonDao{
// 自动注入sessionFactory
@Autowired
public void initSessionFactory(SessionFactory sessionFactory){
super.setSessionFactory(sessionFactory);
}
// 自定义查询方法
public List find(String hql){
// 使用hibernateTemplate提供的api查询
return this.getHibernateTemplate().find(hql);
}
}
到此为止,HibernateTemplate封装已经配置完成,可以直接调用this.getHibernateTemplate()的api进行数据库操作了。
还有一点,大家需要注意的是
@Autowired
public void initSessionFactory(SessionFactory sessionFactory){
super.setSessionFactory(sessionFactory);
}
注入sessionFactory的方法不能是setSessionFactory(SessionFactory sessionFactory),这是因为HibernateDaoSupport中存在final类型的方法:
public abstract class HibernateDaoSupport extends DaoSupport {
private HibernateTemplate hibernateTemplate;
/**
* Set the Hibernate SessionFactory to be used by this DAO.
* Will automatically create a HibernateTemplate for the given SessionFactory.
* @see #createHibernateTemplate
* @see #setHibernateTemplate
*/
public final void setSessionFactory(SessionFactory sessionFactory) {
if (this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) {
this.hibernateTemplate = createHibernateTemplate(sessionFactory);
}
}
final类型的方法不能被子类覆盖。
2. 整合JdbcTemplate。
编写Dao类:
public class PermissionDao extends JdbcDaoSupport{
@Autowired
@Qualifier("dataSource")
public void setSource(DataSource dataSource)
{
super.setDataSource(dataSource);
}
public int checkPermission()
{
String sql = "";
return this.getJdbcTemplate().queryForInt(sql);
}
}
我们只需注入dataSource既可。