前言
本文只簡單介紹了Domino與Oracle交互的基本方法,沒有設計到複雜的技術。具體複雜的應用還請讀者參考其他文章。文中使用了連接池,在本文中並沒有具體介紹連接池的設計方案,在下一篇文章中將會就具體連接池設計方案作個說明!本文只做技術探討之用,對文中的錯誤歡迎指正。
應用背景
在Domino中開發應用程序經常要存取一些關係數據庫中的數據,在以前的Domino系統中除了使用昂貴的LEI,再有就是ODBC了(誰還用過其他的工具?)。但是就像社會在不斷進步一樣,Domino也在不斷進步。在IBM推出Domino6.0後,一切似乎都在改變!IBM似乎意識到了Domino與其他系統交互數據的重要性,在Domino6.0中增加了DCR,DECS,當然LEI還是在跟進。雖然Domino6.0的數據整合功能更加強大了,但有一點,都是通過配置來實現與其他數據庫的交互。配置的好處就是,點幾下鼠標,建幾個文檔一個應用就OK了,根本不需要複雜的編程,繁瑣的測試。缺陷就是不夠靈活,往往這些配置類的工具不能滿足我們的需要,或者這些工具本身有缺陷,造成我們需要過多的人工維護,比如DECS。當然,我們的需求不同,要求就不一樣,在我做的項目裏DECS和lEI並不能滿足我的要求,DCR只能與DB2關聯,不是我需要的。因此我的這篇文章裏所講的方法並不一定適合您。好了,繼續。
既然這些工具不能爲我所用,那我們就想辦法通過其他途徑達到我們目地。幸好在Domino6以後對Java的支持力度增強了,可實現的功能增多了,給我們選擇的方法也多了。
我就想一個問題,以前我做項目需要存取其他數據庫中的數據,只能利用Windows平臺的ODBC驅動。這麼做的代價就是只能在Windows平臺上部署應用,而不能用類Unix系統,這就好像被人束縛了手腳一樣。我的要求是能跨平臺,這麼一來就只有一個選擇了—JDBC。
這並不奇怪,當今企業應用中只有JDBC 和ODBC兩種跨數據庫連接技術,非彼即此,倒也沒什麼可選的,不過在跨平臺這一項上,只有JDBC才能勝任。那麼怎麼才能讓Domino使用JDBC驅動那,其實也很簡單。大家跟着我一步一步去做,一樣能辦到。以下開始切入正題。
二.實際操作
1.準備開發環境
先說一下開發環境:
Domino平臺:Domino6.5.5
操作系統:AIX5.3
數據庫:Oracle 9.2.0.8
開發工具:LotusDesigner + Eclipse
大家也可以在自己的機器上試驗Domino6.5.5+ WinXp + MySQL的組合,完全可以實現。
準備Oracle的JDBC驅動classes12.jar,講Jar包拷貝到Domino程序目錄下的jvm/lib/ext目錄下,然後重啓Domino服務器。好了在你的程序中可以使用JDBC驅動了,很簡單吧!
2.新建Domino設計元素
現在我開始實際的操作。新建一個數據庫jdbctest.nsf,然後在新建一個表單frmjdbctest
,在表單中新建幾個字段,和兩個按鈕。如圖
下圖是在IE瀏覽器中的樣式。
3.在Oracle中新建表
如圖。新建jdbctest表,包含字段fld_name,fld_general,fld_birthdayyear, fld_birthdaymonth, fld_birthdayday
4.編寫程序
編寫兩個代理agtDominoToOracle(附件一) 和agtOracleToDomino(附件二)
按鈕“存數據”觸發代理agtDominoToOracle。
按鈕“取數據”觸發代理agtOracleToDomino。
5.運行程序
先在表單填寫數據,然後點擊“存數據”按鈕。
然後點擊“取數據”按鈕現實存在Oracle中的數據。
這是通過pl/SQL取的數據,如下圖
在Domino中輸入的數據已經存進Oracle中,而Domino中沒有任何數據保存。
下圖是點擊“取數據”按鈕,得到的Oracle中的數據
二.
小結
通過以上步驟大家應該可以看到Domino與Oracle 甚至是其他數據庫的交互其實很簡單,這並不是什麼高深的技術,本文的目的也是拋磚引玉。希望大家都貢獻出自己的智慧,讓我們共同努力,Domino的明天會更好!
附件:Domino連接Oracle
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
agtDominoTooracle.java
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
import lotus.domino.*;
import java.sql.*;
import com.sinosoft.dao.PoolManager;
public class agtDominoToOracle extends AgentBase {
public void NotesMain() {
Session session = null;
AgentContext agentContext = null;
Document docContext = null;
StringBuffer strSQL = null;
String strname = null;
String strgeneral = null;
String strbir_year = null;
String strbir_month = null;
String strbir_day = null;
Connection conn = null;
Statement stmt = null;
int iUpdate = 0;
try {
session = getSession();
agentContext = session.getAgentContext();
docContext = agentContext.getDocumentContext();
//下面這段程序,大家可能不太明白了,這是取連接池
PoolManager pm = PoolManager.getInstance();
conn = pm.getConnection("platform");
//下面這段是採取直連方式訪問Oracle
/*
Class.forName(strDbDriver);
conn = DriverManager.getConnection(strDbURL, strUser, strPasswd);
*/
if(conn != null){
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
//
strname = docContext.getItemValueString("fld_name");
strgeneral = docContext.getItemValueString("fld_general");
strbir_year = docContext.getItemValueString("fld_birthdayyear");
strbir_month = docContext.getItemValueString("fld_birthdaymonth");
strbir_day = docContext.getItemValueString("fld_birthdayday");
strSQL = new StringBuffer();
strSQL.append("INSERT INTO JDBCTEST(FLD_NAME,FLD_GENERAL,FLD_BIRTHDAYYEAR,FLD_BIRTHDAYMONTH,FLD_BIRTHDAYDAY) ");
strSQL.append("VALUES('" + strname + "',");
strSQL.append("'" + strgeneral + "',");
strSQL.append("'" + strbir_year + "',");
strSQL.append("'" + strbir_month + "',");
strSQL.append("'" + strbir_day + "')");
iUpdate = stmt.executeUpdate(strSQL.toString());
}
} catch(Exception e) {
e.printStackTrace();
}finally{
try{
if (docContext != null){
docContext.recycle();
}
if (agentContext != null){
agentContext.recycle();
}
if(session != null){
session.recycle();
}
if(stmt != null){
stmt.close();
}
if(conn != null){
conn.close();
}
}catch(Exception e){
}
}
}
}
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
agtOracleToDomino.java
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
import lotus.domino.*;
import java.sql.*;
import com.sinosoft.dao.PoolManager;
public class agtOracleToDomino extends AgentBase {
public void NotesMain() {
Session session = null;
AgentContext agentContext = null;
Document docContext = null;
String strSQL = null;
String strname = null;
String strgeneral = null;
String strbir_year = null;
String strbir_month = null;
String strbir_day = null;
StringBuffer strHtml = null;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
session = getSession();
agentContext = session.getAgentContext();
docContext = agentContext.getDocumentContext();
System.out.println("run");
//下面這段程序,大家可能不太明白了,這是取連接池
PoolManager pm = PoolManager.getInstance();
conn = pm.getConnection("platform");
//下面這段是採取直連方式訪問Oracle
/*
Class.forName(strDbDriver);
conn = DriverManager.getConnection(strDbURL, strUser, strPasswd);
*/
if(conn != null){
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
strSQL = "SELECT * FROM JDBCTEST";
rs = stmt.executeQuery(strSQL);
strHtml = new StringBuffer();
strHtml.append("[<table>");
strHtml.append("<tr><td>姓名</td>");
strHtml.append("<td>性別</td>");
strHtml.append("<td>生日</td></tr>");
while(rs.next()){
strname = rs.getString("fld_name");
strgeneral = rs.getString("fld_general");
strbir_year = rs.getString("fld_birthdayyear");
strbir_month = rs.getString("fld_birthdaymonth");
strbir_day = rs.getString("fld_birthdayday");
strHtml.append("<tr><td>" + strname + "</td>");
strHtml.append("<td>" + strgeneral + "</td>");
strHtml.append("<td>" + strbir_year + "年" +strbir_month + "月" + strbir_day + "日" +"</td>");
}
strHtml.append("</table>]");
docContext.replaceItemValue("disOracledata", strHtml.toString()).recycle();
}
} catch(Exception e) {
e.printStackTrace();
}finally{
try{
if (docContext != null){
docContext.recycle();
}
if (agentContext != null){
agentContext.recycle();
}
if(session != null){
session.recycle();
}
if(stmt != null){
stmt.close();
}
if(conn != null){
conn.close();
}
}catch(Exception e){
}
}
}
}