国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

簡化對數據庫的訪問

2024-07-21 02:34:06
字體:
來源:轉載
供稿:網友

  改進的Oracle Jpublisher可以將數據庫實體映射到java和Web服務。
  
  編寫客戶端和中間層的Java與J2EE應用程序來表示數據庫實體,如用戶定義的SQL對象類型和集合類型時,假如你需要手工完成所有編碼,這將是非常具有挑戰性和易于出錯的工作。另一種辦法則是你可以使用Oracle JPublisher工具來完成,該工具自動根據你輸入的命令行(或根據在Oracle JDeveloper集成開發環境下的鼠標點擊)自動產生相應的Java類。
  
  本文中,我將概要介紹JPublisher并描述它是如何簡化將數據庫實體映射到Java的過程,包括你無法從Java Database Connectivity (JDBC)直接使用的類型。然后我將展示如何通過一或兩個JPublisher命令將數據庫的操作和商務邏輯映射到你的Java客戶端、J2EE組件和Web服務客戶端。最后,我將描述JPublisher如何簡化從數據庫內部調用外部Web服務的過程。
  
  Jpublisher概述
  
  Oracle JPublisher是一個用于在Java和SQL之間轉換和交換結構化對象數據的工具,它還可以訪問其他的數據庫資源,如PL/SQL包和Java存儲過程。它生成Java類來表示數據庫實體,如SQL對象和操作、PL/SQL包和過程以及服務器端Java類。你可以通過JDBC在你的Java客戶端、servlet、JavaServer Pages (jsp)、EnterPRise JavaBeans (EJB)和Web服務中使用這些生成的類。
  
  JPublisher 可以生成表示以下數據庫實體的類:
  
  用戶定義的SQL對象類型。對于每個對象類型,JPublisher為表示該對象的類生成一個type.java文件。它提供訪問程序方法,用以獲取和設置該對象類型的每個屬性。還有,假如你的對象類型包含了作為存儲過程而實現的方法,則JPublisher將生成封裝器方法在對象實例上調用這些方法。
  
  對象引用類型(REF 類型)。 對于一個SQL對象引用類型,JPublisher生成一個typeRef.java文件來建立該Java對象類型的引用模型。它包括通過一個對象引用來訪問實際的對象值的方法。
  
  用戶定義的SQL集合類型。對于每個集合類型,JPublisher為表示該集合的類生成一個type.java文件。對于嵌套的數據表,生成的類具有作為整個數組來獲取和設置嵌套的數據表的一些方法,以及用于獲取和設置該數據表中各個元素的一些方法。
  
  用戶定義的OPAQUE類型。每當JPublisher碰到一個沒有提供其相應類型的SQL OPAQUE類型時,它都會生成一個type.java文件來發布一個Java封裝器類。OPAQUE的有效負荷以字節數組(byte array)來表示,可以從生成的封裝器的子類中進行處理。
  
  PL/SQL BOOLEAN PL/SQL BOOLEAN被映射到Java Boolean類型。這要求有SYS.SQLJUTL包,該包是由數據庫(JPublisher生成的代碼要在其中運行)中的sqljutil.sql腳本來安裝的。這個腳本默認安裝在Oracle Database 10g中。
  
  PL/SQL RECORD和TABLE類型。對于RECORD和TABLE類型,JPublisher生成相應的SQL對象(對于RECORD類型)或SQL VARRAY類型(對于TABLE類型),以及用于在PL/SQL和SQL類型之間進行映射的轉換函數。
  
  PL/SQL INDEXED-BY數據表。假如你使用Oracle Database 10g 的JDBC Oracle Call Interface (OCI)驅動程序并且需要發布已有索引的標量數據表,那么你可以直接在Java和這些類型(以Java數組表示)之間進行映射。
  
  運行JPublisher實用工具
  
  要在數據庫中你想轉換為Java類的用戶定義的數據類型和PL/SQL包上運行JPublisher,你必須建立一個數據庫連接,以便能對你映射的SQL類型和PL/SQL包進行訪問。為此,可以使用-user和-url選項,如下例所示:
  
  % jpub -user=scott/tiger -url=jdbc:oracle:oci:@ ...
  
  % jpub -user=scott/tiger -url=jdbc:oracle:thin:@host:port/
  servicename ...
  
  第一個例子使用了Oracle JDBC OCI驅動程序,第二個使用了Oracle JDBC Thin驅動程序。
