配置文件:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:db.properties</value>
</property>
</bean>
<!-- 配置 C3P0 数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>
DAO类:
public class Test {
@Resource(name = "dataSource")
private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public void insert(){
//获得Connection对象
Connection conn = dataSource.getConnection();
//使用connection执行sql
.....
}
配置文件不变:
DAO类:
public void insert(){
//获得Connection对象
JdbcTemplate template = new JdbcTemplate(dataSource);
//template执行hql
.....
}
配置文件:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:db.properties</value>
</property>
</bean>
<!-- 配置 C3P0 数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>
<bean id="test" class="Test">
<property name="dataSource" ref="dataSource"></property>
</bean>
public class Test extends JdbcDaoSupport {
//JdbcDaoSupport类已经有了public final void setDataSource(DataSource dataSource)了
//不用重写也不能重写
public void insert(User u) {
this.getJdbcTemplate()//执行hql
}
在开发由于一些限制并不能使得DAO类直接继承JdbcDaoSupport(使用了DAO设计模式)所以一般我在开发中把模板类直接声明在IOC容器中,然后在DAO中注入。
配置文件
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JDBCTemplate">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
DAO中
public void Test{
@Resource(name = "jdbcTemplate")
private JdbcTemplate jdbcTemplate;
public void insert(){
this.jdbcTemplate.xxx; //执行hql语句
}
}
如上的实例的针对JDBC的,对于Hibernate与其很相似。Spring提供了HibernateTemplate与HibernateDaoSupport供我们使用。
HibernateTemplate提供了持久层范围模板化,它只需要获得一个SessionFactory,就可以执行持久化操作。SessionFactory即可以通过构造方法传入,也可以使用setter注入。
HibernateTemplate有个比较特殊的构造方法HibernateTemplate (SessionFactory sessionFactory , boolean allowCreate)。allowCreate参数表明,如果当前线程没有找到一个事务性的Session,是否需要创建一个非事物性的Session。
HibernateTemplate提供了大部分操作DAO对象的方法,此处不再写出,感兴趣的可以自行查找资料。
Spring同时为实现DAO组件提供了工具基类:HibernateDaoSupport。该类主要提供如下两个方法来简化DAO的实现。
- public final HibernateTemplate getHibernateTemplate();
- public final void setSessionFactory(SessionFactory sessionFactory);
该方法可以接受SessionFactory的注入,也可以返回一个HibernateTemplate对象。一但获取了HibernateTemplate,就可以调用其封装的操作DAO对象的方法。
实例代码:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:Hibernate/hibernate.cfg.xml</value>
</property>
</bean>
<!-- 由于bean由注解来完成,所以不能通过在dao中使用继承HibernateDaoSupport然后property来注入HibernateTemplate.所以手动在dao中注入hibernateTemplate-->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
或者
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:Hibernate/db.properties</value>
</property>
</bean>
<!-- 配置 C3P0 数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>
<!-- spring来管理sessionFactory 由于要注入dataSource而Hibernate提供的并没有setDataSource()方法,故spring提供了一个LocalSessionFactoryBean类 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<!-- 导入映射文件所在的路径 -->
<property name="mappingDirectoryLocations">
<list>
<value>classpath:domain <!--加载这个路径下的所有.hbm.xml-->
</value>
</list>
</property>
<!-- Hibernate其他配置 方言 等-->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
如上的配置中即在spring容器中声明了一个HibernateTemplate。在DAO组件中注入即可使用。
其实,Spring并不推荐使用HibernateTemplate或HibernateDaoSupport来实现DAO组件,而是推荐使用SessionFactory的getCurrentSession()来获取Session然后进行持久化操作。