J2EE项目实训 Spring框架技术——第2章 Spring框架中的对象管理技术(第2部分)_第1页
J2EE项目实训 Spring框架技术——第2章 Spring框架中的对象管理技术(第2部分)_第2页
J2EE项目实训 Spring框架技术——第2章 Spring框架中的对象管理技术(第2部分)_第3页
J2EE项目实训 Spring框架技术——第2章 Spring框架中的对象管理技术(第2部分)_第4页
J2EE项目实训 Spring框架技术——第2章 Spring框架中的对象管理技术(第2部分)_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料第2章 spring框架中的对象管理技术(第2/3部分)7、将数据源datasource注入到应用系统的持久层的dao组件中应用系统为了能够实现数据的持久化存储,一般都必须首先获得数据库连接(该数据库的连接可以是基于datasource接口实现的数据库连接池的实现),然后再访问并操作数据库表中的数据实现系统的持久化功能。在spring框架中,为应用系统提供了数据库连接方面的支持,并且其数据库连接是基于datasource接口实现的数据源对象。(1)实现数据库连接的两种方式在java平台的应用程序中,实现数据库的连接一般有两种常用的方式:l

2、 一种是通过java.sql.drivermanager的方式来得到数据库连接,这种方式称为jdbc直接连接该方式不依赖于应用服务的支持,但是也不提供数据库连接池的功能并且每次都要进行物理上的连接。在高并发访问的web应用系统中会降低系统的性能。l 另外一种方式是通过javax.sql.datasource接口的实现类方式来得到数据库连接,这种方式称为基于数据库连接池的连接在传统的基于j2ee的应用系统中,为了能够获得基于datasource接口的实现类所提供的数据库连接,一般需要通过应用服务器的jndi(java naming and directory interface ,java 命名

3、和目录接口)来得到数据源(javax.sql.datasource)对象,然后再通过该数据源对象来得到相应的数据库连接。常见的j2ee平台中的应用服务器都支持这种基于jndi的数据库连接池的连接方式。但是也在某些应用场合下,开发者希望应用系统能够脱离j2ee 应用服务器容器的环境,也就是需要在应用服务器容器之外来使用数据库(比如单元测试等)。而spring框架为开发者提供了一个统一使用数据源的解决方案,并通过依赖注入的方式将数据源datasource接口的实现类的对象实例注入到应用系统的持久层中的dao组件中。这样可以避免开发者自己编程和实现繁琐的jndi代码来得到数据源。(2)在spring

4、框架中提供了对datasource接口的实现类的对象实例注入支持在spring框架中提供了对datasource的注入支持,不但可以通过jndi获取应用服务器的数据源,也可以直接在spring容器中配置数据源。这样在改变应用系统中的数据源时只要在spring框架中ioc容器的xml配置文件中修改相应的配置项目,而不用修改dao组件程序代码。下面的【例2-16】中给出了一个将datasource对象实例注入到系统的dao组件的代码示例,并请注意其中的黑体部分的代码。【例2-16】 将datasource对象实例注入到系统的dao组件的代码示例package com.px1987.springex

5、ample.dao;import java.sql.*;import javax.sql.*;public class daointerfaceimpl implements daointerface private connection con=null;private datasource datasource=null;public void setdatasource(datasource datasource) this.datasource = datasource;/ . 其它的成员定义(3)spring框架中提供了datasource接口的实现类在spring框架中,提供了一个

6、drivermanagerdatasource类,它实现了javax.sql.datasource接口。该类在org.springframework.jdbc.datasource.包中定义。但由于drivermanagerdatasource类并沒有真正地提供数据库连接池的功能实现,只用于一般的测试开发中,每次调用getconnection()方法获取新连接时,只是简单地创建一个新的连接。因此,这个数据源类比较适合在单元测试或简单的独立应用环境中使用,因为它不需要额外的依赖类。如果在实际的项目开发的应用环境中需要提供数据库连接池的支持,并且不希望受制于j2ee应用服务器的限制,一般可以选择a

7、pache dbcp连接池的功能实现。(4)项目的ioc的配置文件【例2-17】 该项目的ioc的配置文件中的部分标签示例 net.sourceforge.jtds.jdbc.driver jdbc:jtds:sqlserver:/:1433/webstudydb sa 1234 (5)也可以使用apache的dbcp组件来获得带连接池功能的datasource实现类的对象apache的dbcp是一个依赖jakarta commons-pool对象池机制的数据库连接池,利用它可以实现与j2ee 应用服务器容器无关。其datasource接口的实现类basicdatasourc

