
一. 引言
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抽象。
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抽象。
推荐阅讯
- 为Exchange Server安装WAP电子邮件网关
- 网页分辨率设置技巧
- 让您网页的按钮也能使用热键
- 网页技巧:如何在网页上实现音乐播放?
- 浅谈在网页上显示日期的两种方法
- NIKE官方网站德国区部分网页设计欣赏
- WML学习(一):概述和基本规则
- 网页设计高级布局40例参考
- 世界上最大的网页 电脑配置差者谨慎入内
- 网页背景设计技巧
阅读排行
- 1.淘宝网店“设计装修”技巧全攻略
- 2.javascript函数库
- 3.我的地盘听我的 六大主流博客网站对比评测
- 4.WAP建站入门教程
- 5.网页木马深度剖析以及手工清除
- 6.WAP建站语言WML语法全接触
- 7.好事喜事送上祝福 电子请柬随网拈来
- 8.如何保存网页中的Flash文件?
- 9.WAP建站WML语言语法基础
- 10.介绍几款WAP网页制作工具(提供下载)
专题教程
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
- Picasa中文版_Picasa教程 专题:清除流氓软件
- Firefox专题 seo搜索引擎优化专区
- 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
