在OracleJDBC访问中加入Spring特性(6)
在利用 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 对象-关系映射产品结合使用的其他文章的链接。