下面的例子建立在Order Entry (OE)模式的基礎上,該模式是Oracle Database 10g中一些示例模式的一種。假設OE模式的口令是OE,使用以下命令來發布SQL對象類型CATEGORY_TYP,其中CategoryTyp是相應Java類的名字:
  
  % jpub -user=OE/OE -url=jdbc:oracle:oci:@
  -sql=CATEGORY_TYP:CategoryTyp
  
  -sql選項指定將要發布的類型和類包。
  
  Oracle JPublisher生成并編譯相應的Java類。
  
  映射數據庫操作
  
  在這一部分,我將對PL/SQL包到Java的手工映射與JPublisher方法進行比較和對照。我的例子中使用了一個PL/SQL特有的類型,該類型無法從Java (本例中是PL/SQL RECORD)直接訪問,而JPublisher則提供了附加支持。
  
  create or replace package action
  as type emprec
  is record (name varchar2(10),
  age number);
  procedure foo (hired timestamp,
  emp in out emprec);
  end;
  /
  
  假設你想將ACTION包映射到一個Java類的Action。JDBC支持從TIMESTAMP到java.sql.TimeStamp的映射,然而,你并不想使用JDBC支持的映射,而是想從TIMESTAMP映射到Date。相應的Java foo方法將有如下定義:
  
  public void foo(java.util.Date hired, EmpRecSql[] emp_inout)
  
  手工方法。下面的一些步驟概括了你可以如何為這個ACTION包示例手工設置PL/SQL到Java的映射:
  
  為PL/SQL RECORD類型EMPREC創建一個SQL對象類型,例如EMPREC_SQL。
  
  為你創建的SQL類型創建一個Java類型。例如,為SQL類型EMPREC_SQL創建Java類型EmpRecSql。
  
  在Java中,將每個參數轉換為一個對應的Java類型。例如,將SQL TIMESTAMP轉換為Java Date。
  
  通過JDBC將每個IN或IN OUT參數傳遞給一個PL/SQL塊。例如,將EmpRecSql和TimeStamp傳遞給foo。
  
  在PL/SQL塊中,將每個IN和IN OUT參數轉換為PL/SQL存儲過程的正確類型。例如,將EMPREC_SQL轉換為EMPREC。
  
  調用PL/SQL存儲過程。
  
  在PL/SQL中,將每個OUT參數、IN OUT參數或函數結果從JDBC不支持的類型轉換為JDBC支持的相應類型。例如,將EMPREC轉換為EMPREC_SQL。
  
  從PL/SQL塊返回每個OUT參數、IN OUT參數或函數結果。
  
  在Java中,將每個OUT參數、IN OUT參數或函數結果從JDBC支持的類型轉換為它不支持的類型。例如,從TimeStamp轉換為Date。
  
  Oracle JPublisher方法。以下的JPublisher命令直接發布ACTION包:
  
  % jpub -u scott/tiger -s action:Action
    -style=webservices9
  
    -outarguments=array
    -plsqlfile=actionWrap.sql
  
  請注重,-style=webservices9選項指定從TimeStamp到Date的映射。-outarguments= array表示OUT參數通過只有一個元素的數組來傳遞。
  
  JPublisher產生你必須在使用JPublisher生成的代碼之前要執行的PL/SQL封裝器腳本。這個腳本包含了對應PL/SQL EMPREC類型的SQL類型EMPREC_SQL的定義,以及EMPREC和EMPREC_SQL之間的轉換函數。同時,該腳本還包含了一個針對PL/SQL存儲過程foo的封裝器。
  
  以下命令將執行生成的腳本:
  
  % sqlplus scott/tiger @actionWrap.sql
  
  這就算完成了。兩相比較,JPublisher只需兩個命令就可以完成ACTION包的PL/SQL到Java映射,而手工方法中卻需要很多個命令。
  
  以下是對JPublisher為ACTION PL/SQL包到Java映射生成的每個文件的簡單描述:
  
  Action.java, 為ACTION包生成的Java基類
  ActionBase.java,從ActionBase擴展來的Java用戶子類
  ActionUser.java, 從ActionBase擴展來的Java類,包含Java類型映射,如從TimeStamp到Date
  ActionEmprec.java, 為EMPREC_SQL生成的Java接口
  ActionEmprecBase.java,為EMPREC_SQL生成的Java基類
  ActionEmprecUser.java, 提供ActionEmprecBase的Java用戶子類
  ActionEmprecUserRef.java, EMPREC_SQL的REF類型的Java類型
  actionWrap.sql,定義了EMPREC的SQL類型的SQL和PL/SQL腳本以及EMPREC和SQL類型之間的轉換函數
  
  數據庫作為Web服務提供者
  
  Oracle Database 10g提供了一個新的JPublisher特性,用以支持數據庫Web服務。Oracle Database 10g與Oracle application Server 10g的結合答應你將PL/SQL包和存儲過程、SQL查詢、SQL數據操作語言(DML)語句、以及服務器端Java類發布為Web服務。
