8.1 Spring的DAO理念
DAO(Data Access Object)用于访问数据的对象,虽然我们在大多数情况下,将数据保存在数据库中,但用户也可以将数据存储到文件中或LDAP中,DAO不但屏蔽了数据存储的最终介质的不同,也屏蔽了具体的实现技术的不同。
8.2 统一的异常体系
Spring提供了一套和实现技术无关的、面向DAO层语义的异常体系,并通过转换器将不同持久化技术的异常转换成Spring的异常。
8.2.1 Spring的DAO异常体系
Spring的异常体系都是建立在运行期异常的基础上,开发者可以根据需要捕捉感兴趣的异常。
8.2.2 JDBC的异常转换器
传统的JDBC API在发生几乎所有的数据操作问题都抛出相同的SQLException,它将异常的细节性信息封装在异常属性中:错误码(getErrorCode())和SQL状态码(getSQLState())。
8.2.3 其他持久技术的异常转换器
在org.springframework.orm包中。
8.3 统一数据访问模板
8.3.1 使用模板和回调机制
JDBC数据访问操作按一下的流程进行:
1.准备资源
2.启动事务
3.在事务中执行具体数据访问操作
4.提交/回滚事务
5.关闭资源,处理异常
按照传统的方式,编写任何带事务的数据访问的程序时,都需要重复编写上面的代码。
8.3.2 Spring为不同持久化技术所提供的模板类
所有的支持类都是abstract的,其目的使希望被继承使用,而非直接使用。
8.4 数据源
8.4.1 配置一个数据源
Spring在第三方依赖包中包含了两个数据源的实现类包:其一是Apache的DBCP;其而是C3P0。可以在Spring配置文件中利用这两者中的任何一个配置数据源。
DBCP数据源
DBCP是一个依赖commons-pool对象池机制的数据库连接池。
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://localhost:.3309/sampledb"
p:username="root"
p:password="123456" />
BasicDataSource提供了close方法关闭数据源,所以必须设定destroy-method=”close”属性。
C3P0数据源
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close"
p:driverClass="oracle.jdbc.driver.OracleDriver"
p:jdbcUrl="jdbc:oracle:thin:@localhost:1521:ora9i"
p:username="root"
p:password="123456" />
使用属性文件
<context:property-placeholder location="/WEB-INF/jdbc.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destory-method="close"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}"
在jdbc.properties属性文件中定义属性值
jdbc.driverClassName=com.mysql.jdbc.Driver
...
8.4.2 获取JNDI数据源
如果应用配置在高性能的应用服务器(如WebLogic或Websphere等)上,我们可能更希望使用应用服务器本身提供的数据源。
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"
p:jndiName="java:comp/env/jdbc/bbt" />
8.4.3 Spring的数据源实现类
DriverManagerDataSource,没有提供池化连接的机制,每次调用getConnection()获取新连接时,只是简单地创建一个新的连接,用于单元测试。
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/sampledb");
ds.setUsername("root");
ds.setPassword("123456");
Connection actualCon = ds.getConnection();
8.5 小结
Spring支持目前大多数常用的数据持久化技术,定义了一套面向DAO层的异常体系。
不管采用何种持久化技术,访问数据的流程是相对固定的。并以模版的方式定义好流程。