熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

簡化對數據庫的訪問

2013-11-13 16:01:25  來源: Oracle 

  改進的Oracle Jpublisher可以將數據庫實體映射到Java和Web服務
  
  編寫客戶端和中間層的Java與JEE應用程序來表示數據庫實體如用戶定義的SQL對象類型和集合類型時如果你需要手工完成所有編碼這將是非常具有挑戰性和易於出錯的工作另一種辦法則是你可以使用Oracle JPublisher工具來完成該工具自動根據你輸入的命令行(或根據在Oracle JDeveloper集成開發環境下的鼠標點擊)自動產生相應的Java類
  
  本文中我將概要介紹JPublisher並描述它是如何簡化將數據庫實體映射到Java的過程包括你無法從Java Database Connectivity (JDBC)直接使用的類型然後我將展示如何通過一或兩個JPublisher命令將數據庫的操作和商務邏輯映射到你的Java客戶端JEE組件和Web服務客戶端最後我將描述JPublisher如何簡化從數據庫內部調用外部Web服務的過程
  
  Jpublisher概述
  
  Oracle JPublisher是一個用於在Java和SQL之間轉換和交換結構化對象數據的工具它還可以訪問其他的數據庫資源如PL/SQL包和Java存儲過程它生成Java類來表示數據庫實體如SQL對象和操作PL/SQL包和過程以及服務器端Java類你可以通過JDBC在你的Java客戶端servletJavaServer Pages (JSP)Enterprise JavaBeans (EJB)和Web服務中使用這些生成的類
  
  JPublisher 可以生成表示以下數據庫實體的類
  
  用戶定義的SQL對象類型對於每個對象類型JPublisher為表示該對象的類生成一個typejava文件它提供訪問程序方法用以獲取和設置該對象類型的每個屬性還有如果你的對象類型包含了作為存儲過程而實現的方法則JPublisher將生成封裝器方法在對象實例上調用這些方法
  
  對象引用類型(REF 類型) 對於一個SQL對象引用類型JPublisher生成一個typeRefjava文件來建立該Java對象類型的引用模型它包括通過一個對象引用來訪問實際的對象值的方法
  
  用戶定義的SQL集合類型對於每個集合類型JPublisher為表示該集合的類生成一個typejava文件對於嵌套的數據表生成的類具有作為整個數組來獲取和設置嵌套的數據表的一些方法以及用於獲取和設置該數據表中各個元素的一些方法
  
  用戶定義的OPAQUE類型每當JPublisher遇到一個沒有提供其相應類型的SQL OPAQUE類型時它都會生成一個typejava文件來發布一個Java封裝器類OPAQUE的有效負荷以字節數組(byte array)來表示可以從生成的封裝器的子類中進行處理
  
  PL/SQL BOOLEAN PL/SQL BOOLEAN被映射到Java Boolean類型這要求有SYSSQLJUTL包該包是由數據庫(JPublisher生成的代碼要在其中運行)中的sqljutilsql腳本來安裝的這個腳本默認安裝在Oracle Database g中
  
  PL/SQL RECORD和TABLE類型對於RECORD和TABLE類型JPublisher生成相應的SQL對象(對於RECORD類型)或SQL VARRAY類型(對於TABLE類型)以及用於在PL/SQL和SQL類型之間進行映射的轉換函數
  
  PL/SQL INDEXEDBY數據表如果你使用Oracle Database g 的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 g中一些示例模式的一種假設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 varchar()
  age number);
  procedure foo (hired timestamp
  emp in out emprec);
  end;
  /
  
  假設你想將ACTION包映射到一個Java類的ActionJDBC支持從TIMESTAMP到javasqlTimeStamp的映射然而你並不想使用JDBC支持的映射而是想從TIMESTAMP映射到Date相應的Java foo方法將有如下定義
  
  public void foo(javautilDate 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=webservices
  
    outarguments=array
    plsqlfile=actionWrapsql
  
  請注意style=webservices選項指定從TimeStamp到Date的映射outarguments= array表示OUT參數通過只有一個元素的數組來傳遞
  
  JPublisher產生你必須在使用JPublisher生成的代碼之前要執行的PL/SQL封裝器腳本這個腳本包含了對應PL/SQL EMPREC類型的SQL類型EMPREC_SQL的定義以及EMPREC和EMPREC_SQL之間的轉換函數同時該腳本還包含了一個針對PL/SQL存儲過程foo的封裝器
  
  以下命令將執行生成的腳本
  
  % sqlplus scott/tiger @actionWrapsql
  
  這就算完成了兩相比較JPublisher只需兩個命令就可以完成ACTION包的PL/SQL到Java映射而手工方法中卻需要很多個命令
  
  以下是對JPublisher為ACTION PL/SQL包到Java映射生成的每個文件的簡單描述
  
  Actionjava 為ACTION包生成的Java基類
  ActionBasejava從ActionBase擴展來的Java用戶子類
  ActionUserjava 從ActionBase擴展來的Java類包含Java類型映射如從TimeStamp到Date
  ActionEmprecjava 為EMPREC_SQL生成的Java接口
  ActionEmprecBasejava為EMPREC_SQL生成的Java基類
  ActionEmprecUserjava 提供ActionEmprecBase的Java用戶子類
  ActionEmprecUserRefjava EMPREC_SQL的REF類型的Java類型
  actionWrapsql定義了EMPREC的SQL類型的SQL和PL/SQL腳本以及EMPREC和SQL類型之間的轉換函數
  
  數據庫作為Web服務提供者
  
  Oracle Database g提供了一個新的JPublisher特性用以支持數據庫Web服務Oracle Database g與Oracle Application Server g的結合允許你將PL/SQL包和存儲過程SQL查詢SQL數據操作語言(DML)語句以及服務器端Java類發布為Web服務JPublisher生成的類可以通過Oracle Application Server Web Services Assembler工具作為Web服務而公布
  
  發布SQL查詢或DML語句JPublisher可以將具體的SELECTUPDATEINSERT或DELETE語句發布為一個Java類的方法這個類也可以作為Web服務而發布
  
  樣式文件在發布服務器端Java類時JPublisher使用說明Java到Java類型映射的樣式文件來確保生成的類可用於Web服務
  
  生成Java接口JPublisher可以生成Java接口和類這就避免了手工生成Java接口來表示用以生成Web服務描述語言(WSDL)內容的API
  
  所支持的SQL類型以下的SQL類型可以在數據庫Web服務簽名中發布各種簡單SQL類型包括DATESQL對象類型SQL VARRAY類型SYSXMLTYPE和REF CURSOR
  
  數據庫作為Web服務消費者
  
  當數據庫作為Web服務消費者時Web服務客戶端代碼采用SQLPL/SQL或Java編寫並在數據庫中運行用以調用外部Web服務對於在數據庫中運行以訪問其他Web服務的代碼你必須能夠調用這些服務你可以使用手工方法進行簡單對象訪問協議(SOAP)的編程或者通過JPublisher以下步驟將幫助你通過JPublisher來構建你的第一個數據庫Web服務消費者
  
  第一步確認數據庫的安裝在Oracle Database g中在數據庫安裝時應該裝入了[Oracle_Home]/sqlj/lib的sqljutljar庫和utl_dbws_jserverjar庫以及SYSUTL_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/javacalloutjar
   METAINF/HelloServiceEJBwsdl
  
  % jpub proxywsdl=METAINF/
  HelloServiceEJBwsdl
  dir=genproxy
  package=javacallout
  user=scott/scott
  //localhost:/
  javacallout/javacallout
  
  proxywsdl選項指定了WSDL文件JPublisher將為它生成靜態Java代理類Java和PL/SQL封裝器以及PL/SQL腳本
  
  dir選項為生成的代碼和腳本指定了根目錄
  
  package選項為生成的Java代碼指定了包的名字
  
  代碼生成後JPublisher自動將以下文件裝入數據庫中
  
  genproxy/javacallout這個目錄下的Java類由JPublisher調用的Web服務WSDL編譯工具生成
  
  genproxy/HelloServiceEJBJPubjavaHelloServiceEJBJPubjava類將方法sayHello()定義為一個靜態的Java方法
  
  genproxy/plsql_wrappersql這是Web服務客戶端(HelloServiceEJBJPubjava)的PL/SQL封裝器
  
  genproxy/plsql_droppersql它用來刪除plsql_wrappersql定義的PL/SQL類型和包
  
  genproxy/plsql_grantsql它(運行在SYS下)用來為Java客戶端代理分配必要的權限以調用Web服務
  
  genproxy/plsql_revokesql它用來取消plsql_grantsql所分配的權限
  
  genproxy/jpub_proxyloadlog這是用於裝入生成的Java文件和安裝plsql_wrappersql腳本的日志文件
  
  為了禁止JPublisher將生成的代碼裝入到數據庫中你可以指定選項proxyopts =noload使用靜態客戶端代理的優點是你可以簡化在你的Java代碼中引用端口類型實例方法而無需擔心如何編排(marshal)或反編排(unmarshal)來自SOAP消息的個別參數 下一步
  
  第三步分配權限腳本plsql_grantsql用於SYS給SCOTT分配執行裝入的客戶端代理時所必需的權限
  
  SQL> conn / as sysdba
  SQL> @genproxy/plsql_grantsql
  
  第四步調用外部Web服務要從數據庫調用外部Web服務聲明和運行run_plsql_proxysql腳本或運行以下的PL/SQL塊
  
  SQL> set serveroutput on
  SQL> declare x varchar();
     begin
      x:=JPUB_PLSQL_WRAPPERsayHello(
          Hello from database);
     dbms_outputput_line(x);
     end;
    /
  
  第五步清除使用SQL*PLUS刪除PL/SQL封裝器並取消分配的權限
  
  SQL> conn scott/tiger
  SQL> @genproxy/plsql_droppersql
  SQL> conn / as sysdba
  SQL> @genproxy/plsql_revokesql
  
  使用dropjava工具從數據庫中刪除裝入的Java類
  
  dropjava u scott/tiger
  genproxy/wsdlGeneratedjar
  
  結論
  
  JPublisher使Java開發人員免於復雜的學習以及掌握手工創建Java數據庫訪問程序的很多邏輯細節和麻煩此外Jpublisher還簡化了將數據庫操作作為Web服務發布的過程和從數據庫內部使用外部Web服務的過程
From:http://tw.wingwit.com/Article/program/Oracle/201311/17684.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.