domino连接oracle解决方案---jdbc

来源:互联网 发布:java文件服务器搭建 编辑:程序博客网 时间:2024/06/02 06:35
原文地址:domino连接oracle解决方案-- 原文作者:zwm136200

前言

本文只简单介绍了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){}}}}