Just a little smile ^ ^

yoyo_zeng

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 spring把数据访问过程中固定与变化的部分明确地划为两类:模板和回调

spring提供了各种数据访问模板,分别适用于不同的持久机制,jdbc,hibernate等,使用数据访问模板只需要把它配置为spring context里的bean

 

配置数据源

方法1: JNDI

Java Naming and Directory Interfaces,通过名称获取数据源

从jndi中获取数据源

 <jee:jndi-lookup id="dataSource"
            jndi-name="/jdbc/SpitterDS" //制定jndi里的数据源名称
            resource-ref="true" />

 resource-ref:为true时,jnidi-name会被添加java:comp/env/,从应用程序服务器的JNDI目录里获取数据源。

2. 数据源连接池

如果无法从jndi获得数据源,可以使用数据源连接池,spring没有提供数据源连接池。DBCP有提供。

我们只需要配置 BasicDataSource bean

<bean id="dataSource"
      class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
  <property name="url"
            value="jdbc:hsqldb:hsql://localhost/spitter/spitter" />
  <property name="username" value="sa" />
  <property name="password" value="" />
  <property name="initialSize" value="5" />
  <property name="maxActive" value="10" />
</bean>

3. 基于JDBC驱动的数据源

两种数据源

DriverManagerDataSource—每个连接请求都建立一个连接,没有进行池管理

SingleConnectionDataSource—每次请求返回同一个连接,可以看作只有一个连接的池。不适合多线程

<bean id="dataSource"
              class="org.springframework.jdbc.datasource.
                 DriverManagerDataSource">
          <property name="driverClassName"
                    value="org.hsqldb.jdbcDriver" />
          <property name="url"
                    value="jdbc:hsqldb:hsql://localhost/spitter/spitter" />
          <property name="username" value="sa" />
          <property name="password" value="" />
        </bean>

 

使用传统的jdbc代码,直接连接,使用sql插入和查询,代码重复。

使用jdbc模板

三种模板

  • JdbcTemplate—The most basic of Spring’s JDBC templates, this class provides simple access to a database through JDBC and simple indexed-parameter queries.

  • NamedParameterJdbcTemplate—This JDBC template class enables you to per- form queries where values are bound to named parameters in SQL, rather than indexed parameters

  • SimpleJdbcTemplate—This version of the JDBC template takes advantage of

    Java 5 features such as autoboxing, generics, and variable parameter lists to sim- plify how a JDBC template is used. 

    配置template

    <bean id="jdbcTemplate"
          class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
       <constructor-arg ref="dataSource" />
    </bean>

    将template装配到dao

    public class JdbcSpitterDAO implements SpitterDAO {
    ...
      private SimpleJdbcTemplate jdbcTemplate;
      public void setJdbcTemplate(SimpleJdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
      }
    public void addSpitter(Spitter spitter) {
      jdbcTemplate.update(SQL_INSERT_SPITTER,//简化,且exception的处理也被隐藏了
    
              spitter.getUsername(),
              spitter.getPassword(),
              spitter.getFullName(),
              spitter.getEmail(),
              spitter.isUpdateByEmail());
    
      spitter.setId(queryForIdentity());
    }
    
    }
    bean id="spitterDao" class="com.habuma.spitter.persistence.SimpleJdbcTemplateSpitterDao">
      <property name="jdbcTemplate" ref="jdbcTemplate" />
    </bean>

     

     

    JPA:

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

    基于jpa的程序使用 EntityManagerFactory来获取EnitityManager 的实例,JPA规范定义了两种实体管理器

    1 程序管理型:程序直接向实体管理器工厂请求一个实体管理器由程序负责打开,关闭,在事务中控制管理器不适合运行于在Java EE容器的独立程序。通过调用createEntityManagerFactory() method of the PersistenceProvider. 

    2 容器管理型: 由Java EE容器创建和管理,实体管理器是通过注入或利用JNDI直接获得,这种类型适合希望不考虑persistence.xml的特殊性。

    这两个管理器实现同一个 EntityManager接口,区别只在于创建和管理方式。

     

    配置程序管理型的JPA

    配置信息来源于persistence.xml,xml定义一个多多个持久单元,对应一个数据源

    <persistence xmlns="http://java.sun.com/xml/ns/persistence"
        version="1.0">
      <persistence-unit name="spitterPU">
        <class>com.habuma.spitter.domain.Spitter</class>
        <class>com.habuma.spitter.domain.Spittle</class>
        <properties>
          <property name="toplink.jdbc.driver"
              value="org.hsqldb.jdbcDriver" />
          <property name="toplink.jdbc.url" value=
              "jdbc:hsqldb:hsql://localhost/spitter/spitter" />
          <property name="toplink.jdbc.user"
              value="sa" />
          <property name="toplink.jdbc.password"
              value="" />
        </properties>
      </persistence-unit>
    </persistence>

    spring中定义bean LocalEntityManagerFactoryBean 

    <bean id="emf"
          class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
      <property name="persistenceUnitName" value="spitterPU" /> //持久单元的名称
    </bean>

     

    配置容器管理型 JPA

    <bean id="emf" class= "org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
      <property name="dataSource" ref="dataSource" /> //上面提到的datasource
      <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
    </bean>
    <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    
      <property name="database" value="HSQL" />  // 数据库类型
      <property name="showSql" value="true"/>
      <property name="generateDdl" value="false"/>
      <property name="databasePlatform"
                value="org.hibernate.dialect.HSQLDialect" />
    </bean> 

     

     

    在spring上下文中配置jpaVendorAdapter属性用于设置特定JPA实现的细节,不同的数据库平台不同,包括:EclipseLinkJpaVendorAdapter HibernateJpaVendorAdapter OpenJpaVendorAdapter TopLinkJpaVendorAdapter 

     

posted on 2012-11-17 19:23  yoyo_zeng  阅读(1374)  评论(0编辑  收藏  举报