第08章 EJB开发——DAO数据库访问_第1页
第08章 EJB开发——DAO数据库访问_第2页
第08章 EJB开发——DAO数据库访问_第3页
第08章 EJB开发——DAO数据库访问_第4页
第08章 EJB开发——DAO数据库访问_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

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

文档简介

1、SessionBean的DAO数据库访问内容提要n数据库连接池和数据源nJBoss中数据源的建立nLomboz建立DAO示例一、数据库连接池和数据源1、通过JDBC直接连接数据库nJava中访问数据库的常见方法是通过JDBC建立和数据库之间的连接,然后通过在Java语言中使用SQL进行对数据库中的表进行查询、修改和插入加载JDBC驱动创建连接对象创建Statement对象执行SQL获取结果集2、通过数据源访问数据库n数据库连接需要数据库系统为此连接分配相应的资源,是一个非常耗时的操作。为了减少创建连接的时间,可以利用Java服务器预先建好一定数量的JDBC连接,当客户程序需要连接数据库时,直接

2、将分配好的连接取出使用,可以大大缩短连接时间。这种预先建立好的JDBC连接就称为数据库连接池n在Java服务器中,可以为数据库连接池配置一个JNDI名称,通过JNDI服务提供给使用者,这个JNDI名称所代表的数据库连接池就被称为数据源3、DAO模式n可以通过建立一个接口(Interface)文件,用来抽象数据库的访问行为,如将查找、删除、增加、修改等操作声明成相应的方法,然后用一个类实现该接口中定义的方法,通过数据源访问相应的数据库。这种数据库访问模式称为DAO模式nDAO模式分离了数据库的具体访问实现代码和使用代码,常用于EJB中会话Bean的数据库访问。通过DAO模式,数据库访问代码和会话

3、Bean的Bean类代码相分离,数据库的具体访问代码不是在Bean类中,而是在DAO的实现类中编写。这种方式有助于提高Bean类代码的通用性,有利于会话Bean在使用不同的数据库时的移植工作在Session Bean中使用DAO的图示会话Bean实例DAO对象数据库系统EJB容器二、JBoss中数据源的建立1、JDBC驱动程序库的安装n由于访问特定的数据库需要相应的JDBC驱动程序,所以在建立数据源之前应将相应的JDBC驱动程序加入到Java服务器的classpath路径中n在JBoss服务器中,只需要将相应的类库文件拷贝到JBoss安装目录的server/lib目录中。如启动配置文件采用默认

4、的文件夹,则只需将相应的JDBC驱动类库文件(一般是jar文件)拷贝到JBoss安装目录的server/default/lib子文件夹中即可n如果通过jdbc-odbc桥连接数据库,则无需拷贝相应的JDBC驱动类库2、数据源文件的建立n在JBoss中,数据源的建立需要在JBoss启动配置文件夹的deploy目录中建立以“-ds”为文件名后缀的xml文件。由于不同数据库的连接建立的方式也不尽相同,JBoss服务器依靠这种xml文件才能知道如何连接相应的数据库2、数据源文件的建立n在JBoss安装目录的docs/examples/jca中,有许多常见数据库的数据源文件(即上述的“-ds”为后缀的x

5、ml文件)示例文件,文件名和其代表的数据库的名字是对应的,如mssql-ds.xml代表是微软的SQLServer数据库的数据源示例配置文件,msaccess-ds.xml是Access数据库的数据源配置文件。n建立自己的数据源文件时,可以直接将上述示例文件拷贝到JBoss启动配置文件夹中的deploy文件夹中,然后对文件中的一些配置项目的值加以修改即可。文件的名称也可以进行修改,但一定要以“-ds”作为文件名的后缀,同时要注意不要修改扩展名xmlnJBoss在启动时将自动读取这些以-ds为文件名后缀的xml文件,根据这些文件中的标签中指定的名称建立数据源的JNDI名JBoss中自带的各种数据

6、库的数据源文件Oracle的数据源文件,带“xa”的表示该jdbc驱动支持分布式事务处理JBoss安装路径下的docsexamplesjca文件夹将需要的数据源文件拷贝到JBoss安装路径的启动配置文件夹中的deploy目录,图中为ecdemodeployJBoss预先已经设置好了Hypersonic SQL的数据源文件,名为hssql-ds.xml,该文件设定Hypersonic的数据源的JNDI名称为DefaultDS3、hsqldb-ds.xml数据源文件的内容n该数据源文件是JBoss自带的Hypersonic SQL的数据源配置文件,这里的文件内容作了一些删节。n该数据源文件的开头指

