一、Spring数据访问原则

1、将数据访问的功能放到一个或多个专注于此项任务的组件中。这样的组件通常称为数据访问对象(data access objectDAO)或Repository

2、应该以接口的方式暴露数据访问层所提供的功能;

3、为了将数据访问层与应用程序的其他部分隔离开来,Spring采用的方式之一就是提供统一的数据访问异常体系

二、Spring数据访问异常体系

1、目的

一方面,JDBC的异常体系过于简单了——实际上,它算不上一个体系。另一方面,Hibernate的异常体系是其本身所独有的。我们需要的数据访问异常要具有描述性而且又与特定的持久化框架无关。

2、特点

  • 没有与特定的持久化方式相关联
  • 异常都继承自DataAccessException是非检查型异常:可以根据需要选择是否捕获。之所以spring这么设计是因为Spring认为触发异常的很多问题是不能(无法)在catch代码块中修复的,比如数据库连接失败等等,是应用程序无法解决的。而不是强制开发人员编写catch代码块(里面经常是空的)。这把是否要捕获异常的权力留给了开发人员。

3、使用

为了利用Spring的数据访问异常,我们必须使用Spring所支持的数据访问模板

三、数据访问模板化

1、思想

    尽管在某个复杂的过程中包含多个步骤,但是涉及到子类实现参与的只有几个。承运人(抽象层)负责推动整个流程。你只会在必要的时候进行参与,其余的过程不必关心。这反映了一个强大的设计模式:模板方法模式
    这也是Spring在数据访问中所使用的模式。不管我们使用什么样的技术,都需要一些特定的数据访问步骤。例如,我们都需要获取一个到数据存储的连接并在处理完成后释放资源。这都是在数据访问处理过程中的固定步骤,但是每种数据访问方法又会有些不同,我们会查询不同的对象或以不同的方式更新数据,这都是数据访问过程中变化的部分
 
2、设计
 
Spring将数据访问过程中固定的和可变的部分明确划分为两个不同的类:模板(template)回调(callback)
 
这两部分职责与协作:
04.spring framework的DAO支持
 
  • Spring的模板类负责:事务控制、 管理资源、处理异常(处理数据访问的固定部分)。
  • 回调负责:应用程序相关的数据访问的语句、 绑定参数、整理结果集

3、使用(实现)

针对不同的持久化平台,Spring提供了多个可选的模板

​​​​下表是Spring提供的数据访问模板,分别适用于不同的持久化机制:

 
jca.cci.core.CciTemplate
JCA CCI连接
jdbc.core.JdbcTemplate
JDBC连接
jdbc.core.namedparam.NamedParameterJdbcTemplate
支持命名参数的JDBC连接
jdbc.core.simple.SimpleJdbcTemplate
通过Java 5简化后的JDBC连接(Spring 3.1中已经废弃)
orm.hibernate3.HibernateTemplate
Hibernate 3.x以上的Session
orm.ibatis.SqlMapClientTemplate
iBATIS SqlMap客户端
orm.jdo.JdoTemplate
Java数据对象(Java Data Object)实现
orm.jpa.JpaTemplate
Java持久化API的实体管理器

以下三个是比较常用的:

  • JDBCJdbcTemplate
  • Hibernate:HibernateTemplate(最流行的基于POJOORM方案)
  • JPA:JpaTemplate(最流行的基于POJOORM方案)

4、前提

但首先要说明的是Spring所支持的大多数持久化功能都依赖于数据源。

3.1 配置数据源

Spring提供了在Spring上下文中配置数据源bean的多种方式,包括:
  • 通过JDBC驱动程序定义的数据源;
  • 通过JNDI查找的数据源;(最好)
  • 数据库连接池的数据源。(其次)

3.1.1 使用【JNDI】数据源

1、前提

使用web服务器时,web服务器允许你配置通过JNDI获取数据源。

2、好处

  • 于数据源完全可以在应用程序之外进行管理,这样应用程序只需在访问数据库的时候查找数据源就可以了。
  • 在应用服务器中管理的数据源通常以池的方式组织,从而具备更好的性能
  • 支持系统管理员对其进行热切换

3、使用方式

利用Spring,我们可以像使用Spring bean那样配置JNDI中数据源的引用并将其装配到需要的类中。
 
1)XML方式
jee命名空间下的<jee:jndi-lookup>元素可以用于检索JNDI中的任何对象(包括数据源)并将其作为Springbean。如果应用程序的数据源配置在JNDI中,可以使用<jee:jndi-lookup>元素将其装配到Spring中,如下

04.spring framework的DAO支持

其中jndi-name属性用于指定JNDI中资源的名称。如果只设置了jndi-name属性,那么就会根据指定的名称查找数据源。但是,如
果应用程序运行在Java应用服务器中,你需要将resource-ref属性设置为true,这样给定的jndi-name将会自动添加“java:comp/env/前缀。
 
2)JavaConfig方式
其中JndiObjectFactoryBean是spring内置提供的
04.spring framework的DAO支持

3.1.2 使用【数据库连接池】数据源

1、说明

  • 如果无法使用JNDL配置数据源,其次选择在spring中配置数据库连接池数据源,spring没有提供实现,但是可以通过集成下面连接池进行实现:
    • Apache Commons DBCP
    • c3p0
    • BoneCP
2、使用
配置DBCP数据源

前四个属性是配置BasicDataSource所必需的:

  • driverClassName指定了JDBC驱动类的全限定类名。这里配置的是H2数据库的数据源。
  • url用于设置数据库的JDBCURL。最
  • usernamepassword用于在连接数据库时进行认

其他属性如下表:

initialSize
池启动时创建的连接数量
maxActive
同一时间可从池中分配的最多连接数。如果设置为0,表示无限制
maxIdle
池里不会被释放的最多空闲连接数。如果设置为0,表示无限制
maxOpenPreparedStatements
在同一时间能够从语句池中分配的预处理语句(prepared statement)的最大数量。如果设置为0,表示无限制
maxWait
在抛出异常之前,池等待连接回收的最大时间(当没有可用连接时)。如果设置为-1,表示无限等待
minEvictableIdleTimeMillis
连接在池中保持空闲而不被回收的最大时间
minIdle
在不创建新连接的情况下,池中保持空闲的最小连接数
poolPreparedStatements
是否对预处理语句(prepared statement)进行池管理(布尔值)
1)XML形式
04.spring framework的DAO支持
2)JavaConfig形式
04.spring framework的DAO支持

3.1.3 使用【基于JDBC驱动】的数据源

​​​​​​​XXX

相关文章: