不少系統中都有動態數據表的存在比如按日或者按月在數據庫中生成一個表以日表為例其表名的形式為TableName_XXXX_XX_XX如TableName___等表明其表內數據存放的是年月日所產生的數據在這些日表中表結構完全相同只是在表名上有所區別
而在ALDSP從關系數據庫中導入元數據(import Meta Data)時無論是直接從表導入還是從SQL語句導入都必須提供其表名否則無法生成Data Services但是在不少客戶的應用中經常是要根據選擇的時間范圍來動態的查詢一個表或者多個表根據客戶提出的這些要求經過研究發現在ALDSP中要比較方便的解決這個問題主要可以通過兩個途徑解決其一是在數據庫端生成一個函數(function)或者存儲過程(store procedure)設定表名作為參數然後由ALDSP導入生成Data Services其二是直接利用ALDSP可以從函數導入元數據的功能先生成一個以表名為參數的函數然後導入ALDSP生成Data Services
以下主要介紹第二種方法的實現
在ALDSP中可以從多種異構數據源中取得數據包括數據庫flatfilexml文件Web ServicesJava函數等從Java函數中生成Data Services有幾點要注意的地方詳見其中包括函數的定義必須為static還有就是返回值有些限制主要可以返回兩種類型其一為Java原始類型(primitive types)或者原始類型的數組其二為復雜類型(complex types)或者復雜類型的數組在一般的Java程序中返回復雜類型數據一般會用到JavaBean或者JavaBean的數組或者直接用一個容器返回但是對ALDSP而言無論是容器或者JavaBean的數據ALDSP均不能從中獲取到所需的元數據(Meta Data)信息要滿足ALDSP元數據獲取的要求我們可以通過一個JavatoXML或者JavaBena的技術來對其返回值進行封裝
針對以上這些情況我們通過一個模擬的例子來實現這個解決方案首先在數據庫中生成兩張表表名為table和table結構如下
字段名 |
類型 |
ID
字符串型
NAME
字符串型
根據表的類型
設計XMLBean的XML Schema來適應我們的需要
以下為圖形化視圖(由XMLSPY生成)
XML文件源代碼如下
<?xml version=?> <xsschema xmlnsxs= xmlnstns= targetNamespace= elementFormDefault=qualified attributeFormDefault=unqualified> <xselement name=AllUser> <xscomplexType> <xssequence> <xselement name=User minOccurs= maxOccurs=unbounded> <xscomplexType> <xssequence> <xselement name=ID type=xsstring/> <xselement name=Name type=xsstring/> </xssequence> </xscomplexType> </xselement> </xssequence> </xscomplexType> </xselement> </xsschema>然在在Workshop裡新建一個應用程序再新建一個Schema Project再新建一個XML Schema如下所示
保存AllUserxsd後會自動編譯成生XMLBean的包
這樣我們就可以在定義的Java類中返回XMLBean類型的數據了
接下來在當前應用程序中新建一個Java工程加一個Java類生成一個類如下
import javasqlConnectionimport javasqlDriverimport javasqlResultSetimport javasqlStatementimport javautilHashtableimport javaxnamingContextimport javaxnamingInitialContextimport javaxsqlDataSourceimport orgopenuritemptestDynamicTableallUserAllUserDocument
public class DynamicTable { //函數的函數為表名public static AllUserDocument getUser(String tablename)
{ AllUserDocument docAllUserDocumentAllUser alluserAllUserDocumentAllUserUser user//先生成一個XMLBean的實例doc = AllUserDocumentFactorynewInstance()//像這個實例中加入一個節點alluser = docaddNewAllUser()try { Hashtable env = new Hashtable()Context ctx = nullctx = new InitialContext()DataSource ds = (DataSource)ctxlookup(cgDataSource)Connection conn = dsgetConnection()Statement stmt = conncreateStatement()ResultSet rs = stmtexecuteQuery(select idname from +tablename)//通過JDBC取得數據集ResultSet while(rsnext())
{ //然後將數據集中的數據加入到XMLBean中user = alluseraddNewUser()usersetID(rsgetString(id))usersetName(rsgetString(name))} Systemoutprintln(doctoString())} catch(Exception ex)
{ exprintStackTrace()} //將結果集包裝為XMLBean後返回return doc}以上代碼的主要原理是通過JNDI取得數據源然後使用根據傳入的表名拼裝出一個SQL查詢語句然後由取得結果集後生成XMLBean返回
經過編譯後就可以導入生成一個Data Services了
最後測試結果如下
後記
ALDSP的功能很強大現在也有越來越多的關鍵應用在通過ALDSP來實現特別是異構數據源的訪問多數據庫的集成等業務而在ALDSP中通過導入Java函數做為數據源則更是進一步的模糊了數據源這個傳統概念的邊界總的來說通過Java函數ALSDP可以很靈活的處理各種數據結構比如將數據庫與LDAP Server的數據放在在一起訪問通過Java函數ALDSP可以與任何一種能由Java處理的數據進行集成從而得到統一數據訪問的目的ALDSP的這些功能對於SOA下各種異構數據的統一處理尤為重要
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26163.html