Spring对多个持久化技术提供了集成支持,包括hibernate,mybatis,JPA,JDO, Spring面向DAO制定了一个通用的异常体系,屏蔽具体持久化技术的异常,使业务层和具体的持久化技术实现解耦.

DAO即Data Access Object ,是用于访问数据的对象,DAO不仅屏蔽了数据存储的最终介质的不同,也屏蔽了具体的实现技术的不同.

数据源

数据源表示可用于应用程序的数据。 更具体而言,数据源表示您希望在应用程序中使用的数据。 数据源可从数据库(包括本地数据库文件)、服务以及对象中获得。

不管采用何种持久化技术,都必须拥有数据连接,在spring中,数据连接是通过数据源获得的,在以往的应用中,数据源一般是由应用服务器提供的,在spring中,不但可以通过JNDI获取应用服务器的数据源,也可以直接在Spring容器中配置数据源,,还可以通过代码的方式创建一个数据源,以便进行无容器依赖的单元测试.

配置一个数据源

两个数据源实现类包,一个Apache的DBCP,一个是c3p0

c3p0是一个开放源码的JDBC数据源实现项目,实现了JDBC3和JDBC2拓展规范说明的Connection和Statement池.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="${dataSource.url}"></property>
<property name="user" value="${dataSource.username}"></property>
<property name="password" value="${dataSource.password}"></property>
<!-- 每60秒检查所有连接池中的空闲连接。Default: 0 -->
<property name="idleConnectionTestPeriod" value="60" />
<!-- 初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize" value="5" />
<!-- 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="60" />
<!-- 连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize" value="10" />
<!-- 连接池中保留的最小连接数。 -->
<property name="minPoolSize" value="5" />
<!-- JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements
属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
<property name="maxStatements" value="100" />
<!-- maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->
<property name="maxStatementsPerConnection" value="3" />
<!-- 定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个显著提高测试速度。注意:
测试的表必须在初始数据源的时候就存在。Default: null -->
<property name="preferredTestQuery" value="select 1" />
<!-- 定义在从数据库获取新连接失败后重复尝试的次数。Default: 30-->
<property name="acquireRetryAttempts" value="3" />
<!-- 两次连接中间隔时间,单位毫秒。Default: 1000 -->
<property name="acquireRetryDelay" value="1000" />
<!-- 当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出
SQLException,如设为0则无限期等待。单位毫秒。Default: 0 -->
<property name="checkoutTimeout" value="30000" />
</bean>
使用属性文件

数据源的配置信息可能经常改动,所以一般将数据源的配置信息独立出来到一个属性文件中,通过

<context:property-placeholder>引入属性文件,以${xxx}的方式引用属性

1
2
3
4
5
6
7
<context:property-placeholder location="/WEB-INF/jdbc.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="${dataSource.url}"></property>
<property name="user" value="${dataSource.username}"></property>
<property name="password" value="${dataSource.password}"></property>
</bean>
1
2
3
dataSource.url = jdbc:mysql://localhost:3309/sample
dataSource.username=root
dataSource.password=123