spring数据持久化

一、spring提供了一组数据访问框架,集成了多种数据访问技术。支持JDBC、ibatis、hibernate、jpa等持久化框架。java

二、spring的数据访问哲学spring

  spring的目标之一就是容许开发人员在开发应用程序时,可以遵循面向对象原则中的“针对接口编程”。spring对数据访问的支持也不例外。DAO是数据访问对象(data access object)的缩写,DAO提供了数据读取和写入到数据库中的一种方式。他们以接口的方式发布功能,应用程序的其余部分能够经过接口来进行访问。如图:sql

服务对象经过接口来访问DAO,它使得服务对象易于测试,由于他们再也不与特定的数据访问实现绑定在一块儿。此外,数据访问层是以持久化技术无关的方式来进行访问的。持久化方式的选择独立于DAO,只有相关的数据访问方法经过接口来进行发布。这能够实现灵活的设计并使得切换持久化框架对应用程序其余部分所带来的影响最小。若是将数据访问层的实现细节渗透到应用程序的其余部分中,那么整个应用程序将与数据访问层耦合在一块儿,从而致使僵化的设计。数据库

三、spring的数据访问异常体系编程

  JDBC访问数据会强制捕获SQLException异常,JDBC对于全部的数据访问问题都会抛出SQLException异常,可是这个异常却没有告诉你哪里出错了以及如何进行处理,不能再catch块中解决问题。一些持久化框架提供了相对丰富的异常体系。分别对应于特定的数据访问问题。这样就能够针对想处理的异常编写catch代码块。服务器

  不一样于JDBC,spring提供了多个数据访问异常,分别描述了它们抛出时所对应的问题。如图:框架

尽管spring的异常体系比JDBC简单的SQLException丰富得多,但它并无与特定的持久化方式相关联。这意味着咱们能够用spring抛出一致的异常,而不用关心所选择的持久化方案。这有助于咱们将全部持久化机制与数据访问隔离开来。spring认为触发异常的不少问题是不能在catch代码块中修复的。spring使用了非检查型异常,而不是强制开发人员编写catch代码块。这把是否要捕获异常的权力留给了开发人员。性能

四、数据访问模板化测试

  spring将数据访问过程当中固定的和可变的部分明确划分为两个不一样的类:模板(template)和回调(callback)。模板管理过程当中固定的部分,而回调处理自定义的数据访问代码。如图:this

  针对不一样的持久化平台,spring提供了多个可选的模板。如图:

使用数据访问模板只需将其配置为spring上下文中的bean并将织入到应用程序的DAO中。或者,你还可使用spring的DAO支持类进一步简化应用程序的DAO配置。尽管直接织入模板是不错的选择,可是spring还提供了一系列便利的DAO基类,这些基类能够用于管理模板。

五、使用DAO支持类

  数据访问模板并非spring数据访问框架的所有。每一个模板提供了一些简便的方法,使咱们没必要建立明确的回调实现,从而简化了数据访问。另外,基于模板-回调设计,spring提供了DAO支持类,而将业务本身的DAO类做为它的子类。如图:

  spring不只提供了多个数据模板实现类,还为每种模板提供了对应的DAO支持类。如图:

六、配置数据源

  无论选择哪种spring DAO的支持方式,都须要配置一个数据源的引用。spring提供了在spring上下文中配置数据源bean的多种方式,包括:

  1)经过JNDI查找的数据源;

  Spring应用程序常常部署在JavaEE应用服务器中,如WebSphere、JBoss或者像Tomcat这样的Web容器。这些服务器容许你配置经过JNDI获取数据源。这种配置的好处在于数据源彻底能够在应用程序以外进行管理,这样应用程序只需在访问数据库的时候查找数据源彻底能够在应用程序以外进行管理,这样应用程序只需在访问数据库的时候查找数据源就能够了。另外,在应用服务器中管理的数据源经过以池的方式组织,从而具有更好的性能,而且支持系统管理员对其进行热切换。

  利用spring,咱们能够像使用Spring Bean那样配置JNDI中数据源的引用并将其装配到须要的类中。位于jee命名空间下的<jee:jndi-lookup>元素并将其装配到Spring中。如:<jee:jndi-lookup id="dataSource" jndi-name="/jdbc/zhyypt" resource-ref="true" />

  2)链接池的数据源;

  尽管Spring并无提供数据源链接池实现,但Jakarta Commons Data-base Connection Pooling(DBCP)项目是一个不错的选择。

  DBCP包含了多个提供链接池功能的数据源,其中BasicDataSource是最经常使用的,由于它易于在Spring中配置,并且相似于Spring自带的DriverManagerData-Source。配置以下:

  3)经过JDBC驱动程序定义的数据源;

  在Spring中,经过JDBC驱动定义数据源是最简单的配置方式。Spring提供了两种数据源对象供选择。

  DriverManagerDataSource:在每一个链接请求时都会返回一个新建的链接。与DBCP的BasicDataSource不一样,由DriverManagerDataSource提供的链接并无进行池化管理。

  SingleConnectionDataSource:在每一个链接请求时都会返回同一个链接。尽管SingleConnectionDataSource不是严格意义上的链接池数据源,可是你能够将其视为只有一个链接的池。

  以上两个链接的配置以下:

七、使用JDBC模板

  Spring的JDBC框架承担了资源管理和异常处理的工做,从而简化了JDBC代码。Spring为JDBC提供了3个模板类使用。

  JdbcTemplate:最基本的Spring JDBC模板,这个模板支持最简单的JDBC数据库访问功能以及简单的索引参数查询。

  NamedParameterJdbcTemplate:使用该模板执行查询时,能够将查询值以命名参数的形式绑定到SQL中,而不是使用简单的索引参数。

  SimpleJdbcTemplate:该模板类利用Java5的一些特性,如自动装箱、泛型以及可变参数列表来简化JDBC模板的使用。

  在Spring3.0中,对NamedParameterJdbcTemplate已经不在支持——因此相对于SimpleJdbcTemplate,没有理由在选择简单的JdbcTemplate了。只须要设置DataSource就可以让SimpleJdbcTemplate正常工做。在Spring中配置SimpleJdbcTemplate很是容易,以下所示:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">

  <constructor-arg ref="dataSource"/>

</bean>

  属性dataSource所引用的dataSource能够是javax.sql.DataSource的任意实现。

  如今,能够将jdbcTemplate装配到DAO中并使用它来访问数据库。

public class JdbcSpitterDAO impliments SpitterDAO{

  private SimpleJdbcTemplate jdbcTemplate;

  public void setJdbcTemplate(SimepleJdbcTemplate jdbcTemplate){

    this.jdbcTemplate = jdbcTemplate;

  }

}

  还须要装配JdbcSpitterDAO的jdbcTemplate属性,以下:

<bean id="spitterDao" class="com.zhyypt.spitter.SimpleJdbcTemplateSpitterDao">

  <property name="jdbcTemplate" ref="jdbcTemplate"/>

</bean>

  对于应用程序中的每个JDBC DAO类,咱们都须要添加一个SimpleJdbcTemplate属性以及对应的setter方法,并确保将SimpleJdbcTemplate  Bean装配到每一个DAO的SimpleJdbcTemplate属性中。这会产生大量的重复工做。

  一种可行的解决方案就是为全部的DAO建立一个通用的父类,在其中会有SimpleJdbcTemplate属性。而后让全部的DAO类继承这个类并使用父类的SimpleJdbcTemplate进行数据访问。Spring提供了内置的基类(JdbcDaoSupport、SimpleJdbcDaoSupport和NamedParameterJdbcDaoSupport),分别对应于不一样的Spring JDBC模板。要使用这些DAO支持类,就要确保DAO类继承此类。如:

public class JdbcSpitterDao extends SimpleJdbcDaoSuppoort implements SpitterDao{

...

}

相关文章
相关标签/搜索