一. 引言
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)); } } } |
| package com.spring.jdbc; import java.util.List; public interface TasksDAO { public List getTasksNames(); } |
| package com.spring.jdbc; import java.util.Iterator; import java.util.List; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.RowMapperResultReader; import org.springframework.jdbc.core.support.JdbcDaoSupport; public class TasksJdbcDAO extends JdbcDaoSupport public List getTasksNames() { taskDao.setDataSource(ds); |
| <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="dataSourceDBDirect" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/> <property name="username" value="scott"/> <property name="password" value="tiger"/> </bean> </beans> |
| package com.spring.jdbc; import java.util.List; public interface Service { public List getTasksNames(); public void setTasksDao(TasksDAO taskDAO); } |
| package com.spring.jdbc; import java.util.List; public class ServiceImpl implements Service{ TasksDAO taskDAO; public void setTasksDao(TasksDAO taskDAO) { this.taskDAO=taskDAO; } public List getTasksNames() { List tasks = taskDAO.getTasksNames(); return tasks; } } |
| <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="dataSourceDBDirect" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/> <property name="username" value="scott"/> <property name="password" value="tiger"/> </bean> <bean id="tasksDAO" class="com.spring.jdbc.TasksJdbcDAO"> <property name="dataSource"> <ref local="dataSourceDBDirect"/> </property> </bean> <bean id="service" class="com.spring.jdbc.ServiceImpl"> <property name="tasksDao"> <ref local="tasksDAO"/> </property> </bean> </beans> |
| package com.spring.jdbc; import java.util.Iterator; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Client extends RuntimeException { public static void main(String[] args) throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext("SpringConfig.xml"); Service service = (Service)ctx.getBean("service"); Iterator tskIter = service.getTasksNames().iterator(); while (tskIter.hasNext()) { System.out.println(tskIter.next().toString()); } } } |
Tags: Spring jdbc web 数据库 框架
原创文章如转载,请注明:转载自:飞扬部落编程仓库 : http://www.busfly.net/csdn/
本文链接地址:http://www.busfly.net/csdn/post/577.html
如果你喜欢本文,请顶一下,支持我,你的支持是我继续发好文章的最大动力。谢谢。
好东西需要分享,快把本文发给你的朋友吧~!~