JPublisher生成的類可以通過Oracle Application Server Web Services Assembler工具作為Web服務而公布。
  
  發布SQL查詢或DML語句。JPublisher可以將具體的SELECT、UPDATE、INSERT或DELETE語句發布為一個Java類的方法。這個類也可以作為Web服務而發布。
  
  樣式文件。在發布服務器端Java類時,JPublisher使用說明Java到Java類型映射的樣式文件來確保生成的類可用于Web服務。
  
  生成Java接口。JPublisher可以生成Java接口和類。這就避免了手工生成Java接口來表示用以生成Web服務描述語言(WSDL)內容的API。
  
  所支持的SQL類型。以下的SQL類型可以在數據庫Web服務簽名中發布:各種簡單SQL類型,包括DATE,SQL對象類型,SQL VARRAY類型,SYS.xmlTYPE和REF CURSOR。
  
  數據庫作為Web服務消費者
  
  當數據庫作為Web服務消費者時,Web服務客戶端代碼采用SQL、PL/SQL或Java編寫并在數據庫中運行,用以調用外部Web服務。對于在數據庫中運行以訪問其他Web服務的代碼,你必須能夠調用這些服務。你可以使用手工方法進行簡單對象訪問協議(SOAP)的編程,或者通過JPublisher。以下步驟將幫助你通過JPublisher來構建你的第一個數據庫Web服務消費者。
  
  第一步:確認數據庫的安裝。在Oracle Database 10g中,在數據庫安裝時應該裝入了[Oracle_Home]/sqlj/lib的sqljutl.jar庫和utl_dbws_jserver.jar庫、以及SYS.UTL_DBWS包。
  
  第二步:生成并裝入客戶端代理以及Java和PL/SQL封裝器。JPublisher將生成Web服務客戶端代理代碼的任務完全自動化,將其編譯、放入Java歸檔(JAR)文件并裝入到數據庫中。 使用以下格式來生成代理代碼:
  
  % jpub
  -proxywsdl=URL_of_Web_Service_WSDL
  -user=username/passWord
  
  另外,假如它與WSDL本身所提供的不相同,則你可以指定
  
  -endpoint=external_Web_Services_URL
  
  假如與通過JDBC OCI驅動程序訪問的默認數據庫實例不相同,則你還可以指定-url=JDBC_database_URL。以下例子使用了多個選項:
  
  % jar xvf dist/javacallout.jar
   META-INF/HelloServiceEJB.wsdl
  
  % jpub -proxywsdl=META-INF/
  HelloServiceEJB.wsdl
  -dir=genproxy
  -package=javacallout
  -user=scott/scott
  -endpoint=http://localhost:8888/
  javacallout/javacallout
  
  -proxywsdl選項指定了WSDL文件,JPublisher將為它生成靜態Java代理類、Java和PL/SQL封裝器,以及PL/SQL腳本。
  
  -dir選項為生成的代碼和腳本指定了根目錄。
  
  -package選項為生成的Java代碼指定了包的名字。
  
  代碼生成后,JPublisher自動將以下文件裝入數據庫中:
  
  genproxy/javacallout。這個目錄下的Java類由JPublisher調用的Web服務WSDL編譯工具生成。
  
  genproxy/HelloServiceEJBJPub.java。HelloServiceEJBJPub.java類將方法sayHello()定義為一個靜態的Java方法。
  
  genproxy/plsql_wrapper.sql。這是Web服務客戶端(HelloServiceEJBJPub.java)的PL/SQL封裝器。
  
  genproxy/plsql_dropper.sql。它用來刪除plsql_wrapper.sql定義的PL/SQL類型和包。
  
  genproxy/plsql_grant.sql。它(運行在SYS下)用來為Java客戶端代理分配必要的權限以調用Web服務。
  
  genproxy/plsql_revoke.sql。它用來取消plsql_grant.sql所分配的權限。
  
  genproxy/jpub_proxyload.log。這是用于裝入生成的Java文件和安裝plsql_wrapper.sql腳本的日志文件。
  
  為了禁止JPublisher將生成的代碼裝入到數據庫中,你可以指定選項-proxyopts =noload。使用靜態客戶端代理的優點是你可以簡化在你的Java代碼中引用端口類型實例方法,而無需擔心如何編排(marshal)或反編排(unmarshal)來自SOAP消息的個別參數。 下一步
  
  第三步:分配權限。腳本plsql_grant.sql用于SYS給SCOTT分配執行裝入的客戶端代理時所必需的權限:
  
  SQL> conn / as sysdba
  SQL> @genproxy/plsql_grant.sql
  
  第四步:調用外部Web服務。
