![第08章 EJB開發(fā)——DAO數(shù)據(jù)庫訪問_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/60c002f4-7571-4eaf-a3f0-72aba7a58079/60c002f4-7571-4eaf-a3f0-72aba7a580791.gif)
![第08章 EJB開發(fā)——DAO數(shù)據(jù)庫訪問_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/60c002f4-7571-4eaf-a3f0-72aba7a58079/60c002f4-7571-4eaf-a3f0-72aba7a580792.gif)
![第08章 EJB開發(fā)——DAO數(shù)據(jù)庫訪問_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/60c002f4-7571-4eaf-a3f0-72aba7a58079/60c002f4-7571-4eaf-a3f0-72aba7a580793.gif)
![第08章 EJB開發(fā)——DAO數(shù)據(jù)庫訪問_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/60c002f4-7571-4eaf-a3f0-72aba7a58079/60c002f4-7571-4eaf-a3f0-72aba7a580794.gif)
![第08章 EJB開發(fā)——DAO數(shù)據(jù)庫訪問_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/60c002f4-7571-4eaf-a3f0-72aba7a58079/60c002f4-7571-4eaf-a3f0-72aba7a580795.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、SessionBean的DAO數(shù)據(jù)庫訪問內(nèi)容提要n數(shù)據(jù)庫連接池和數(shù)據(jù)源nJBoss中數(shù)據(jù)源的建立nLomboz建立DAO示例一、數(shù)據(jù)庫連接池和數(shù)據(jù)源1、通過JDBC直接連接數(shù)據(jù)庫nJava中訪問數(shù)據(jù)庫的常見方法是通過JDBC建立和數(shù)據(jù)庫之間的連接,然后通過在Java語言中使用SQL進(jìn)行對(duì)數(shù)據(jù)庫中的表進(jìn)行查詢、修改和插入加載JDBC驅(qū)動(dòng)創(chuàng)建連接對(duì)象創(chuàng)建Statement對(duì)象執(zhí)行SQL獲取結(jié)果集2、通過數(shù)據(jù)源訪問數(shù)據(jù)庫n數(shù)據(jù)庫連接需要數(shù)據(jù)庫系統(tǒng)為此連接分配相應(yīng)的資源,是一個(gè)非常耗時(shí)的操作。為了減少創(chuàng)建連接的時(shí)間,可以利用Java服務(wù)器預(yù)先建好一定數(shù)量的JDBC連接,當(dāng)客戶程序需要連接數(shù)據(jù)庫時(shí),直接
2、將分配好的連接取出使用,可以大大縮短連接時(shí)間。這種預(yù)先建立好的JDBC連接就稱為數(shù)據(jù)庫連接池n在Java服務(wù)器中,可以為數(shù)據(jù)庫連接池配置一個(gè)JNDI名稱,通過JNDI服務(wù)提供給使用者,這個(gè)JNDI名稱所代表的數(shù)據(jù)庫連接池就被稱為數(shù)據(jù)源3、DAO模式n可以通過建立一個(gè)接口(Interface)文件,用來抽象數(shù)據(jù)庫的訪問行為,如將查找、刪除、增加、修改等操作聲明成相應(yīng)的方法,然后用一個(gè)類實(shí)現(xiàn)該接口中定義的方法,通過數(shù)據(jù)源訪問相應(yīng)的數(shù)據(jù)庫。這種數(shù)據(jù)庫訪問模式稱為DAO模式nDAO模式分離了數(shù)據(jù)庫的具體訪問實(shí)現(xiàn)代碼和使用代碼,常用于EJB中會(huì)話Bean的數(shù)據(jù)庫訪問。通過DAO模式,數(shù)據(jù)庫訪問代碼和會(huì)話
3、Bean的Bean類代碼相分離,數(shù)據(jù)庫的具體訪問代碼不是在Bean類中,而是在DAO的實(shí)現(xiàn)類中編寫。這種方式有助于提高Bean類代碼的通用性,有利于會(huì)話Bean在使用不同的數(shù)據(jù)庫時(shí)的移植工作在Session Bean中使用DAO的圖示會(huì)話Bean實(shí)例DAO對(duì)象數(shù)據(jù)庫系統(tǒng)EJB容器二、JBoss中數(shù)據(jù)源的建立1、JDBC驅(qū)動(dòng)程序庫的安裝n由于訪問特定的數(shù)據(jù)庫需要相應(yīng)的JDBC驅(qū)動(dòng)程序,所以在建立數(shù)據(jù)源之前應(yīng)將相應(yīng)的JDBC驅(qū)動(dòng)程序加入到Java服務(wù)器的classpath路徑中n在JBoss服務(wù)器中,只需要將相應(yīng)的類庫文件拷貝到JBoss安裝目錄的server/lib目錄中。如啟動(dòng)配置文件采用默認(rèn)
4、的文件夾,則只需將相應(yīng)的JDBC驅(qū)動(dòng)類庫文件(一般是jar文件)拷貝到JBoss安裝目錄的server/default/lib子文件夾中即可n如果通過jdbc-odbc橋連接數(shù)據(jù)庫,則無需拷貝相應(yīng)的JDBC驅(qū)動(dòng)類庫2、數(shù)據(jù)源文件的建立n在JBoss中,數(shù)據(jù)源的建立需要在JBoss啟動(dòng)配置文件夾的deploy目錄中建立以“-ds”為文件名后綴的xml文件。由于不同數(shù)據(jù)庫的連接建立的方式也不盡相同,JBoss服務(wù)器依靠這種xml文件才能知道如何連接相應(yīng)的數(shù)據(jù)庫2、數(shù)據(jù)源文件的建立n在JBoss安裝目錄的docs/examples/jca中,有許多常見數(shù)據(jù)庫的數(shù)據(jù)源文件(即上述的“-ds”為后綴的x
5、ml文件)示例文件,文件名和其代表的數(shù)據(jù)庫的名字是對(duì)應(yīng)的,如mssql-ds.xml代表是微軟的SQLServer數(shù)據(jù)庫的數(shù)據(jù)源示例配置文件,msaccess-ds.xml是Access數(shù)據(jù)庫的數(shù)據(jù)源配置文件。n建立自己的數(shù)據(jù)源文件時(shí),可以直接將上述示例文件拷貝到JBoss啟動(dòng)配置文件夾中的deploy文件夾中,然后對(duì)文件中的一些配置項(xiàng)目的值加以修改即可。文件的名稱也可以進(jìn)行修改,但一定要以“-ds”作為文件名的后綴,同時(shí)要注意不要修改擴(kuò)展名xmlnJBoss在啟動(dòng)時(shí)將自動(dòng)讀取這些以-ds為文件名后綴的xml文件,根據(jù)這些文件中的標(biāo)簽中指定的名稱建立數(shù)據(jù)源的JNDI名JBoss中自帶的各種數(shù)據(jù)
6、庫的數(shù)據(jù)源文件Oracle的數(shù)據(jù)源文件,帶“xa”的表示該jdbc驅(qū)動(dòng)支持分布式事務(wù)處理JBoss安裝路徑下的docsexamplesjca文件夾將需要的數(shù)據(jù)源文件拷貝到JBoss安裝路徑的啟動(dòng)配置文件夾中的deploy目錄,圖中為ecdemodeployJBoss預(yù)先已經(jīng)設(shè)置好了Hypersonic SQL的數(shù)據(jù)源文件,名為hssql-ds.xml,該文件設(shè)定Hypersonic的數(shù)據(jù)源的JNDI名稱為DefaultDS3、hsqldb-ds.xml數(shù)據(jù)源文件的內(nèi)容n該數(shù)據(jù)源文件是JBoss自帶的Hypersonic SQL的數(shù)據(jù)源配置文件,這里的文件內(nèi)容作了一些刪節(jié)。n該數(shù)據(jù)源文件的開頭指
7、定了其xml的版本號(hào)和編碼類型 DefaultDS jdbc:hsqldb:hsql:/localhost:1701 org.hsqldb.jdbcDriver sa 5 HsqlDbRealm 3、 hsqldb-ds.xml數(shù)據(jù)源文件的內(nèi)容n標(biāo)簽指定了該xml文件的性質(zhì)為數(shù)據(jù)源配置文件,指定了該數(shù)據(jù)源的名稱,可以將其改為其他名字,但不能和deploy文件夾中其他數(shù)據(jù)源文件中規(guī)定的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數(shù)據(jù)源文件的內(nèi)容n和標(biāo)簽指定了該數(shù)據(jù)源連接數(shù)據(jù)庫的JDBC連接所需的url和JDBC驅(qū)動(dòng)類的名稱,可根據(jù)數(shù)據(jù)庫的JDBC手冊(cè)察看這兩項(xiàng)的配置值3、 hsqldb-ds.xml數(shù)據(jù)源文件的內(nèi)容n標(biāo)簽和標(biāo)簽指定了連接數(shù)據(jù)庫所需的賬號(hào)和密碼n在Hypersonic SQL中,此項(xiàng)為可選項(xiàng) DefaultDS jdbc:hsqldb:hsql:/localhost:1701 org.hsqldb.jdbcDriver sa 5 HsqlDb
9、Realm 3、 hsqldb-ds.xml數(shù)據(jù)源文件的內(nèi)容n標(biāo)簽指定了數(shù)據(jù)源為應(yīng)用程序建立的最小數(shù)據(jù)庫連接的數(shù)目n指定了數(shù)據(jù)庫安全驗(yàn)證的方式 DefaultDS jdbc:hsqldb:hsql:/localhost:1701 org.hsqldb.jdbcDriver sa 5 HsqlDbRealm 4、幾點(diǎn)說明n不同數(shù)據(jù)庫的數(shù)據(jù)源文件內(nèi)容都有所不同,但都有JNDI名字的配置項(xiàng)。將相應(yīng)的配置文件拷貝到啟動(dòng)配置文件夾的deploy子目錄后,要保證各文件中定義的JNDI數(shù)據(jù)源名字不能相同n數(shù)據(jù)源文件中以及的配置值一般情況下都要依據(jù)在數(shù)據(jù)庫建立的數(shù)據(jù)庫名和表的名稱加以修改n所有的修改必須要重新
10、啟動(dòng)JBoss才能起作用n如果采用JBoss自帶的Hypersonic SQL數(shù)據(jù)庫,那么hssql-ds.xml文件的內(nèi)容無需修改,就可直接使用,此時(shí)數(shù)據(jù)源的JNDI名為DefaultDS三、利用Lomboz建立DAO1、Lomboz中的DAO功能支持nLomboz簡(jiǎn)化J2EE開發(fā)的實(shí)質(zhì)是利用了XDoclet的功能,而XDoclet自動(dòng)生成各種文件的原理是解析源代碼中的XDoclet注釋,依據(jù)這些注釋生成EJB所需的接口和部署描述文件。nXDoclet采用什么目錄存放生成的接口和部署描述符?XDoclet如何協(xié)助生成其他輔助的類文件(如DAO的接口和實(shí)現(xiàn)文件)?這些都要依靠Lomboz為我們
11、生成的XDoclet的配置文件,該文件名為xdoclet.xml,位于Lomboz工程中的EJB模塊所在的目錄的META-INF文件夾中(注意,該文件在Lomboz早期的版本中名為ejbgenerate.xml)Lomboz工程中的xdoclet.xml配置文件在xdoclet.xml文件中的DAO標(biāo)簽n在xdoclet.xml文件中加入標(biāo)簽,即可讓XDoclet在源文件中解析和dao相關(guān)的XDoclet注釋,自動(dòng)生成DAO所需的接口文件和類文件n注意:新版的Lomboz(2.1.2以上版本)已經(jīng)會(huì)自動(dòng)加入該標(biāo)記,所以如果使用Lomboz的新版無需此步驟2、DAO示例工程的主要內(nèi)容n本節(jié)將創(chuàng)建
12、一個(gè)名為ShopCart的有狀態(tài)會(huì)話Bean,用來表示網(wǎng)上商城中常見的購(gòu)物車。該會(huì)話Bean用一個(gè)Vector類型的成員暫時(shí)存儲(chǔ)用戶購(gòu)買的商品,當(dāng)用戶下訂單時(shí),利用DAO對(duì)象將用戶購(gòu)買的商品存入數(shù)據(jù)庫,并生成相應(yīng)的訂單。n本示例采用的數(shù)據(jù)庫為JBoss自帶的Hypersonic SQL,所以無需額外的數(shù)據(jù)庫軟件n該Bean類中共有三個(gè)商業(yè)方法,一個(gè)是addItem,用來記錄用戶購(gòu)買的商品,另外兩個(gè)是placeOrder和getOrder,分別用來下訂單和獲得給定訂單號(hào)的訂貨清單,由于這兩個(gè)方法都要訪問數(shù)據(jù)庫,所以都放在DAO的實(shí)現(xiàn)類中進(jìn)行實(shí)現(xiàn),3、在Lomboz中建立DAO示例的步驟n建立一個(gè)
13、名為DAODEMO的Lomboz J2EE工程n在該工程中加入名為Business的EJB模塊n建立一個(gè)名為ShopCart的有狀態(tài)Session Bean,并將該Bean加入Business模塊n修改xdoclet.xml文件,加入標(biāo)簽n在ShopCartBean.java文件中加入addItem、placeOrder、getOrder商業(yè)方法的定義,并加入一個(gè)placeOrder的重載方法。在ShopCartBean中加入DAO的類級(jí)注釋,在getOrder和placeOrder重載方法上加入DAO方法級(jí)調(diào)用注釋,n建立DAO的實(shí)現(xiàn)類n生成所需的DAO接口和其他文件,并修改DAO實(shí)現(xiàn)類的定
14、義,實(shí)現(xiàn)placeOrder和getOrder等方法n為ShopCartBean加入所需的JDBC等資源注釋,再次生成接口及其它文件n修改JBoss的Statulful Bean相關(guān)的配置文件,啟動(dòng)JBoss,啟動(dòng)Hypersonic控制臺(tái),創(chuàng)建所需的表和數(shù)據(jù)n部署ShopCartBeann編寫測(cè)試客戶端程序(1)創(chuàng)建J2EE工程,添加EJB模塊n按第七章-用Lomboz簡(jiǎn)化EJB的開發(fā)中介紹的步驟,創(chuàng)建一個(gè)名為DAODEMO的Lomboz J2EE工程,并在工程中加入一個(gè)名為Business,以JBoss3.2.1為目標(biāo)服務(wù)器的EJB模塊,(2)添加Bean類n利用Lomboz EJB Cr
15、eate Wizard創(chuàng)建一個(gè)名為ShopCart的Stateful Session Bean,所在的包為edu.ec.session,注意按圖中所示填如相應(yīng)的名稱自動(dòng)生成的ShopCartBean類代碼Lomboz自動(dòng)生成的XDoclet注釋,注意type屬性的取值Lomboz自動(dòng)為類加上了“Bean”后綴(3)將ShopCartBean類加入EJB模塊(4)在xdoclet.xml中添加dao標(biāo)簽如果使用Lomboz2.1.2以下的版本,請(qǐng)?jiān)趫D中所示的位置中加入代碼,注意不要忘了最后的“/”號(hào),Lomboz2.1.2以上版本無需此步驟(5)添加addItem商業(yè)方法naddItem方法負(fù)責(zé)
16、把客戶選購(gòu)的商品按照其代碼存入一個(gè)Vector類型的變量中,形式參數(shù)itemId代表商品的庫存代碼(6)加入placeOrder和getOrder商業(yè)方法n參考圖示,用同樣的方法加入以下兩個(gè)商業(yè)方法nplaceOrder接受用戶名作為形式參數(shù),負(fù)責(zé)將用戶下的商品代碼存入order表中,返回值是該用戶的訂單號(hào)ngetOrder以訂單號(hào)為形式參數(shù),返回是該訂單所定的貨物清單列表(以字符串?dāng)?shù)據(jù)的形式)(7)利用類向?qū)?chuàng)建DAO實(shí)現(xiàn)類如圖中所示,在新建類向?qū)У膶?duì)話框中輸入DAO的實(shí)現(xiàn)類的相關(guān)內(nèi)容,類所在的包為edu.ec.dao,類的名稱為OrderDAOImpl(8)在ShopCartBean類中加
17、入類級(jí)DAO注釋n按照?qǐng)D示,在類級(jí)XDoclet注釋中加入DAO相關(guān)的注釋,ejb.dao后面的class屬性指定了DAO接口的名字,而imple-class指定了實(shí)現(xiàn)該接口的類名字,注意此處應(yīng)與上一步添加的類的名稱保持一致n在ShopCartBean中,還加入了一個(gè)Vector類型的私有變量goods,用來保存商品(9)在ShopCartBean類中加入方法級(jí)DAO注釋n在getOrder方法前的XDoclet注釋中加入圖示的方法級(jí)DAO注釋,代表此方法將在DAO實(shí)現(xiàn)類中具體實(shí)現(xiàn)(9)在ShopCartBean類中加入方法級(jí)DAO注釋n在ShopCartBean類中加入一個(gè)placeOrde
18、r的重載方法,在該方法的上面加入dao.call name=placeOrder注釋,該方法的具體實(shí)現(xiàn)將放在OrderDAOImpl類中實(shí)現(xiàn)(10)產(chǎn)生EJB Classes產(chǎn)生EJB Classes之后生成的ejbsrc目錄中的文件nXDoclet自動(dòng)生成的OrderDAO接口文件nShopCartSession繼承了ShopCartBean類,并且在其中加入了DAO方法的調(diào)用自動(dòng)產(chǎn)生的OrderDAO.java文件的內(nèi)容n在ShopCartBean類中加入的ejb.dao類級(jí)注釋生成了該文件,而在getOrder和placeOrder方法前加入的方法級(jí)注釋dao.call生成了OrderD
19、AO接口中這兩個(gè)方法的聲明自動(dòng)產(chǎn)生的ShopCartSession.java文件DAO內(nèi)容ngetOrder方法首先調(diào)用了父類中的getOrder方法,然后調(diào)用了DAO實(shí)現(xiàn)類中的getOrder方法n靜態(tài)同步方法getDao可以保證OrderDAO實(shí)現(xiàn)類(此處為OrderDAOImpl類)的實(shí)例只有一個(gè),且不被多個(gè)線程同時(shí)調(diào)用(11)修改OrderDAOImpl類的定義n在OrderDAOImpl中加入implements關(guān)鍵字實(shí)現(xiàn)OrderDAO接口,需要加入init和getOrder方法的實(shí)現(xiàn)n加入了一個(gè)名為jdbcFactory的成員,用來保存數(shù)據(jù)源對(duì)象nplaceOrder比ShopC
20、artBean中的placeOrde商業(yè)r方法多了一個(gè)goods形參,用來傳遞客戶定購(gòu)的商品引入必要的包OrderDAOImpl類中方法功用概述ninit方法n用于OrderDAOImpl類的初始化工作,主要負(fù)責(zé)對(duì)私有成員jdbcFactory的賦值。init方法首先檢查jdbcFactory是否已經(jīng)賦值,如果沒有賦值,就調(diào)用.InitialContext類中的lookup方法在服務(wù)器的JDNI資源中查找數(shù)據(jù)源的名字,找到后賦給jdbcFactorynplaceOrder方法n用于將顧客購(gòu)買的商品寫入Hypersonic的訂單表(orders)和訂單明細(xì)表(ordersde
21、tail)中,其中訂單表有三個(gè)字段,id為訂單編號(hào),name為顧客的姓名,date為訂單生成的日期;訂單明細(xì)表中記錄了某個(gè)訂單的所定的具體商品,id和orders表中的id相對(duì)應(yīng),而itemname字段記錄了顧客購(gòu)買的商品名稱ngetOrder方法n該方法負(fù)責(zé)在Hypersonic的ordersdetail檢索特定訂單號(hào)的定購(gòu)的商品,并把結(jié)果放在字符串?dāng)?shù)組中返回實(shí)現(xiàn)init方法n按照?qǐng)D中所示,加入init方法的具體實(shí)現(xiàn)代碼n本段代碼查找數(shù)據(jù)源的JNDI名字,并將找到的數(shù)據(jù)源對(duì)象保存在私有成員jdbcFactory中n在查找JNDI名字的時(shí)候,注意,按照J(rèn)NDI的系統(tǒng)名稱規(guī)范,應(yīng)在查找代碼中對(duì)J
22、NDI名字前加入“java:comp/env/”的前綴,代表是在JNDI環(huán)境中(env)中查找資源名稱,而數(shù)據(jù)源JNDI名字前面的jdbc前綴是在該會(huì)話Bean的部署描述符中規(guī)定的,用于告訴容器該JNDI名稱屬于JDBC數(shù)據(jù)源,由此可見,查找數(shù)據(jù)源的全名就是圖中紅框的“java:comp/env/jdbc/DefaultDS”實(shí)現(xiàn)placeOrder方法(主要代碼)njdbcFactory是一個(gè)數(shù)據(jù)源(DataSource)對(duì)象,調(diào)用其getConnection方法獲得對(duì)數(shù)據(jù)庫的一個(gè)實(shí)際的連接實(shí)現(xiàn)placeOrder方法(主要代碼)ngenerateGUID是一個(gè)在ShopCartUtil類中
23、(該類由XDoclet自動(dòng)生成)定義的靜態(tài)方法,可為每張訂單生成一個(gè)唯一的標(biāo)識(shí)實(shí)現(xiàn)placeOrder方法(主要代碼)nprepareStatement是在java.sql.Connection類中定義的方法,可將其參數(shù)中的SQL語句發(fā)送到數(shù)據(jù)庫進(jìn)行預(yù)編譯,以提高效率實(shí)現(xiàn)placeOrder方法(主要代碼)nprepareStatement方法中的字符串類型的參數(shù)可以加入?來代表SQL語句中的參數(shù),這些參數(shù)可以通過PreparedStatement類中的setXxx(Xxx代表相應(yīng)的Java數(shù)據(jù)類型的名稱)進(jìn)行動(dòng)態(tài)設(shè)置實(shí)現(xiàn)placeOrder方法(主要代碼)nsetString用來設(shè)置prep
24、areStatement方法中的SQL語句中的類型為字符串的?參數(shù),setString的第一個(gè)參數(shù)用來指定設(shè)定第幾個(gè)“?”,第二個(gè)參數(shù)用來指定具體的數(shù)據(jù)實(shí)現(xiàn)placeOrder方法(主要代碼)nexecuteUpdate用來執(zhí)行preparedStatement中的SQL語句,專用于更新數(shù)據(jù)庫,該語句在orders表中插入一條記錄實(shí)現(xiàn)placeOrder方法(主要代碼)n在執(zhí)行完preparedStatement之后,一定要及時(shí)關(guān)閉和該語句相關(guān)聯(lián)的資源,否則將造成資源不能及時(shí)釋放,形成內(nèi)存泄露實(shí)現(xiàn)placeOrder方法(主要代碼)n該段代碼在訂單明細(xì)表(ordersdetail)中插入顧客購(gòu)
25、買的商品,這些商品的名稱存放在goods變量中,而goods變量是placeOrder的形式參數(shù)之一實(shí)現(xiàn)placeOrder方法(主要代碼)n捕捉在try代碼段中執(zhí)行JDBC相關(guān)的語句時(shí)可能產(chǎn)生的SQLException異常。在異常出現(xiàn)后,在應(yīng)用程序服務(wù)器的控制臺(tái)輸出中打印異常出現(xiàn)的原因?qū)崿F(xiàn)placeOrder方法(主要代碼)nfinally代碼段確保任何情況下preparedStatement和數(shù)據(jù)源的連接都能夠得到關(guān)閉,以便釋放數(shù)據(jù)庫為連接和語句釋放的資源。沒有這塊語句有可能會(huì)引發(fā)內(nèi)存泄露。placeOrder方法全部源碼placeOrder方法源碼(全)n這段代碼用來獲取當(dāng)前的日期,并將
26、其存儲(chǔ)在today變量中,以便placeOrder將此時(shí)間寫入Hypersonic的orders表的date字段實(shí)現(xiàn)getOrder方法(主要代碼)ngetOrder方法側(cè)重于從數(shù)據(jù)庫表中查詢所需的數(shù)據(jù),這些數(shù)據(jù)存儲(chǔ)在訂單明細(xì)表orderstail中,該表只有兩個(gè)字段,一個(gè)為id,代表訂單的編號(hào),itemname代表商品的名稱實(shí)現(xiàn)getOrder方法(主要代碼)nPreparedStatement類中的executeQuery方法專用于執(zhí)行查詢語句,并將查詢結(jié)果放入ResultSet類的一個(gè)實(shí)例中返回,這里這個(gè)變量為rs實(shí)現(xiàn)getOrder方法(主要代碼)n第一次調(diào)用rs變量的next方法時(shí),
27、rs結(jié)果集的數(shù)據(jù)指針位于第一條記錄,而再次調(diào)用next方法時(shí),如果還有記錄,則會(huì)返回true,并將數(shù)據(jù)指針放在下一條記錄上;如果已經(jīng)到達(dá)記錄尾,next方法將返回false實(shí)現(xiàn)getOrder方法(主要代碼)nfinally段中的代碼和placeOrder中的finally段中的代碼的功用是一致的,這里多了一條關(guān)閉結(jié)果集rs的語句getOrder方法的全部源代碼getOrder方法源碼(全)n用goods向量類變量存儲(chǔ)查詢結(jié)果,再將其中的數(shù)據(jù)轉(zhuǎn)化為字符串存入結(jié)果數(shù)組result中(12)修改ShopCartBean的placeOrder商業(yè)方法nplaceOrder商業(yè)方法中直接調(diào)用了Shop
28、CartSession類(該類是Lomboz自動(dòng)生成的)的靜態(tài)方法getDao,用以獲取一個(gè)DAO對(duì)象,以便訪問在OrderDAOImpl類中實(shí)現(xiàn)的placeOrder方法。n注意此處代碼是寫在的placeOrder商業(yè)方法中,而不是寫在其重載的DAO方法中(13)修改ShopCartBean的addItem商業(yè)方法n在addItem中加入圖中所示代碼,這段代碼負(fù)責(zé)將私有g(shù)oods成員進(jìn)行初始化并將顧客購(gòu)買的商品加入到goods中(14)為ShopCartBean加入ejbCreate方法n在ShopCartBean中加入一個(gè)私有成員name,用來記錄用戶的名稱,然后在添加兩個(gè)ejbCreat
29、e方法,一個(gè)用于匿名登錄的用戶,一個(gè)用于輸入用戶名的用戶。方法級(jí)注釋ejb.create-method可在Home和LocalHome接口中生成相應(yīng)的create方法的聲明(15)在ShopCartBean中加入資源注釋nEnterprise JavaBean所需的資源需要在部署描述符中加以定義,圖中所示的XDoclet注釋可以幫助生成部署描述符所需數(shù)據(jù)源的部署描述元素(16)在ShopCartBean中加入會(huì)話Bean的配置策略注釋njboss.container-configuration類級(jí)注釋向JBoss容器說明了采用什么樣的策略來管理有狀態(tài)SessionBean,name屬性的值必須
30、和JBoss啟動(dòng)配置文件夾中conf目錄中的standardjboss.xml中的配置項(xiàng)目名稱相同,此處的值為“Standard Stateful SessionBean”。該值也是JBoss默認(rèn)的管理有狀態(tài)SessionBean的策略,所以該注釋可以省略不寫(17)修改JBoss中有關(guān)會(huì)話Bean的配置文件nstandardjboss.xml是JBoss服務(wù)器重要的配置文件,它位于啟動(dòng)配置文件夾的conf子目錄中n在standardjboss.xml文件中,找到“Standard Stateful Session”配置項(xiàng),如左圖所示,其中標(biāo)記規(guī)定了有狀態(tài)會(huì)話Bean不被調(diào)用時(shí)的最長(zhǎng)存活周期,
31、標(biāo)記規(guī)定JBoss多長(zhǎng)時(shí)間清除哪些已經(jīng)達(dá)到時(shí)間的有狀態(tài)的會(huì)話Bean。為了達(dá)到驗(yàn)證效果,將這兩個(gè)值分別改為30秒和3秒 Standard Stateful SessionBean 30 3 (18)再次在Eclipse中生成EJB相關(guān)文件n再次執(zhí)行g(shù)enerate ejb classes指令后在ejb-jar.xml文件中生成的資源描述標(biāo)記njboss.xml中的資源標(biāo)記和JNDI名稱ejb-jar.xml文件中的資源定義jboss.xml文件中的資源定義(19)啟動(dòng)JBoss服務(wù)器n在Eclipse中JBoss服務(wù)器的啟動(dòng)也可以利用Lomboz的J2EE View,首先選中需啟動(dòng)的服務(wù)器,在
32、Lomboz J2EE View內(nèi)點(diǎn)擊右鍵,選Run Server,即可啟動(dòng)JBoss服務(wù)器(20)啟動(dòng)Hypersonic控制臺(tái)點(diǎn)擊此按鈕啟動(dòng)Hypersonic控制臺(tái)(21)創(chuàng)建所需的表n按圖中所示輸入所需的SQL語句,該語句創(chuàng)建了ORDERS和ORDERSDETAIL表,再按EXECUTE SQL STATEMENT按鈕n輸入框的下方提示了Hypersonic的相關(guān)語法n創(chuàng)建表之后,點(diǎn)擊view-Refresh Tree,就可以在左側(cè)的樹視圖中看到新建的表名n結(jié)果窗口中顯示執(zhí)行的SQL語句成功或錯(cuò)誤信息(22)部署ShopCartBeann在Lomboz J2EE視圖中,選定Buines
33、s模塊,再點(diǎn)擊右鍵,選Deploy即可部署B(yǎng)usiness模塊。n部署完成后在Console視圖中切換到JBoss的輸出,可以看到JBoss輸出的部署成功信息(23)編寫測(cè)試客戶程序n按圖示輸入測(cè)試客戶端的相關(guān)信息在Pakage Explore中雙擊該方法名就可在DAOTest.java源文件中定位testBean方法修改客戶程序,在testBean方法中加入如下測(cè)試代碼調(diào)用getHome靜態(tài)方法,獲取Home接口對(duì)象之后調(diào)用Home接口的create方法,創(chuàng)建ShopCart遠(yuǎn)程接口對(duì)象,將該遠(yuǎn)程EJB對(duì)象賦給myBean變量。之后每次調(diào)用myBean中的對(duì)應(yīng)于ShopCart中商業(yè)方法,都會(huì)導(dǎo)致對(duì)JBoss服務(wù)器中的ShopCart實(shí)例的商業(yè)方法的調(diào)用。由于ShopCart是一個(gè)有狀態(tài)會(huì)話Bean,它會(huì)自動(dòng)維護(hù)每個(gè)使用ShopCart的客戶程序的數(shù)據(jù)客戶程序解釋調(diào)用ShopCart的addItem商業(yè)方法,購(gòu)買Bycle和Shoes。ShopCart實(shí)例將顧客購(gòu)買的商品名稱存放在goods私有變量中,以供placeOrder方法寫入H
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 美容院裝修單包工合同
- 電纜溝工程承包合同書
- 奢侈品質(zhì)押擔(dān)保合同書
- 系統(tǒng)分析與項(xiàng)目管理手順手冊(cè)
- 企業(yè)內(nèi)部知識(shí)管理與學(xué)習(xí)培訓(xùn)平臺(tái)
- 物流行業(yè)的智能物流與倉儲(chǔ)管理作業(yè)指導(dǎo)書
- 代理記賬協(xié)議書
- 太陽能路燈購(gòu)銷合同
- 解決客戶需求說明文書樣本
- 法律咨詢服務(wù)合同集錦
- 2025年高考語文作文備考:議論文萬能模板
- 重大事故隱患判定標(biāo)準(zhǔn)與相關(guān)事故案例培訓(xùn)課件(建筑)
- 《我的寒假生活》
- 陜2018TJ 040建筑節(jié)能與結(jié)構(gòu)一體化 復(fù)合免拆保溫模板構(gòu)造圖集
- DZ/T 0430-2023 固體礦產(chǎn)資源儲(chǔ)量核實(shí)報(bào)告編寫規(guī)范(正式版)
- (高清版)WST 442-2024 臨床實(shí)驗(yàn)室生物安全指南
- 歷史時(shí)間軸全
- 高速行業(yè)網(wǎng)絡(luò)安全與維護(hù)
- 2024年能源電力行業(yè)數(shù)字化轉(zhuǎn)型解決方案
- (2024年)房地產(chǎn)銷售人員心態(tài)培訓(xùn)
- 康復(fù)科院感年度工作計(jì)劃
評(píng)論
0/150
提交評(píng)論