Spring 使用原生的jdbc或整合ORM操作数据库的模板编程

一.Spring与jdbc

1.直接使用DataSource

配置文件:

<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
         .....
      }

2.使用JdbcTemplate

配置文件不变:
DAO类:

    public void insert(){
           //获得Connection对象
        JdbcTemplate template = new JdbcTemplate(dataSource);  
           //template执行hql
         .....
      }

3、JdbcDaoSupport

配置文件:

<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语句
    }
}

Spring与hibernate

如上的实例的针对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然后进行持久化操作。

Spring 使用原生的jdbc或整合ORM操作数据库的模板编程_第1张图片

你可能感兴趣的:(spring,数据库,Hibernate)