7、定了其xml的版本号和编码类型 DefaultDS jdbc:hsqldb:hsql:/localhost:1701 org.hsqldb.jdbcDriver sa 5 HsqlDbRealm 3、 hsqldb-ds.xml数据源文件的内容n标签指定了该xml文件的性质为数据源配置文件,指定了该数据源的名称,可以将其改为其他名字,但不能和deploy文件夹中其他数据源文件中规定的JNDI名称重名 DefaultDS jdbc:hsqldb:hsql:/localhost:1701 org.hsqldb.jdbcDriver sa 5 HsqlDbRealm DefaultDS jdbc:h

8、sqldb:hsql:/localhost:1701 org.hsqldb.jdbcDriver sa 5 HsqlDbRealm 3、 hsqldb-ds.xml数据源文件的内容n和标签指定了该数据源连接数据库的JDBC连接所需的url和JDBC驱动类的名称,可根据数据库的JDBC手册察看这两项的配置值3、 hsqldb-ds.xml数据源文件的内容n标签和标签指定了连接数据库所需的账号和密码n在Hypersonic SQL中,此项为可选项 DefaultDS jdbc:hsqldb:hsql:/localhost:1701 org.hsqldb.jdbcDriver sa 5 HsqlDb

9、Realm 3、 hsqldb-ds.xml数据源文件的内容n标签指定了数据源为应用程序建立的最小数据库连接的数目n指定了数据库安全验证的方式 DefaultDS jdbc:hsqldb:hsql:/localhost:1701 org.hsqldb.jdbcDriver sa 5 HsqlDbRealm 4、几点说明n不同数据库的数据源文件内容都有所不同,但都有JNDI名字的配置项。将相应的配置文件拷贝到启动配置文件夹的deploy子目录后,要保证各文件中定义的JNDI数据源名字不能相同n数据源文件中以及的配置值一般情况下都要依据在数据库建立的数据库名和表的名称加以修改n所有的修改必须要重新

10、启动JBoss才能起作用n如果采用JBoss自带的Hypersonic SQL数据库,那么hssql-ds.xml文件的内容无需修改,就可直接使用,此时数据源的JNDI名为DefaultDS三、利用Lomboz建立DAO1、Lomboz中的DAO功能支持nLomboz简化J2EE开发的实质是利用了XDoclet的功能,而XDoclet自动生成各种文件的原理是解析源代码中的XDoclet注释,依据这些注释生成EJB所需的接口和部署描述文件。nXDoclet采用什么目录存放生成的接口和部署描述符?XDoclet如何协助生成其他辅助的类文件(如DAO的接口和实现文件)?这些都要依靠Lomboz为我们

11、生成的XDoclet的配置文件,该文件名为xdoclet.xml,位于Lomboz工程中的EJB模块所在的目录的META-INF文件夹中(注意,该文件在Lomboz早期的版本中名为ejbgenerate.xml)Lomboz工程中的xdoclet.xml配置文件在xdoclet.xml文件中的DAO标签n在xdoclet.xml文件中加入标签,即可让XDoclet在源文件中解析和dao相关的XDoclet注释,自动生成DAO所需的接口文件和类文件n注意:新版的Lomboz(2.1.2以上版本)已经会自动加入该标记,所以如果使用Lomboz的新版无需此步骤2、DAO示例工程的主要内容n本节将创建

12、一个名为ShopCart的有状态会话Bean,用来表示网上商城中常见的购物车。该会话Bean用一个Vector类型的成员暂时存储用户购买的商品,当用户下订单时,利用DAO对象将用户购买的商品存入数据库,并生成相应的订单。n本示例采用的数据库为JBoss自带的Hypersonic SQL,所以无需额外的数据库软件n该Bean类中共有三个商业方法,一个是addItem,用来记录用户购买的商品,另外两个是placeOrder和getOrder,分别用来下订单和获得给定订单号的订货清单,由于这两个方法都要访问数据库,所以都放在DAO的实现类中进行实现,3、在Lomboz中建立DAO示例的步骤n建立一个

