`
gaoyuntao2005
  • 浏览: 311334 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

入门 11 - DataSource注入

阅读更多


对于不同的数据库存取需求,我们使用JDBC来解决这个问题,对于不同的数据连接来源需求,Spring则提供了DataSource注入,更换数据来源只要在Bean定义文件中修改配置,而不用修改任何一行程序。 

因应不同的系统,应用程序可能使用不同的数据来源,但如纯綷的使用 JDBC、透过连接池、或是透过JNDI等等,数据来源的更动是底层的行为,不应影响到上层的业务逻辑,为此,您可以在需要取得连接来源的Bean上保留一个数据来源注入的接口,让依赖的数据来源由该接口注入。例如我们来写一个简单的Bean:

DataBean.java

package onlyfun.caterpillar;

                                                                                

import javax.sql.DataSource;

import java.sql.Connection;

                                                                               

public class DataBean {

    private DataSource dataSource;

                                                                                

    public void setDataSource(DataSource dataSource) {

        this.dataSource = dataSource;

    }

                                                                               

    public void testDataSource() {

        try {

            Connection connection = dataSource.getConnection();

            if(connection != null)

                System.out.println("test ok!");

        }

        catch (Exception e) {

            e.printStackTrace();

        }

    }

}

这是一个简单的测试Spring DataSource注入的程序,我们透过javax.sql.DataSource接口来注入数据来源,Spring提供了 org.springframework.jdbc.datasource.DriverManagerDataSource来取得 DataSource,它实作了javax.sql.DataSource,您将之当作一个Bean,之后再注入DataBean中即可,Bean定义档可以这么撰写:

<?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="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <property name="driverClassName">

            <value>com.mysql.jdbc.Driver</value>

        </property>

        <property name="url">

            <value>jdbc:mysql://localhost:3306/TestDB</value>

        </property>

        <property name="username">

            <value>caterpillar</value>

        </property>

        <property name="password">

            <value>123456</value>

        </property>

    </bean>

                                                                               

    <bean id="dataBean" class="onlyfun.caterpillar.DataBean">

        <property name="dataSource">

            <ref bean="dataSource"/>

        </property>

    </bean>

</beans>

如果您之前只使用spring-core.jar这个类别库,您还必须加入 spring-dao.jar, org.springframework.jdbc.datasource.DriverManagerDataSource是包括在这个类别库中,如果您使用的是spring.jar,当中已经包括了,无需加入任何的jar,当然,为了使用JDBC,您必须要有JDBC驱动程序的jar檔。 

可以用下面这段程序简单的测试一下:

BeanDefinitionRegistry reg = new DefaultListableBeanFactory();

XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(reg);

                                                                                

reader.loadBeanDefinitions(new ClassPathResource("bean.xml"));;

                                                                               

BeanFactory bf = (BeanFactory) reg;

DataBean dataBean = (DataBean) bf.getBean("dataBean");

dataBean.testDataSource();


DriverManagerDataSource并没有提供连接池的功能,只能作作简单的单机连接测试,现在假设连接测试没有问题了,您想要换上DBCP以获得连接池的功能,则原程序不用更动,只要改改Bean定义档就可以了:

<?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="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

        <property name="driverClassName">

            <value>com.mysql.jdbc.Driver</value>

        </property>

        <property name="url">

            <value>jdbc:mysql://localhost:3306/TestDB</value>

        </property>

        <property name="username">

            <value>caterpillar</value>

        </property>

        <property name="password">

            <value>123456</value>

        </property>

    </bean>

    <bean id="dataBean" class="onlyfun.caterpillar.DataBean">

        <property name="dataSource">

            <ref bean="dataSource"/>

        </property>

    </bean>

</beans>


现在我们使用的是org.apache.commons.dbcp.BasicDataSource作为注入的 DataSource源,为了使用DBCP的功能,您必须要将commons-dbcp.jar加入CLASSPATH中,另外您还需要commons- pool.jar与commons-collections.jar,这些都可以在Spring的相依版本中的lib目录下找到。 

注意到我们在dataSource Bean上宣告了destroy-method,如此可以确保BeanFactory在关闭时也一并关闭BasicDataSource。 

如果您要直接使用JDBC来进行数据存储,使用org.springframework.jdbc.datasource.DataSourceUtils来取得Connection会是更好的方式:

Connection conn = DataSourceUtils.getConnection(dataSource);


这样作的好处是,所有的SQLException都被Spring的DataAccessException子类CannotGetJdbcConnectionException包装起来。您可以获得更多的信息,并保证存储层的可移值性。 


关闭Connection时,可以用下面的方式:

DataSourceUtils.closeConnectionIfNecessry(connection, dataSource);


如果您的Servlet容器提供了JNDI资料源,您也可以简单的换上这个数据源:

<?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="dataSource" class="org.springframework.indi.JndiObjectFactoryBean">

        <property name="jndiName">

            <value>jdbc/TestDB</value>

        </property>

    </bean>

    <bean id="dataBean" class="onlyfun.caterpillar.DataBean">

        <property name="dataSource">

            <ref bean="dataSource"/>

        </property>

    </bean>

</beans>


为了使用org.springframework.indi.JndiObjectFactoryBean,您必须加入 spring-context.jar这个类别库,jndiName实际上要根据您所设定的JNDI查询名称,您可以在下面这个网址找到有关于 Tomcat中JNDI设定的方式: 
http://www.caterpillar.onlyfun.net/phpBB2/viewtopic.php?t=1354

分享到:
评论

相关推荐

    ASP.NET数据库入门经典--C#编程篇

    总结起来,ASP.NET数据库入门经典--C#编程篇主要涉及以下知识点:ADO.NET组件的使用,如SqlConnection、SqlCommand、SqlDataAdapter和DataSet;C#中与SQL Server的交互,包括建立连接、执行查询、事务处理;以及ASP...

    ASP.NET数据库入门经典--C编程篇_程序设计

    ASP.NET提供了多种数据绑定机制,如DataSource控件和LINQ to SQL,使得可以将数据库数据直接绑定到Web页面上的控件,实现数据的显示和编辑。了解如何使用GridView、ListView等控件进行数据绑定,可以提升Web应用的...

    spring boot入门--创建项目到数据库连接

    我们可以使用`@Autowired`注入Repository实例,然后编写测试用例。例如: ```java @SpringBootTest public class UserRepositoryTest { @Autowired private UserRepository userRepository; @Test public void...

    ASP.NET 2.0入门经典--C#编程篇(中文doc版)

    本资源为"ASP.NET 2.0入门经典--C#编程篇"的中文DOC版,适合初学者学习,虽然不包括英文PDF和配套源码,但仍能提供基本的理论知识和实践指导。 文档内容可能涵盖了以下几个主要知识点: 1. **ASP.NET基础**:介绍...

    mybatis学习-入门(2)-整合spring

    标题"mybatis学习-入门(2)-整合spring"暗示了这是一个关于如何将MyBatis与Spring进行集成的教程。在这个过程中,我们将探讨如何利用Spring的IoC容器来管理MyBatis的SqlSessionFactory和SqlSession对象,以及如何...

    struts2.0+spring2.0+hibernate3.0整合开发快速入门-4

    标题与描述均提到了“Struts2.0+Spring2.0+Hibernate3.0整合开发快速入门”,这表明文章旨在介绍如何将这三个框架整合在一起进行企业级Java应用的开发。接下来,我们将深入分析和解释这部分内容所涉及的关键知识点。...

    源码:【Spring+MyBatis+MySQL实战入门】一、MyBatis操作入门

    - 使用`@Autowired`注入Mapper接口,Spring会自动处理Mapper的实例化和依赖注入。 - 配置Mapper扫描,Spring会自动加载所有的Mapper接口。 通过这个压缩包中的"smm"文件,你可以看到具体的代码实现,包括Spring...

    spring入门代码项目

    通过这个入门项目,你将逐步理解Spring的核心机制,包括依赖注入、面向切面编程、数据库操作以及事务管理。这将为你后续深入学习Spring MVC、Spring Boot、Spring Data等高级特性和实践打下坚实的基础。记得结合项目...

    springboot入门代码

    本入门程序将引导你了解SpringBoot的核心特性和如何使用它来构建一个基础的Web应用,同时涵盖数据库操作和关键注解的使用。 1. **SpringBoot核心概念** - **自动配置**:SpringBoot通过`@EnableAutoConfiguration`...

    iBATIS-基础入门资料

    这样,iBATIS可以融入到Spring的依赖注入和事务管理中,增强整个应用的灵活性和可维护性。 总结,iBATIS是一个强大的数据访问框架,通过SQL Maps和DAOs,使得数据库操作更加简洁,同时提供了动态SQL、事务管理和...

    十天轻松入门ASP.NET教程

    - 数据绑定:DataSource控件与数据绑定表达式 - 事件处理:事件触发和事件处理程序 第四天:ASP.NET MVC基础 - MVC模式介绍:模型、视图、控制器 - 创建第一个ASP.NET MVC项目 - 视图模板和视图数据 -路由系统:...

    技术构建电子商务应用系统-从入门到提高

    本教程“技术构建电子商务应用系统-从入门到提高”旨在引导读者深入理解和熟练掌握使用JSP来开发高效、可扩展的电商系统。以下是关于JSP及电子商务应用系统构建的关键知识点: 1. JSP基础: - JSP是一种服务器端...

    spring boot入门

    ### Spring Boot 入门详解 #### 一、Spring 发展历程与 Java 配置方式 Spring 是一个开源框架,最初由 Rod Johnson 创建,目的是为了简化企业级应用的开发。随着时间的发展,Spring 框架经历了多个重要的阶段: #...

    一个SSH的入门完整例子

    在这个“一个SSH的入门完整例子”中,我们将深入探讨SSH框架的使用和配置。 首先,Struts是MVC(模型-视图-控制器)设计模式的一个实现,负责处理用户请求并展示响应。在Struts中,我们定义Action类来处理业务逻辑...

    mybatis中文版教程

    - **注入映射器**:通过`MapperFactoryBean`可以轻松地将数据映射器接口注入到任何Spring托管的Bean中。 - **自动配置**:对于某些情况,可以通过配置`MapperScannerConfigurer`来自动扫描和注册映射器接口。 #### ...

Global site tag (gtag.js) - Google Analytics