要從數據庫調用外部Web服務,聲明和運行run_plsql_proxy.sql腳本,或運行以下的PL/SQL塊:
  
  SQL> set serveroutput on
  SQL> declare x varchar2(100);
     begin
      x:=JPUB_PLSQL_WRAPPER.sayHello(
          'Hello from database');
     dbms_output.put_line(x);
     end;
    /
  
  第五步:清除。使用SQL*PLUS刪除PL/SQL封裝器并取消分配的權限。
  
  SQL> conn scott/tiger
  SQL> @genproxy/plsql_dropper.sql
  SQL> conn / as sysdba
  SQL> @genproxy/plsql_revoke.sql
  
  使用dropjava工具從數據庫中刪除裝入的Java類:
  
  dropjava -u scott/tiger
  genproxy/wsdlGenerated.jar
  
  結論
  
  JPublisher使Java開發人員免于復雜的學習、以及把握手工創建Java數據庫訪問程序的很多邏輯細節和麻煩。此外,Jpublisher還簡化了將數據庫操作作為Web服務發布的過程和從數據庫內部使用外部Web服務的過程。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 北流市| 修武县| 阿图什市| 龙江县| 应城市| 修文县| 苏尼特左旗| 龙岩市| 都兰县| 和龙市| 渭源县| 武川县| 榆树市| 邮箱| 阜康市| 当阳市| 安新县| 宁阳县| 北安市| 麟游县| 法库县| 科尔| 长兴县| 岳西县| 台前县| 枝江市| 庆阳市| 大连市| 龙门县| 疏附县| 宜阳县| 许昌市| 得荣县| 东辽县| 新竹县| 赤峰市| 托里县| 柳河县| 乌恰县| 龙江县| 葫芦岛市|