13、名为DAODEMO的Lomboz J2EE工程n在该工程中加入名为Business的EJB模块n建立一个名为ShopCart的有状态Session Bean,并将该Bean加入Business模块n修改xdoclet.xml文件,加入标签n在ShopCartBean.java文件中加入addItem、placeOrder、getOrder商业方法的定义,并加入一个placeOrder的重载方法。在ShopCartBean中加入DAO的类级注释,在getOrder和placeOrder重载方法上加入DAO方法级调用注释,n建立DAO的实现类n生成所需的DAO接口和其他文件,并修改DAO实现类的定

14、义,实现placeOrder和getOrder等方法n为ShopCartBean加入所需的JDBC等资源注释,再次生成接口及其它文件n修改JBoss的Statulful Bean相关的配置文件,启动JBoss,启动Hypersonic控制台,创建所需的表和数据n部署ShopCartBeann编写测试客户端程序(1)创建J2EE工程,添加EJB模块n按第七章-用Lomboz简化EJB的开发中介绍的步骤,创建一个名为DAODEMO的Lomboz J2EE工程,并在工程中加入一个名为Business,以JBoss3.2.1为目标服务器的EJB模块,(2)添加Bean类n利用Lomboz EJB Cr

15、eate Wizard创建一个名为ShopCart的Stateful Session Bean,所在的包为edu.ec.session,注意按图中所示填如相应的名称自动生成的ShopCartBean类代码Lomboz自动生成的XDoclet注释,注意type属性的取值Lomboz自动为类加上了“Bean”后缀(3)将ShopCartBean类加入EJB模块(4)在xdoclet.xml中添加dao标签如果使用Lomboz2.1.2以下的版本,请在图中所示的位置中加入代码,注意不要忘了最后的“/”号,Lomboz2.1.2以上版本无需此步骤(5)添加addItem商业方法naddItem方法负责

16、把客户选购的商品按照其代码存入一个Vector类型的变量中,形式参数itemId代表商品的库存代码(6)加入placeOrder和getOrder商业方法n参考图示,用同样的方法加入以下两个商业方法nplaceOrder接受用户名作为形式参数,负责将用户下的商品代码存入order表中,返回值是该用户的订单号ngetOrder以订单号为形式参数,返回是该订单所定的货物清单列表(以字符串数据的形式)(7)利用类向导创建DAO实现类如图中所示,在新建类向导的对话框中输入DAO的实现类的相关内容,类所在的包为edu.ec.dao,类的名称为OrderDAOImpl(8)在ShopCartBean类中加

17、入类级DAO注释n按照图示,在类级XDoclet注释中加入DAO相关的注释,ejb.dao后面的class属性指定了DAO接口的名字,而imple-class指定了实现该接口的类名字,注意此处应与上一步添加的类的名称保持一致n在ShopCartBean中,还加入了一个Vector类型的私有变量goods,用来保存商品(9)在ShopCartBean类中加入方法级DAO注释n在getOrder方法前的XDoclet注释中加入图示的方法级DAO注释,代表此方法将在DAO实现类中具体实现(9)在ShopCartBean类中加入方法级DAO注释n在ShopCartBean类中加入一个placeOrde

18、r的重载方法,在该方法的上面加入dao.call name=placeOrder注释,该方法的具体实现将放在OrderDAOImpl类中实现(10)产生EJB Classes产生EJB Classes之后生成的ejbsrc目录中的文件nXDoclet自动生成的OrderDAO接口文件nShopCartSession继承了ShopCartBean类,并且在其中加入了DAO方法的调用自动产生的OrderDAO.java文件的内容n在ShopCartBean类中加入的ejb.dao类级注释生成了该文件,而在getOrder和placeOrder方法前加入的方法级注释dao.call生成了OrderD

19、AO接口中这两个方法的声明自动产生的ShopCartSession.java文件DAO内容ngetOrder方法首先调用了父类中的getOrder方法,然后调用了DAO实现类中的getOrder方法n静态同步方法getDao可以保证OrderDAO实现类(此处为OrderDAOImpl类)的实例只有一个,且不被多个线程同时调用(11)修改OrderDAOImpl类的定义n在OrderDAOImpl中加入implements关键字实现OrderDAO接口,需要加入init和getOrder方法的实现n加入了一个名为jdbcFactory的成员,用来保存数据源对象nplaceOrder比ShopC

