Spring在数据访问方面提供了模板化和Dao支持类的提供,方便操作数据库。

一、Spring JDBC  (详细配置:)

1、配置数据源 DataSource

不管选择哪一种Spring Dao的支持方式,你都需要配置一个数据源的引用。配置方式有三种:

①、使用JNDI查找数据源:

②、使用数据源连接池:(dbcp c3p0 druid)

<!-- 配置数据源 -->
     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
      <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
      <property name="url" value="jdbc:mysql://localhost:3306/myjob"></property>  
      <property name="username" value="root"></property>  
      <property name="password" value="root"></property>  
      <property name="initialSize" value="5"></property>
      <property name="maxActive" value="10"></property>
     </bean>

③、使用JDBC驱动程序定义的数据源:

DriverManagerDataSource:每次请求时都会返回一个新建的链接。

SingleConnectionDataSource:在每个连接请求时都会返回同一个连接。

2、使用JDBC模板

你可以选择使用JDBC模板或Dao支持类,比较推荐Dao支持类

①、JdbcTemplate 提供最简单的数据访问功能

②、NamedParameterJdbcTemplate:通过该模板,可以把参数作为查询的条件传入方法中。

③、SimpleJdbcTemplate:(一般都使用这种)结合了一些自动装箱的功能,整合了NamedParameterJdbcTemplate

如何配置JdbcTemplate:

第一种方式:在Spring的Ioc容器里配置一个JdbcTemplate的bean,将DataSource注入进来,然后再把JdbcTemplate注入到Dao中。

第二种方式:我们可以在自己定义的Dao实现类中注入一个DataSource引用来完成JdbcTemplate的实例化。也就是从外部注入DataSource到Dao中,然后自己实例化JdbcTemplate,然后将DataSource设置到JdbcTemplate对象中。

3、使用Dao支持类:

①、JdbcDaoSupport

②、NamedParameterJdbcDaoSuport

③、SimpleJdbcDaoSupport

Dao支持类的配置方式:

Spring提供的JdbcDaoSupport类(NamedParameterJdbcDaoSupport、SimpleJdbcDaoSupport同理),这个类中定义了JdbcTemplate属性,也定义了DataSource属性,当设置DataSource属性的时候,会创建jdbcTemplate实例,所以我们自己编写的Dao类只要继承JdbcDaoSupport类,然后注入DataSource即可。

 

一个完整的配置方式:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
     <!-- bean实体类配置 -->
     <bean id="SysCustomer" class="com.edu.bean.SysCustomer"></bean>
     <!-- dao类配置 -->
          <!-- 使用第一种配置Jdbctemplate方式 -->
     <bean id="sysCustomerDao" class="com.edu.dao.impl.SysCustomerDaoImpl">
      <property name="jdbcTemplate" ref="jdbcTemplate"></property>
     </bean>
           <!-- jdbcDaoSupport配置方式 -->
     <bean id="sysUserDao" class="com.edu.dao.impl.SysUserDaoImpl">
      <property name="dataSource" ref="dataSource"></property>
     </bean>
     <!-- service配置 -->
     <bean id="sysCustomerService" class="com.edu.service.SysCustomerService">
      <property name="sysCustomerDao" ref="sysCustomerDao"></property>
     </bean>
     <bean id="sysUserService" class="com.edu.service.SysUserService">
      <property name="sysUserDao" ref="sysUserDao"></property>
     </bean>
     
     <!-- 配置数据源 -->
     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
      <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
      <property name="url" value="jdbc:mysql://localhost:3306/myjob"></property>  
  <property name="username" value="root"></property>  
  <property name="password" value="root"></property>  
      <property name="initialSize" value="5"></property>
      <property name="maxActive" value="10"></property>
     </bean>
     <!-- jdbcTemplate -->
     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
      <property name="dataSource" ref="dataSource"></property>
     </bean>
    
</beans>

二、Spring Hibernate整合

 Spring对Hibernate配置文件hibernate.cfg.xml的集成相当好,可以在Spring中配置Hibernate的SessionFacotry从而取代Hibernate的Hibernate.cfg.xml文件和HibernateSessionFactory.java

