改進的Oracle Jpublisher可以將數據庫實體映射到Java和Web服務
編寫客戶端和中間層的Java與J
EE應用程序來表示數據庫實體
如用戶定義的SQL對象類型和集合類型時
如果你需要手工完成所有編碼
這將是非常具有挑戰性和易於出錯的工作
另一種辦法則是你可以使用Oracle JPublisher工具來完成
該工具自動根據你輸入的命令行(或根據在Oracle JDeveloper集成開發環境下的鼠標點擊)自動產生相應的Java類
本文中
我將概要介紹JPublisher並描述它是如何簡化將數據庫實體映射到Java的過程
包括你無法從Java Database Connectivity (JDBC)直接使用的類型
然後我將展示如何通過一或兩個JPublisher命令將數據庫的操作和商務邏輯映射到你的Java客戶端
J
EE組件和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
g中
PL/SQL RECORD和TABLE類型
對於RECORD和TABLE類型
JPublisher生成相應的SQL對象(對於RECORD類型)或SQL VARRAY類型(對於TABLE類型)
以及用於在PL/SQL和SQL類型之間進行映射的轉換函數
PL/SQL INDEXED
BY數據表
如果你使用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類的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=webservices
outarguments=array
plsqlfile=actionWrap
sql
請注意
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 @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
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可以將具體的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
g中
在數據庫安裝時應該裝入了[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
//localhost:
/
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 varchar
(
);
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服務的過程
From:http://tw.wingwit.com/Article/program/Oracle/201311/17684.html