8、e提供了close()方法以关闭数据源,所以必须设定destroy-method= close 属性,以便spring容器关闭时,数据源能够正常关闭。【例2-18】 使用apache的dbcp组件来获得带连接池功能的datasource定义的示例 net.sourceforge.jtds.jdbc.driver jdbc:jtds:sqlserver:/:1433/webstudydb sa 1234 注意:现在是使用mons.dbcp.basicdatasource类作为注入的datasource数据源,为了在项目中能够使用dbcp的功能,开发者

9、必须要将commons-dbcp-1.2.1.jar加入到classpath中,另外开发者还需要将commons-pool-1.2.jar与commons-collections.jar等apache的dbcp的实现类的*.jar文件同样要加入到classpath中。(6)也可以配置使用j2ee应用服务器容器所提供的jndi数据源如果应用系统中的j2ee应用服务器容器提供了针对jndi数据源或者应用系统部署在高性能的应用服务器(如bea weblogic或ibm websphere等)上,可以使用应用服务器本身提供的数据源。但由于应用服务器的数据源是使用jndi来获得的,spring为此专门提

10、供一个引用jndi资源的jndiobjectfactorybean组件类。开发者也可以简单地的换上这个jndi数据源,下面的jndiname属性为开发者所设置的数据源的jndi名称,从而通过jndiname指定引用的jndi数据源名称。l 针对tomcat或者ibm websphere应用服务器容器【例2-19】在tomcat容器中的jndi数据源的配置示例 java:/comp/env/jdbc/datasource l 针对bea weblogic的应用服务器容器【例2-20】在weblogic容器中的jndi数据源的配置示例 jdbc/datasource 从上面的xml配置文件中可以得

11、知,通过使用spring框架中的依赖注入的特性,不仅能够统一使用不同的数据源的实现类。而且如果应用系统的使用环境发生变化,那么只需要修改spring的ioc的xml配置文件即可达到满足新的应用环境的要求。1.1 体验spring的ioc容器对开发过程中的简化1.1.1 将datasource对象注入到应用系统dao组件中为了使读者能够对spring的ioc容器对开发过程中的简化有所体验,下面对如图1.4中所示新建的java项目springj2seapp进一步地进行功能扩展。1、在本项目中再增加一个dao的接口(1)添加一个dao组件的接口右击项目名称,选择【新建】菜单,再选择【接口】菜单项,将

12、出现下面的图2.1所示的对话框。在接口名称的输入框中输入接口名称为daointerface,包名称为com.px1987.springexample.dao。请见下面的图2.1所示的状态。图2.1 增加一个dao类的接口daointerface的对话框(2)在该接口中添加数据访问方法的声明和定义【例2-21】 daointerface接口中的方法声明package com.px1987.springexample.dao;import java.sql.*;public interface daointerface public resultset selectdbdata(string se

13、lect_sqlstatement); public void closecon();注意:为了将本示例进行简化和节省本书的篇幅,在该dao接口中只给出部分方法的定义。2、再添加该daointerface接口的实现类(1)在该项目中添加一个dao接口的实现类daointerfaceimpl右击项目名称,选择【新建】菜单,再选择【类】菜单项,将出现下面的图2.2中所示的对话框。在该对话框的类名称中输入类名称为daointerfaceimpl,包名称为 com.px1987.springexample.dao,并选择所要实现的接口为前面的daointerface接口。请见下面的图2.2所示的状态。

14、图2.2 添加dao接口的实现类daointerfaceimpl的对话框(2)编程该dao组件的实现类daointerfaceimpl的代码【例2-22】 dao组件的实现类daointerfaceimpl的代码示例package com.px1987.springexample.dao;import java.sql.*;import javax.sql.*;public class daointerfaceimpl implements daointerface private datasource datasource=null;private connection con=null;p

15、ublic daointerfaceimpl() public resultset selectdbdata(string select_sqlstatement) try con = datasource.getconnection(); catch (sqlexception ex) system.out.println(ex.getmessage(); resultset rs=null; try java.sql.preparedstatement pstmt = con.preparestatement(select_sqlstatement, resultset.type_scro

16、ll_sensitive, resultset.concur_updatable); rs = pstmt.executequery(); catch (sqlexception e) system.out.println(e.getmessage(); return rs;public void closecon() try con.close(); catch (sqlexception e) system.out.println(e.getmessage();public void setdatasource(datasource datasource) this.datasource

17、= datasource;3、修改【例1-18】中的业务组件类userinfomanage为下面的【例2-23】中所示的代码在该业务功能的实现类中通过构造方法获得以构造方法的参数注入的dao组件类的对象实例,然后再根据dao组件类中的数据访问方法进行数据访问操作。具体的实现的代码请见下面的【例2-23】中所示的结果。【例2-23】 修改后的业务组件类userinfomanage的代码示例package com.px1987.springexample.model;import java.sql.resultset;import java.sql.sqlexception;import java

18、.util.date;public class userinfomanage implements userinfointerfaceboolean okornot;private date datebean=null;daointerface onedaobean=null;public userinfomanage() super();public userinfomanage(userinfovo oneuserinfo,daointerface onedaobean) super();this.datebean=datebean;this.onedaobean=onedaobean;d

19、ouserlogin(oneuserinfo);public boolean douserlogin(userinfovo oneuserinfo)string username=oneuserinfo.getusername();string useruserpassword=oneuserinfo.getuserpassword();string sqltext=select * from userinfo where username =+username+ and userpassword =+useruserpassword+;resultset rs=onedaobean.sele

20、ctdbdata(sqltext);try if(rs.next()okornot=true;elseokornot=false;catch (sqlexception e) e.printstacktrace();onedaobean.closecon();return okornot;public boolean getuserlogin()return okornot;4、修改spring ioc配置文件springapplication.xml以添加datasource和dao组件的注入【例2-24】 修改后的springapplication.xml文件内容的示例 adminadmi

21、n net.sourceforge.jtds.jdbc.driver jdbc:jtds:sqlserver:/:1433/webstudydb sa 1234 5、准备本示例中的数据库及数据库表(1)本示例中的数据库文件为ms sqlserver2000的数据库系统本示例计划采用ms sqlserver2000的数据库系统,数据库文件为webstudydb,在该数据库中有一个userinfo数据库表。该数据库表的表结构请见下面的图2.3所示。图2.3 本示例中的数据表userinfo的表结构(2)该数据库的用户帐号为sa,并且密码为12346、将jdts的jdbc驱动程序的

22、*.jar文件导入到项目中本示例计划采用jdts的jdbc驱动程序(读者可以从进行下载)。将jdts的jdbc驱动程序的*.jar文件导入到项目中,请见下面的图2.4所示。图2.4 将jdts的jdbc驱动程序的*.jar文件导入到项目中注意:由于使用微软的提供的ms sqlserver2000的jdbc驱动程序来连接ms sqlserver2000数据库系统时,如果数据库表中存在text, ntext, image等大型字段,对于resultset的字段读取必须按照从左向右的顺序读取,不能从右往左、并且也不能连续读2次读取。因此,建议读者在自己的计算

23、机中最好应用jdts的jdbc驱动程序,性能也比较高,而且还能够连接ms sqlserver2005。7、再次执行该测试类usermanagetest程序(1)启动usermanagetest测试类程序右击usermanagetest测试类程序,在弹出的菜单中选择【运行方式】菜单项目,然后再选择【java应用程序】菜单项目。请见图2.5所示。图2.5 执行usermanagetest类程序(2)将出现登录成功的结果状态,如图2.6所示。图2.6中所显示的执行结果表明整个应用系统中的各个类已经被spring的ioc容器所管理,并且datasource和dao组件正确地注入到项目中各个相关的组件类

24、中,程序应该是正确的,并且也正确地访问了数据库系统。图2.6 执行结果状态显示1.1.2 体验spring的ioc容器对dao 的松散的支持由于控制反转ioc 是一种使应用程序逻辑外在化的设计模式,开发者如果是基于这种编程模式进行系统的开发,将使得提供服务的目标组件是被“注入”的而不是被“直接写入”到请求者(客户端)的代码中;这样将能够大大地减少对象的请求者对服务提供者的特定实现逻辑的依赖。因为开发者已经将依赖的具体“定位信息”从请求者中分离出来了,而在spring框架中则是将它们放在ioc的xml配置文件中。为了能够让读者对上面的特性有所体验,下面通过具体的示例来进一步地加以说明。在下面的实

25、现示例中,通过改变datasource接口的实现方式来模拟应用系统中的数据源发生变化的情况。此时再观察应用系统中的上层组件(比如业务层组件)是否需要进行修改!1、改变项目中的datasource的实现方式将本示例中的datasource的实现方式改变为apache dbcp的datasource的实现,也就是替换org.springframework.jdbc.datasource.drivermanagerdatasource类为mons.dbcp.basicdatasource类。(1)改变datasource的实现类只需要将springapplication.xml文件中的datasource的实现类由spring框架中所提供的org.springframework.jdbc.datasource.drivermanagerdatasource类改变为apache的dbcp的实现类mons.dbcp.basicdatasource。当然springapplication.xml文件中的其它的配置标签不需要改变。(2)修改springapplication.xml文件中的datasou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论