Spring JDBC抽象框架简化Web数据库开发(2)

2008-02-23 08:11:30来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折



  当处理异常时,Spring检查来自一个数据库连接的元数据可用性以决定数据库产品。它使用这种知识来把SQLException映射到其自己异常层次中的具体的异常上。因此,我们不需要担心专门性的SQL状态或错误代码问题;Spring的数据存取异常不是JDBC特定的,因此你的DAO不必绑定到JDBC(由于其可能抛出的异常)。

  四. Spring JDBC示例

  在下面两个列表中,我们将使用前面用传统型JDBC实现的业务逻辑为例并且展示使用Spring JDBC版本是多么容易。首先,我们从一个简单的接口开始。

package com.spring.jdbc;
import java.util.List;
public interface TasksDAO {
 public List getTasksNames();
}
  接下来,我们提供针对于TasksDAO接口的一种实现。

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
implements TasksDAO {

 public List getTasksNames() {
  JdbcTemplate jt = getJdbcTemplate();
  return jt.query("select TASKNAME from tasks",
new RowMapperResultReader(new TasksRowMapper()));
 }
 class TasksRowMapper implements RowMapper {
  public Object mapRow(ResultSet rs, int index)
  throws SQLException {
   return rs.getString(1);
  }
 }
 public static void main(String[] args)throws Exception {
  ApplicationContext ctx = new ClassPathXmlApplicationContext("SpringConfig.xml");
  DataSource ds =(DataSource) ctx.getBean("dataSourceDBDirect");
  TasksJdbcDAO taskDao = new TasksJdbcDAO();

  taskDao.setDataSource(ds);
  Iterator tskIter = taskDao.getTasksNames().iterator();
  while (tskIter.hasNext()) {
   System.out.println(tskIter.next().toString());
  }
 }
}


  在上面的例子中,普通的和复杂的任务代码已经被移交到框架中。还应注意,借助于Spring JDBC,我们如何利用控制反转(IoC)容器来提供一种DataSource-我们仅把它注入到TasksJdbcDAO对象中。

  控制反转背后的概念通常被表达为"不要找我,让我找你好了"。IoC把一些任务移交到了框架中,并且脱离出了应用程序代码。不是让你的代码调用一个传统的类库,而是一个IoC框架调用你的代码。存在于许多API中的生命周期回调,例如相应于会话EJB的setSessionContext()方法,正是展示了这种方法。

  DataSource必须被注入到这个类中(或者其超类中),这是通过setDataSource()方法实现的。所有配置细节都远离了业务逻辑或客户端代码;这增加你的应用程序的松耦合性并因此而提高了程序的可测试性和可维护性。作为选择,我们还能在JNDI或servlet容器中建立一个DataSource,并用编程方式来检索它,然后把它注入到DAO对象中。下面是一个你可以使用的示例Spring bean配置文件-SpringConfig.xml:

<?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>
  这个文件指示Spring bean容器实例化一个dataSourceDBDirect bean-它基于org.springframework.jdbc.datasource.DriverManagerDataSource类创建。

  1) 基于Spring JDBC实现一个业务层

  我们已经看到了一个简单的使用Spring JDBC的例子,在这种情况下,它从Spring BeanFactory(控制反转容器)中得到极少的帮助。现在,我们将超越这个简单的例子。让我们来探讨一下如何基于Spring JDBC实现业务服务。首先,让我们创建一个客户端-一个为终端用户提供输出的应用程序。该客户端使用了一个服务,一个遵守下面的Service接口的业务服务:

package com.spring.jdbc;
import java.util.List;
public interface Service {
 public List getTasksNames();
 public void setTasksDao(TasksDAO taskDAO);
}
  客户端需要存取一个业务服务对象。它将使用Spring BeanContainer来"抓住"这样的一个服务对象。客户端仅能针对接口编程并且依赖容器来提供一种实际的实现。而且,这个ServiceImpl类必须实现所有的存在于业务服务接口中的方法。该代码看上去如下所示:

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;
 }
}
  你应该已经注意到,该服务需要一个TasksJdbcDAO。反过来,这个对象实现了TasksDAO接口。因此,我们将通过BeanFactory来把DAO注入到该服务中。在此,我们碰巧有一个TasksJdbcDAO类-bean工厂可以使用它来实现这一目的。然而,既然这个类派生于JdbcDaoSupport,那么我们知道我们需要注入一个DataSource或让bean工厂为我们注入该DataSource。现在这个bean配置文件看上去如下所示:

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Eclipse中的IAdaptable分析

下一篇:每个Java初学者都应该搞懂的六个问题