Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103760483
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-12 16:37:52

    来源:赛迪网技术社区    作者:softprog

在利用 JDBC 访问 Oracle 对象的两种方式下(Struct 和 SQLData)都将使用抛出 SQLException 的方法来访问返回的类。代码清单 16 和 17 显示了如何使用匿名内部回调类来将 SQLException 隐藏在特有的非强制 Spring 框架异常层次结构之后。这些重新抛出的异常利用了与本文中的其他示例相同的异常转换。这些代码清单不仅专门演示了如何处理 Oracle 对象的基于 Spring 的访问,还演示了在其他的 JdbcTemplate 常规方法不适用时如何使用匿名内部回调类。

在代码清单 16 中,您将在本文中第一次看到在基于 Spring 的代码中出现 ResultSet 和 SQLException。不过,注意甚至在这些代码中也没有直接使用 SQLException。相反,Spring 框架通过其异常处理机制来处理任何抛出的 SQLException,您只需关心您希望捕获和处理的 Spring 异常。

代码清单 17 演示了本文中第一次在基于 Spring 的代码中使用 PreparedStatement,并显示了对 SQLException 的另一种引用。正如代码清单 16 的情况一样,SQLException 主要用于引用 Spring 框架的 JdbcTemplate 类,后者将处理它并将任何异常作为非强制 Spring 异常提供。

代码清单 16 和 17 演示了 Spring 的 RowCallbackHandler 和 PreparedStatementSetter 回调接口的用法。在这些代码清单中使用匿名内部类实现了这些接口。虽然与前面的代码清单中显示的 JdbcTemplate 的更简单的用法相比,开发人员编写的内部类必须知道关于 ResultSet 和 PreparedStatement 以及它们的各个 API 的更多信息,但您仍然无需关心 SQLException 的处理;JdbcTemplate 将执行异常处理。

前面的基于 Spring 的代码清单(例如代码清单 3 和 6 中使用的 JdbcTemplate)甚至没有提到 ResultSet、Statement、PreparedStatement 或 SQLException。这些高度抽象的方法对于不想关心 JDBC 的具体用法的开发人员特别有用。不过,这些极其方便的方法没有代码清单 16 和 17 所演示的内部类方法灵活。代码清单 16 和 17 中显示的更灵活的方法可以在需要时使用(只需稍微了解基本的 JDBC API)。在所有情况下,异常处理都由 Spring 异常层次结构来一致地执行,您不需要关心 SQLException。

其他好处

Spring 框架为 JDBC 带来的好处除上面稍微详细介绍的之外,还存在其他几个将 Spring 框架用于 JDBC 的好处(在此不再进一步讨论)。这些好处包括:

Spring 的 JdbcTemplate 类支持其他几个由 Spring 提供的与本文所讨论的接口类似的接口。这些接口包括 ResultSetExtractor 和 PreparedStatementCreator,它们分别类似于 RowCallbackHandler 和 PreparedStatementSetter。JdbcTemplate 支持的许多接口中的另一个是非常有用的 BatchPreparedStatementSetter。

虽然不需要在 Spring 应用程序上下文中使用 Spring JDBC 抽象,但可以选择将 JDBC 抽象用于该上下文,这提供了额外的好处。可以使用 Spring 框架通过配置文件来将数据访问对象与业务对象相连(而不是在代码中直接耦合)。

org.springframework.jdbc.object 程序包支持将关系数据库操作(包括 DML 语句和存储过程)作为可重用的对象。这些线程安全的对象为开发人员提供了更高级别的关系数据库抽象(超过本文之前介绍和在所有代码示例中使用的 Spring 的 JdbcTemplate)。我个人喜欢 JdbcTemplate 提供的抽象级别,我觉得它对例行问题(如异常、结果集和资源管理)的处理所提供的支持级别正是我想要的。不过,如果机构或其开发人员想享受更高级别的关系数据库概念的抽象,而不必采用完整的对象-关系 (O/R) 映射技术(例如 TopLink 或 Hibernate),那么 org.springframework.jdbc.object 程序包将值得考虑。代码清单 12 中的存储过程示例提供了对该程序包的简单尝试。

Spring 框架提供了一个可以在容器外部使用的简单的 DataSource 实现,并提供了一个可以根据需要覆盖的抽象数据源类(参见 Spring 参考文档的第 10 章)。

除 JDBC 之外,Spring 框架还支持多种 O/R 映射技术(例如 Hibernate、iBatis 和 Java 数据对象 (JDO))。(参见 Spring 参考文档的第 11 章。)本文底部的在线参考部分包含了一条到关于将 Spring 与 Oracle 的 TopLink 对象-关系映射产品结合使用的其他文章的链接。

Spring 框架简化了共享相同的异常层次结构的技术不可知的 DAO 接口和实现的开发。(参见 Spring 参考文档的第 9 章。)本文中的几个地方简单提到了这个主题。

Spring 框架提供了对在需要时将 SQLWarning 作为异常 (SQLWarningException) 来捕获的支持。这对 Oracle 数据库和 JDBC 驱动程序不是特别有用,因为它们倾向于对几乎每一种情况抛出 SQLException。它对于需要提供警告并在使用一个更密集使用 SQLWarning 的数据库的开发人员而言是一种更有用的特性。在这些情况下,直接使用 JDBC 的开发人员必须特别询问是否出现了 SQLWarning。Spring 框架可以用来处理这些警告(和处理任何其他的 Spring 异常一样),以实现更容易和更一致的处理。

Spring 框架提供了 org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor 接口和该接口的一些实现(例如 SimpleNativeJdbcExtractor)。当连接被另一个 DataSource 包装或者要通过特定的连接池来获取时,这些接口和实现对于通过 Oracle 连接或 ResultSet 来访问 Oracle 特性非常有用。

Spring 提供了 org.springframework.jdbc.support.lob.OracleLobHandler 类来创建 oracle.sql.BLOB(二进制大对象)和 oracle.sql.CLOB 的实例。

Spring 提供的 OracleSequenceMaxValueIncrementer 类提供了 Oracle 序列的下一个值。它可以有效地提供一些信息,这些信息与您直接使用以下命令时提供的信息相同:select someSequence.nextval from dual (其中 someSequence 是 Oracle 数据库中的序列名称)。该方法的一个好处是可以在 DAO 层次结构中使用 DataFieldMaxValueIncrementer 接口,而无需紧密地耦合 Oracle 特有的实现。

Spring 框架的其他用途

本文专注于使用 Spring 来编写更易于维护和更不易出错的 JDBC 代码。Spring 框架还可以用来做比这更多得多的事情。除了能够为 JDBC 做和许多对象-关系映射技术所能做的同样的事情之外,Spring 还拥有支持可以在企业应用程序中找到的所有其他层的特性。这些特性包括轻量级的 IoC(反转控制)容器支持、一个 Web 框架和其他的 J2EE 应用程序支持。

Spring 框架被设计为非侵入性或者最小限度的侵入性。您可以使用 Spring 框架来做许多事情,但并不强迫应用程序全依赖于 Spring 框架。因为 Spring 是开放源代码的,是一个很有用的工具,可作为优秀应用程序设计准则的具体示例。即使目前您不能直接在应用程序中使用 Spring 框架,学习使用 Spring 框架作为优秀设计和代码准则的示例也是很有收获的。Spring 提供的 JDBC 支持不需要使用 Spring 的任何其他特性,是极佳的 Spring 框架使用入门途径,它不用与 Spring 的其他部分紧密结合。

阅读(316) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~