一. 引言
Spring是一个轻量级的应用程序框架。在许多情况中,Spring都能够良好地代换传统的由Java EE应用程序服务器所提供的服务。Spring既是综合性的也是模块化的。基于其分层架构,它能够使开发者灵活地单独使用其任何一部分。Spring由许多模块组成,例如IoC容器,AOP,MVC,持久性,DAO和remoting。这些模块都是相当松耦合的:其中,一些模块的使用根本不需要另一些模块。以前,简直还没有象Spring应用程序这样的:你可以选择使用一些,大多数,或所有的Spring框架支持的组件来构建你的应用程序。
Spring框架所提供的JDBC支持与其它Spring部分并非是紧耦合的,这极有利于代码的可维护性。本文将向你展示任何直接使用JDBC(也即是,不通过一些O/R映射框架本身使用JDBC)的应用程序是如何从Spring中受益的。
二. 传统型JDBC
传统型JDBC有许多积极的方面使之在许多J2SE和J2EE应用程序开发中占有重要地位。然而,也有一些特征使其难于使用:
· 开发者需要处理大量复杂的任务和基础结构,例如大量的try-catch-finally-try-catch块。
· 应用程序需要复杂的错误处理以确定连接在使用后被正确关闭,这样以来使得代码变得冗长,膨胀,并且重复。
· JDBC中使用了极不明确性的SQLException异常。
· JDBC没有引入具体的异常子类层次机制。
相应于任何一种错误,都只是抛出SQLException异常-无论它来源于JDBC驱动程序还是来源于数据库,这使得程序员很难理解到底是哪里实际出现了错误。例如,如果SQL对象是无效的或已经被锁定,那么将抛出一个SQLException异常。调试这样的异常需要一定的时间来检查SQL状态值和错误代码。更有甚者,SQL状态值和错误代码的含义在各种数据库之间都有些差别。
事实证明,编写JDBC代码并不是一项容易的工作-存在大量的重复性的工作。为了说明问题,下面是一个例子-使用传统型JDBC来从数据库中得到一个可用任务的列表。
除了实际查询数据库的SQL代码外,上面的示例中需要巨大数量的例程代码。getConnection()方法与我们的任务无关,而即使是getTasksNames()方法也仅包含特定于当前任务的两行代码。剩下的都是一些普通的复杂的任务代码。
JDBC的许多积极方面使得它在许多J2SE和J2EE应用程序中仍然占有重要地位。然而,正如你所见,有一些特征使其比我们可能想像的要更难于使用。JDBC这些乏味并且有时挫败人性的特征已经导致出现了许多公共的可以利用的JDBC抽象框架(例如SQLExecutor和Apache Jakarta Commons DBUtils),还有数不清的自家生产性JDBC应用程序框架。一种公共的可以利用的JDBC抽象框架正是Spring框架的JDBC抽象。静态页面:http://www.qqread.com/java/2006/07/f805168002.html
更多内容请看Spring开源框架技术、数据库专栏、数据库处理专题专题,或进入讨论组讨论。
Spring是一个轻量级的应用程序框架。在许多情况中,Spring都能够良好地代换传统的由Java EE应用程序服务器所提供的服务。Spring既是综合性的也是模块化的。基于其分层架构,它能够使开发者灵活地单独使用其任何一部分。Spring由许多模块组成,例如IoC容器,AOP,MVC,持久性,DAO和remoting。这些模块都是相当松耦合的:其中,一些模块的使用根本不需要另一些模块。以前,简直还没有象Spring应用程序这样的:你可以选择使用一些,大多数,或所有的Spring框架支持的组件来构建你的应用程序。
Spring框架所提供的JDBC支持与其它Spring部分并非是紧耦合的,这极有利于代码的可维护性。本文将向你展示任何直接使用JDBC(也即是,不通过一些O/R映射框架本身使用JDBC)的应用程序是如何从Spring中受益的。
二. 传统型JDBC
传统型JDBC有许多积极的方面使之在许多J2SE和J2EE应用程序开发中占有重要地位。然而,也有一些特征使其难于使用:
· 开发者需要处理大量复杂的任务和基础结构,例如大量的try-catch-finally-try-catch块。
· 应用程序需要复杂的错误处理以确定连接在使用后被正确关闭,这样以来使得代码变得冗长,膨胀,并且重复。
· JDBC中使用了极不明确性的SQLException异常。
· JDBC没有引入具体的异常子类层次机制。
相应于任何一种错误,都只是抛出SQLException异常-无论它来源于JDBC驱动程序还是来源于数据库,这使得程序员很难理解到底是哪里实际出现了错误。例如,如果SQL对象是无效的或已经被锁定,那么将抛出一个SQLException异常。调试这样的异常需要一定的时间来检查SQL状态值和错误代码。更有甚者,SQL状态值和错误代码的含义在各种数据库之间都有些差别。
事实证明,编写JDBC代码并不是一项容易的工作-存在大量的重复性的工作。为了说明问题,下面是一个例子-使用传统型JDBC来从数据库中得到一个可用任务的列表。
| package com.spring.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Vector; public class TraditionalJDBC { public Vector getTasksNames() { Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null; Vector task = new Vector(); try { con = getConnection(); pstmt = con.prepareStatement( "select TASKNAME from tasks"); rs = pstmt.executeQuery(); while (rs.next()) { task.add(rs.getString(1)); } } catch (SQLException e) { System.out.println(e); } finally { try { rs.close(); pstmt.close(); con.close(); } catch (SQLException e1) { System.out.println(e1); } } return task; } private Connection getConnection()throws SQLException { try { DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott","tiger"); } catch (SQLException sqle) { System.out.println(sqle); return null; } } public static void main(String[] args) { TraditionalJDBC obj = new TraditionalJDBC(); Vector task = obj.getTasksNames(); for (int i = 0; i < task.size(); i++) { System.out.println(task.elementAt(i)); } } } |
除了实际查询数据库的SQL代码外,上面的示例中需要巨大数量的例程代码。getConnection()方法与我们的任务无关,而即使是getTasksNames()方法也仅包含特定于当前任务的两行代码。剩下的都是一些普通的复杂的任务代码。
JDBC的许多积极方面使得它在许多J2SE和J2EE应用程序中仍然占有重要地位。然而,正如你所见,有一些特征使其比我们可能想像的要更难于使用。JDBC这些乏味并且有时挫败人性的特征已经导致出现了许多公共的可以利用的JDBC抽象框架(例如SQLExecutor和Apache Jakarta Commons DBUtils),还有数不清的自家生产性JDBC应用程序框架。一种公共的可以利用的JDBC抽象框架正是Spring框架的JDBC抽象。静态页面:http://www.qqread.com/java/2006/07/f805168002.html
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- Spring开源框架技术 (672篇文章)
- 数据库专栏 (5162篇文章)
- 数据库处理专题 (8676篇文章)
- 城域网专题 (7831篇文章)
- 数据库安全技术专题 (13167篇文章)
- 数据库安装与卸载 (10539篇文章)
- Wlan组网----家庭专题 (4208篇文章)
- Linux数据库宝典 (13147篇文章)
- Spring框架技术篇 (54篇文章)
- Spring开发技术篇 (295篇文章)
- J2SE综合:浅谈java程序发布之 jre 篇 (11次浏览)
- JAVA代码中使用魔法数值 (8次浏览)
- Hibernate缓存管理 (6次浏览)
- JAVA代码应该流畅和结构化 (5次浏览)
- Java JVM设置对性能的影响 (4次浏览)
- 开发框架:深入了解 Struts Validator (3次浏览)
- Java中的通信机制及与C/C API的集成 (1次浏览)
- 用Hibernate实现领域对象的自定义字段 (1次浏览)
- Java语言入门 简述Java语言回收机制 (0次浏览)
- 2008年Java开发者最迫切的五个期望 (0次浏览)



