Spring 框架是一个在 Apache 许可下发布的 Java/J2EE 应用程序框架,它支持 J2EE 应用程序中的多个层次。Spring 框架的一个突出特性是支持更易于维护和更强健的 JDBC 数据访问。它可以和 Oracle TopLink 对象/关系映射工具结合使用 — 大大减少与编写 JDBC 代码相关的烦琐工作和风险。使用 Spring 框架,开发人员编写的 Oracle 数据库访问 JDBC 代码可以更为简洁、更不易出错以及更加灵活。
使用 Spring 来编写更易于维护和更不易出错的 JDBC 代码。Spring 框架还可以用来做比这更多得多的事情。除了能够为 JDBC 做和许多对象-关系映射技术所能做的同样的事情之外,Spring 还拥有支持可以在企业应用程序中找到的所有其他层的特性。这些特性包括轻量级的 IoC(反转控制)容器支持、一个 Web 框架和其他的 J2EE 应用程序支持。
Spring 框架被设计为非侵入性或者最小限度的侵入性。您可以使用 Spring 框架来做许多事情,但并不强迫应用程序全依赖于 Spring 框架。因为 Spring 是开放源代码的,是一个很有用的工具,可作为优秀应用程序设计准则的具体示例。即使目前您不能直接在应用程序中使用 Spring 框架,学习使用 Spring 框架作为优秀设计和代码准则的示例也是很有收获的。Spring 提供的 JDBC 支持不需要使用 Spring 的任何其他特性,是极佳的 Spring 框架使用入门途径,它不用与 Spring 的其他部分紧密结合。
Spring 框架为 JDBC 带来的好处除上面稍微详细介绍的之外,还存在其他几个将 Spring 框架用于 JDBC 的好处。这些好处包括:
(1).Spring 的 JdbcTemplate 类支持其他几个由 Spring 提供的与本文所讨论的接口类似的接口。这些接口包括 ResultSetExtractor 和 PreparedStatementCreator,它们分别类似于 RowCallbackHandler 和 PreparedStatementSetter。JdbcTemplate 支持的许多接口中的另一个是非常有用的 BatchPreparedStatementSetter。
(2).虽然不需要在 Spring 应用程序上下文中使用 Spring JDBC 抽象,但可以选择将 JDBC 抽象用于该上下文,这提供了额外的好处。可以使用 Spring 框架通过配置文件来将数据访问对象与业务对象相连(而不是在代码中直接耦合)。
(3).org.springframework.jdbc.object 程序包支持将关系数据库操作(包括 DML 语句和存储过程)作为可重用的对象。这些线程安全的对象为开发人员提供了更高级别的关系数据库抽象(超过本文之前介绍和在所有代码示例中使用的 Spring 的 JdbcTemplate)。我个人喜欢 JdbcTemplate 提供的抽象级别,我觉得它对例行问题(如异常、结果集和资源管理)的处理所提供的支持级别正是我想要的。不过,如果机构或其开发人员想享受更高级别的关系数据库概念的抽象,而不必采用完整的对象-关系 (O/R) 映射技术(例如 TopLink 或 Hibernate),那么 org.springframework.jdbc.object 程序包将值得考虑。代码清单 12 中的存储过程示例提供了对该程序包的简单尝试。
(4).Spring 框架提供了一个可以在容器外部使用的简单的 DataSource 实现,并提供了一个可以根据需要覆盖的抽象数据源类(参见 Spring 参考文档的第 10 章)。
(5).除 JDBC 之外,Spring 框架还支持多种 O/R 映射技术(例如 Hibernate、iBatis 和 Java 数据对象 (JDO))。(参见 Spring 参考文档的第 11 章。)本文底部的在线参考部分包含了一条到关于将 Spring 与 Oracle 的 TopLink 对象-关系映射产品结合使用的其他文章的链接。
(6).Spring 框架简化了共享相同的异常层次结构的技术不可知的 DAO 接口和实现的开发。(参见 Spring 参考文档的第 9 章。)本文中的几个地方简单提到了这个主题。
(7).Spring 框架提供了对在需要时将 SQLWarning 作为异常 (SQLWarningException) 来捕获的支持。这对 Oracle 数据库和 JDBC 驱动程序不是特别有用,因为它们倾向于对几乎每一种情况抛出 SQLException。它对于需要提供警告并在使用一个更密集使用 SQLWarning 的数据库的开发人员而言是一种更有用的特性。在这些情况下,直接使用 JDBC 的开发人员必须特别询问是否出现了 SQLWarning。Spring 框架可以用来处理这些警告(和处理任何其他的 Spring 异常一样),以实现更容易和更一致的处理。
(8).Spring 框架提供了 org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor 接口和该接口的一些实现(例如 SimpleNativeJdbcExtractor)。当连接被另一个 DataSource 包装或者要通过特定的连接池来获取时,这些接口和实现对于通过 Oracle 连接或 ResultSet 来访问 Oracle 特性非常有用。
(9).Spring 提供了 org.springframework.jdbc.support.lob.OracleLobHandler 类来创建 oracle.sql.BLOB(二进制大对象)和 oracle.sql.CLOB 的实例。
(10).Spring 提供的 OracleSequenceMaxValueIncrementer 类提供了 Oracle 序列的下一个值。它可以有效地提供一些信息,这些信息与您直接使用以下命令时提供的信息相同:select someSequence.nextval from dual (其中 someSequence 是 Oracle 数据库中的序列名称)。该方法的一个好处是可以在 DAO 层次结构中使DataFieldMaxValueIncrementer 接口,而无需紧密地耦合 Oracle 特有的实现。