溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java 如何調(diào)用 SPL 腳本

發(fā)布時間:2020-07-10 10:07:29 來源:網(wǎng)絡(luò) 閱讀:256 作者:raqsoft 欄目:大數(shù)據(jù)

集算器提供了 JDBC 驅(qū)動,很容易嵌入到 Java 程序調(diào)用,方法和在 Java 中執(zhí)行 SQL 和存儲過程類似。

Java 應(yīng)用程序中部署集算器 JDBC


首先將 JDBC 部署到 java 應(yīng)用項目中,簡單來說就是,將啟動 JAVA 應(yīng)用程序時加載集算器所需的 jar 包及配置文件放到項目中。需要注意的是,集算器 JDBC 所要求的 JDK 版本不得低于 1.6。


1. 加載驅(qū)動 jar


集算器 JDBC 類似一個不帶物理表的數(shù)據(jù)庫 JDBC 驅(qū)動,可以把它簡單的看成是一個只有存儲過程的數(shù)據(jù)庫。另外,集算器 JDBC 是個完全嵌入式計算引擎,已經(jīng)在 JDBC 中完成了所有運算,不象數(shù)據(jù)庫那樣 JDBC 只是個接口,實際運算在獨立的數(shù)據(jù)庫服務(wù)器完成。


如果在 web 應(yīng)用項目下,可以把這些 jar 包放在 WEB-INF/lib 目錄下。集算器 JDBC 需要三個基礎(chǔ) jar 包,都可以在 [安裝目錄]\esProc\lib 目錄下找到:


dm.jar ?//集算器計算引擎及JDBC驅(qū)動包
icu4j_3_4_5.jar ?//處理國際化
jdom.jar ?//解析配置文件


除了以上的必需 jar,還有一些為完成特定功能的 jar 包:
比如數(shù)據(jù)庫作為數(shù)據(jù)源,那么還需要相應(yīng)數(shù)據(jù)庫的驅(qū)動 jar 包;
要讀寫 Office 文件,則需要加入 poi*.jar 和 xmlbeans.jar;
要使用繪制圖形功能,則需要加入 SVG 圖形處理相關(guān)的 jar 包,包括 batik*.jar、js.jar、pdf-transcoder.jar、xalan-2.6.0.jar、xercesImpl.jar、xml-apis.jar、xml-apis-ext.jar。


2. 部署 raqsoftConfig.xml


集算器還有個重要的配置文件 raqsoftConfig.xml,可以在 [安裝目錄]\esProc\config 下找到,需復(fù)制后放置在應(yīng)用項目的類路徑下,配置文件的名稱不可改變。
在 raqsoftConfig.xml 文件中,配置了授權(quán)信息、集算器主路徑、dfx 文件尋址路徑等各類信息。我們先看下最基本的配置,即集算器授權(quán)文件配置:


<?xml version="1.0" encoding=" UTF-8"?>
< Config Version="2">
<Runtime>
<Esproc>
? ?<!--集算器授權(quán)文件配置,可以是絕對路徑,也可以是相對路徑,使用相對路徑時是相對于類路徑-->
? ?<license>esproc.xml</license>
? ?<!--試用授權(quán)文件可從潤乾公司官網(wǎng)中下載-->
</Esproc>
</Runtime>
</Config>


Java 調(diào)用


Java 程序中調(diào)用 SPL 腳本 ,與 java 中調(diào)用 SQL 和存儲過程類似,下面來看下具體是怎樣實現(xiàn)的:


執(zhí)行 SPL 語句


比如創(chuàng)建一個數(shù)據(jù)表,并添加兩個字段 baseNum、square2,分別將 100 以內(nèi)的自然數(shù)及其的平方值組成 100 條記錄插入到數(shù)據(jù)表中,最后將表中的數(shù)據(jù)作為結(jié)果集返回。