20、artBean中的placeOrde商业r方法多了一个goods形参,用来传递客户定购的商品引入必要的包OrderDAOImpl类中方法功用概述ninit方法n用于OrderDAOImpl类的初始化工作,主要负责对私有成员jdbcFactory的赋值。init方法首先检查jdbcFactory是否已经赋值,如果没有赋值,就调用.InitialContext类中的lookup方法在服务器的JDNI资源中查找数据源的名字,找到后赋给jdbcFactorynplaceOrder方法n用于将顾客购买的商品写入Hypersonic的订单表(orders)和订单明细表(ordersde

21、tail)中,其中订单表有三个字段,id为订单编号,name为顾客的姓名,date为订单生成的日期;订单明细表中记录了某个订单的所定的具体商品,id和orders表中的id相对应,而itemname字段记录了顾客购买的商品名称ngetOrder方法n该方法负责在Hypersonic的ordersdetail检索特定订单号的定购的商品,并把结果放在字符串数组中返回实现init方法n按照图中所示,加入init方法的具体实现代码n本段代码查找数据源的JNDI名字,并将找到的数据源对象保存在私有成员jdbcFactory中n在查找JNDI名字的时候,注意,按照JNDI的系统名称规范,应在查找代码中对J

22、NDI名字前加入“java:comp/env/”的前缀,代表是在JNDI环境中(env)中查找资源名称,而数据源JNDI名字前面的jdbc前缀是在该会话Bean的部署描述符中规定的,用于告诉容器该JNDI名称属于JDBC数据源,由此可见,查找数据源的全名就是图中红框的“java:comp/env/jdbc/DefaultDS”实现placeOrder方法(主要代码)njdbcFactory是一个数据源(DataSource)对象,调用其getConnection方法获得对数据库的一个实际的连接实现placeOrder方法(主要代码)ngenerateGUID是一个在ShopCartUtil类中

23、(该类由XDoclet自动生成)定义的静态方法,可为每张订单生成一个唯一的标识实现placeOrder方法(主要代码)nprepareStatement是在java.sql.Connection类中定义的方法,可将其参数中的SQL语句发送到数据库进行预编译,以提高效率实现placeOrder方法(主要代码)nprepareStatement方法中的字符串类型的参数可以加入?来代表SQL语句中的参数,这些参数可以通过PreparedStatement类中的setXxx(Xxx代表相应的Java数据类型的名称)进行动态设置实现placeOrder方法(主要代码)nsetString用来设置prep

24、areStatement方法中的SQL语句中的类型为字符串的?参数,setString的第一个参数用来指定设定第几个“?”,第二个参数用来指定具体的数据实现placeOrder方法(主要代码)nexecuteUpdate用来执行preparedStatement中的SQL语句,专用于更新数据库,该语句在orders表中插入一条记录实现placeOrder方法(主要代码)n在执行完preparedStatement之后,一定要及时关闭和该语句相关联的资源,否则将造成资源不能及时释放,形成内存泄露实现placeOrder方法(主要代码)n该段代码在订单明细表(ordersdetail)中插入顾客购

25、买的商品,这些商品的名称存放在goods变量中,而goods变量是placeOrder的形式参数之一实现placeOrder方法(主要代码)n捕捉在try代码段中执行JDBC相关的语句时可能产生的SQLException异常。在异常出现后,在应用程序服务器的控制台输出中打印异常出现的原因实现placeOrder方法(主要代码)nfinally代码段确保任何情况下preparedStatement和数据源的连接都能够得到关闭,以便释放数据库为连接和语句释放的资源。没有这块语句有可能会引发内存泄露。placeOrder方法全部源码placeOrder方法源码(全)n这段代码用来获取当前的日期,并将

26、其存储在today变量中,以便placeOrder将此时间写入Hypersonic的orders表的date字段实现getOrder方法(主要代码)ngetOrder方法侧重于从数据库表中查询所需的数据,这些数据存储在订单明细表orderstail中,该表只有两个字段,一个为id,代表订单的编号,itemname代表商品的名称实现getOrder方法(主要代码)nPreparedStatement类中的executeQuery方法专用于执行查询语句,并将查询结果放入ResultSet类的一个实例中返回,这里这个变量为rs实现getOrder方法(主要代码)n第一次调用rs变量的next方法时,

27、rs结果集的数据指针位于第一条记录,而再次调用next方法时,如果还有记录,则会返回true,并将数据指针放在下一条记录上;如果已经到达记录尾,next方法将返回false实现getOrder方法(主要代码)nfinally段中的代码和placeOrder中的finally段中的代码的功用是一致的,这里多了一条关闭结果集rs的语句getOrder方法的全部源代码getOrder方法源码(全)n用goods向量类变量存储查询结果,再将其中的数据转化为字符串存入结果数组result中(12)修改ShopCartBean的placeOrder商业方法nplaceOrder商业方法中直接调用了Shop

28、CartSession类(该类是Lomboz自动生成的)的静态方法getDao,用以获取一个DAO对象,以便访问在OrderDAOImpl类中实现的placeOrder方法。n注意此处代码是写在的placeOrder商业方法中,而不是写在其重载的DAO方法中(13)修改ShopCartBean的addItem商业方法n在addItem中加入图中所示代码,这段代码负责将私有goods成员进行初始化并将顾客购买的商品加入到goods中(14)为ShopCartBean加入ejbCreate方法n在ShopCartBean中加入一个私有成员name,用来记录用户的名称,然后在添加两个ejbCreat

29、e方法,一个用于匿名登录的用户,一个用于输入用户名的用户。方法级注释ejb.create-method可在Home和LocalHome接口中生成相应的create方法的声明(15)在ShopCartBean中加入资源注释nEnterprise JavaBean所需的资源需要在部署描述符中加以定义,图中所示的XDoclet注释可以帮助生成部署描述符所需数据源的部署描述元素(16)在ShopCartBean中加入会话Bean的配置策略注释njboss.container-configuration类级注释向JBoss容器说明了采用什么样的策略来管理有状态SessionBean,name属性的值必须

30、和JBoss启动配置文件夹中conf目录中的standardjboss.xml中的配置项目名称相同,此处的值为“Standard Stateful SessionBean”。该值也是JBoss默认的管理有状态SessionBean的策略,所以该注释可以省略不写(17)修改JBoss中有关会话Bean的配置文件nstandardjboss.xml是JBoss服务器重要的配置文件,它位于启动配置文件夹的conf子目录中n在standardjboss.xml文件中,找到“Standard Stateful Session”配置项,如左图所示,其中标记规定了有状态会话Bean不被调用时的最长存活周期,

31、标记规定JBoss多长时间清除哪些已经达到时间的有状态的会话Bean。为了达到验证效果,将这两个值分别改为30秒和3秒 Standard Stateful SessionBean 30 3 (18)再次在Eclipse中生成EJB相关文件n再次执行generate ejb classes指令后在ejb-jar.xml文件中生成的资源描述标记njboss.xml中的资源标记和JNDI名称ejb-jar.xml文件中的资源定义jboss.xml文件中的资源定义(19)启动JBoss服务器n在Eclipse中JBoss服务器的启动也可以利用Lomboz的J2EE View,首先选中需启动的服务器,在

32、Lomboz J2EE View内点击右键,选Run Server,即可启动JBoss服务器(20)启动Hypersonic控制台点击此按钮启动Hypersonic控制台(21)创建所需的表n按图中所示输入所需的SQL语句,该语句创建了ORDERS和ORDERSDETAIL表,再按EXECUTE SQL STATEMENT按钮n输入框的下方提示了Hypersonic的相关语法n创建表之后,点击view-Refresh Tree,就可以在左侧的树视图中看到新建的表名n结果窗口中显示执行的SQL语句成功或错误信息(22)部署ShopCartBeann在Lomboz J2EE视图中,选定Buines

33、s模块,再点击右键,选Deploy即可部署Business模块。n部署完成后在Console视图中切换到JBoss的输出,可以看到JBoss输出的部署成功信息(23)编写测试客户程序n按图示输入测试客户端的相关信息在Pakage Explore中双击该方法名就可在DAOTest.java源文件中定位testBean方法修改客户程序,在testBean方法中加入如下测试代码调用getHome静态方法,获取Home接口对象之后调用Home接口的create方法,创建ShopCart远程接口对象,将该远程EJB对象赋给myBean变量。之后每次调用myBean中的对应于ShopCart中商业方法,都会导致对JBoss服务器中的ShopCart实例的商业方法的调用。由于ShopCart是一个有状态会话Bean,它会自动维护每个使用ShopCart的客户程序的数据客户程序解释调用ShopCart的addItem商业方法,购买Bycle和Shoes。ShopCart实例将顾客购买的商品名称存放在goods私有变量中,以供placeOrder方法写入H

温馨提示

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

评论

0/150

提交评论