Spring在集成Hibernate时又分为两种形式:(集成后就不需要Hibernate.cfg.xml文件了)

1、继续使用Hibernate的映射文件*.hbm.xml

2、使用JPA注解形式的pojo对象,而去掉Hibernate的映射文件*.hbm.xml文件

<1>、继续使用Hibernate的映射文件*.hbm.xml文件

Spring集成Hibernate时去掉了Hibernate.cfg.xml文件,此时如果还想继续使用Hibernate的映射文件*.hbm.xml的话,在配置Hibernate的SessionFactory时就要配置以何种方式寻找Hibernate的映射文件*.hbm.xml。

此时Spring配置SessionFactory的class应为org.springframework.orm.hibernate4.LocalSessionFactoryBean (看你使用的Hibernate版本)

org.springframework.orm.hibernate4.LocalSessionFactoryBean这个类里有好几个属性用来查找Hibernate的映射文件:mappingResources、mappingLocations、mappingDirectoryLocation与mappingJarLocations

他们的区别:

①、mappingResources:指定classpath下具体的映射文件名

<property name="mappingResources">    
    <value>petclinic.hbm.xml </value>    </property>

 ②、mappingLocations:可以指定任何文件路径,并且可以指定前缀:classpath、file等

<property name="mappingLocations">    
    <value>/WEB-INF/petclinic.hbm.xml </value>    </property>    <property name="mappingLocations">    
    <value>classpath:/com/company/domain/petclinic.hbm.xml </value>    </property>

 也可以用通配符指定,"*"指定一个文件(路径)名,"**"指定多个文件(路径)名

<property name="mappingLocations">    
    <value>classpath:/com/company/domainmaps/*.hbm.xml </value>    </property>

上面的配置是在com/company/domain包下任何maps路径下的hbm.xml文件都被加载为映射文件 

③、通过mappingDirectoryLocations:指定映射的文件路径

<property name="mappingDirectoryLocations">   <list>    
    <value>WEB-INF/HibernateMappings</value>    
  </list>    </property>
<property name="mappingDirectoryLocations">   <list>    
    <value>WEB-INF/HibernateMappings</value>    
  </list>    </property>

 也可以通过classpath来指出  

<property name="mappingDirectoryLocations">    
  <list>    
  <value>classpath:/XXX/package/</value>    
  </list>    </property>
<property name="mappingDirectoryLocations">    
  <list>    
  <value>classpath:/XXX/package/</value>    
  </list>    </property>

④、 mappingJarLocations:指定加载的映射文件在jar文件中 

<二>、去掉Hibernate的*.hbm.xml文件,可以使用jpa注解形式的pojo对象,而去掉*.hbm.xml的Hibernate映射文件时配置方法

Spring集成Hibernate时去掉了Hibernate.cfg.xml,此时如果使用jpa注解形式的pojo对象,而去掉Hibernate的映射文件*.hbm.xml的话,在配置Hibernate的SessionFactory时就要配置以何种方式寻找jpa注解形式的pojo映射对象

此时spring中配置SessionFactory bean时它对应的class应为org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean

例如:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" /><!-- 引用数据源 -->
        <property name="packagesToScan">
            <list>
                <value>com.cn.nos.services.pojo*</value><!-- 加载hibernate的jpa注解形式的实体类 -->
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <!--<prop key="hibernate.current_session_context_class">thread</prop>-->
            </props>
        </property>
    </bean>

AnnotationSessionFactoryBean中查找jpa注解形式的pojo映射对象的属性有:annotatedClasses、packagesToScan

① annotatedClasses:指定classpath下指定的注解映射实体类的类名

<property name="annotatedClasses">
     <list>
       <value>com.test.ObjectBean</value><!-- 可以在这个list中配置多个 -->
     </list></property>

 

② packagesToScan指定映射文件的包名

<property name="packagesToScan">
    <list>
       <value>com.cn.nos.services.pojo*</value><!-- 加载hibernate的jpa注解形式的实体类 -->
    </list></property>