Java 代碼如下:


 public ?void runSPL() throws ClassNotFoundException, SQLException{
? ? ? ?Connection con = null;
? ? ? ?PreparedStatement st;
? ? ? ?ResultSet set ;
? ?//建立連接
? ?Class._forName_("com.esproc.jdbc.InternalDriver");
? ?con= DriverManager._getConnection_("jdbc:esproc:local://");
? ?//直接執(zhí)行SPL語句,返回結(jié)果集
? ?st = (PreparedStatement)con.createStatement();
? ?ResultSet rs = st.executeQuery("=100.new(~:baseNum,~*~:square2)");
? ?//簡單處理結(jié)果集,將結(jié)果集中的字段名與數(shù)據(jù)輸出
? ? ?ResultSetMetaData rsmd = rs.getMetaData();
? ? ?int colCount = rsmd.getColumnCount();
? ?for ( int ?c = 1; c <= colCount;c++) {
? ?String title = rsmd.getColumnName(c);
? ?if( c > 1 ) {
? ? ? ?System._out_.print("\t");
? ?}
? ?else {
? ? ? ?System._out_.print("\n");
? ?}
? ? ? ?System._out_.print(title);
?}
? ?while (rs.next()) {
? ? for(int c = 1; c<= colCount; c++) {
? ? ? if ( c > 1 ) {
? ? ? ? ? ?System._out_.print("\t");
?}
? ? ? else {
? ? ? ? ? ?System._out_.print("\n");
?}
? ? Object o = rs.getObject(c);
? ? System._out_.print(o_.toString());
?}
?}
? //關(guān)閉連接
? if (con!=null) {
? ? ? ?con.close();
? }


執(zhí)行結(jié)果:


Java 如何調(diào)用 SPL 腳本


在 SPL 中訪問本地文件


通過 SPL 還可以訪問本地的文件,其中包括 Txt、Excel、Json、Csv、Ctx 等多種類型的文件,訪問時可以通過絕對路徑查文件位置,也可以通過相對路徑查找,使用相對路徑時,則是相對于配置文件中的主目錄,所以,首先我們來配置下主目錄:
在 raqsoftConfig.xml 文件的節(jié)點 < Esproc ></ Esproc > 中添加以下節(jié)點:


 <!--集算器主路徑,該路徑為單一的絕對路徑-->
<mainPath>D:\mainFile</mainPath>


我們把要調(diào)用的文件 employee.txt 放到主目錄下面,在 JAVA 中調(diào)用時,建立連接、輸出結(jié)果等部分的代碼與上例是完全相同的,調(diào)用 SPL 語句部分如下:


ResultSet rs=st.executeQuery("=file(\"D:\mainFile\employee.txt\").import@t()");


這里支持絕對路徑與相對路徑的使用,在 Java 中使用反斜杠 \ 表示轉(zhuǎn)義符。


執(zhí)行結(jié)果:


Java 如何調(diào)用 SPL 腳本


對于這種簡單運算,還可以使用簡單 SQL 語法:


ResultSet rs=st.executeQuery("$()select * from employee.txt");


其中 $() 表示訪問本地文件系統(tǒng),兩種寫法的結(jié)果集相同。


帶參數(shù)的 SPL 語句


參數(shù)是 SQL 語句的一個重要組成部分,同樣,SPL 語句中也支持參數(shù)的使用,例如,像上例中,要查詢 employee.txt 文件中的數(shù)據(jù),但是要求只查詢工資在 12000 到 20000 之間的記錄,并根據(jù)工資升序排序:


調(diào)用部分代碼如下:


 PreparedStatement pst = con.prepareStatement("$()select * from employee.txt where SALARY > ? and SALARY< ? order by SALARY");
//設(shè)置參數(shù)
pst.setObject(1,12000);
pst.setObject(2,20000);
ResultSet rs = pst.executeQuery();


其中用?表示參數(shù),然后通過 setObject() 為上面的參數(shù)一一賦值。


執(zhí)行結(jié)果:


Java 如何調(diào)用 SPL 腳本


有數(shù)據(jù)源的 SPL 語句


集算器 JDBC 既然是個數(shù)據(jù)計算引擎,那么數(shù)據(jù)來源的重要途徑之一就是數(shù)據(jù)庫了,JAVA 中如何來調(diào)用帶數(shù)據(jù)源的 SPL 語句呢?往下看:
JAVA 調(diào)用帶數(shù)據(jù)源的 SPL 語句之前,需要先在應(yīng)用項目中添加對應(yīng)的數(shù)據(jù)庫驅(qū)動,然后在配置文件 raqsoftConfig.xml 中配置數(shù)據(jù)源信息。
例如:調(diào)用的 SPL 語句中使用的數(shù)據(jù)源名稱為 demo,數(shù)據(jù)庫類型為 HSQL,那么配置如下:
首先,將 HSQL 的數(shù)據(jù)集驅(qū)動 hsqldb.jar 加載到應(yīng)用項目中;
其次,在 raqsoftConfig.Xml 的 < Runtime ></ Runtime > 節(jié)點中配置數(shù)據(jù)源信息:


<DBList>
<DB name="demo"> <!--數(shù)據(jù)源名稱-->
<property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" /> <!-- url連接-->
<property name="driver" value="org.hsqldb.jdbcDriver" /> <!--數(shù)據(jù)庫驅(qū)動-->
<property name="type" value="13" /> <!--數(shù)據(jù)庫類型-->
<property name="user" value="sa" /> <!--用戶名-->
<property name="password" value=""/> <!--密碼-->
<property name="batchSize" value="1000" />
<property name="autoConnect" value="true" /><!--是否自動連接,如果設(shè)定為true,則可以直接以$開頭的SQL語句來訪問數(shù)據(jù)庫,如果為false,則不會自動連接,使用前必須用connect(db)語句創(chuàng)建數(shù)據(jù)庫連接-->
<property name="useSchema" value="false" />
<property name="addTilde" value="false" />
<property name="dbCharset" value="UTF-8" />
<property name="clientCharset" value="UTF-8" />
<property name="needTransContent" value="false" />
<property name="needTransSentence" value="false" />
<property name="caseSentence" value="false" />
</DB>
</DBList>


現(xiàn)在我們通過 SPL 從 demo 數(shù)據(jù)源中查詢 SALES 表,過濾出 SELLERID 為 3 的員工,在 2014 年 11 月 11 號到 2014 年 12 月 12 號期間的所有訂單信息:


調(diào)用部分代碼如下:


 PreparedStatement pst = con.prepareStatement("$(demo)select * from SALES ?where ?SELLERID = ? and ?ORDERDATE>? and ORDERDATE<?");
//設(shè)置參數(shù)
pst.setObject(1,"3");
pst.setObject(2,java.sql.Date.valueOf("2014-11-11"));
pst.setObject(3,java.sql.Date.valueOf("2014-12-12"));
//獲取結(jié)果集
ResultSet rs = pst.executeQuery();


結(jié)果集輸出如下:


Java 如何調(diào)用 SPL 腳本


執(zhí)行 SPL 腳本


JAVA 集成集算器 JDBC 后,除了可以直接執(zhí)行單句的 SPL 語句,還可以調(diào)用更復(fù)雜的 SPL 腳本(后綴為 dfx 的文件)。
比如下面的 dfx 文件:

Java 如何調(diào)用 SPL 腳本 ? ? ? ? ?



SPL 腳本思路:
循環(huán)遍歷 CITIES 表記錄,通過 CITIES. STATES 過濾 STATES 表,若 STATES. ABBR 首字母為參數(shù) arg1,則將 STATES 表中的 NAME 值賦給 CITIES. STATE,并將 CITIES 表中的這條記錄拼接到 B1 格中,最終返回 B1 格的結(jié)果集。
在這個網(wǎng)格文件中,需要從數(shù)據(jù)源 demo 中獲取數(shù)據(jù),同時使用了參數(shù) arg1:


Java 如何調(diào)用 SPL 腳本


數(shù)據(jù)源配置方法可以參考上面的示例,網(wǎng)格文件保存為 city.dfx,dfx 文件可以存放在應(yīng)用項目類路徑或 raqsoftConfig.xml 中配置的主目錄下,當(dāng) dfx 文件比較多的時候,為了便于統(tǒng)一維護和管理,我們還可以將 dfx 文件放到 dfx 尋址路徑中,尋址路徑的配置方式如下:
在 raqsoftConfig.xml 文件的 < Esproc></ Esproc> 節(jié)點中,添加以下內(nèi)容:


<dfxPathList>
? <!--配置dfx文件尋址路徑,該路徑為絕對路徑,可以設(shè)置多個路徑,以“;”隔開--> ?
? <dfxPath>D:\dfxFile</dfxPath>
</dfxPathList>


調(diào)用部分代碼如下:


 //通過call調(diào)用存儲過程,其中city是dfx的文件名,?表示參數(shù),多個參數(shù)間用逗號間隔
?st =con.prepareCall("call city(?)");
?st.setObject(1, "A");
?//獲取結(jié)果集
?ResultSet rs = st.executeQuery();


通過 call 調(diào)用 dfx 文件除了上面的寫法,還可以在調(diào)用 dfx 時直接傳參,如下:


 ?st=con.prepareStatement("call city(\"A\")");
?//獲取結(jié)果集
?ResultSet rs = st.executeQuery();


執(zhí)行結(jié)果:


Java 如何調(diào)用 SPL 腳本


在 Java 中調(diào)用 dfx 文件時,也可以省略 call 直接使用 dfx (…),該用法同樣有兩種寫法,如下:


 ?//dfx名稱與參數(shù)間以空格作為分隔,多個參數(shù)間通過逗號分隔
?st =con.prepareCall("city ?");
?//設(shè)置參數(shù)
?st.setObject(1,"A");


或:


 st =con.prepareCall("city \"A\"");


以上幾種調(diào)用方法最終獲取的結(jié)果集均相同。
上述內(nèi)容就是 Java 調(diào)用 SPL 腳本的常用方式了,想了解更多用法的小伙伴兒可以去官網(wǎng)上的在線教程中查看


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI