java实现跨数据库关联运算的简便方法

Java程序开发中会碰到跨数据库关联运算的情况,这里通过一个例子来看Java实现的方法。例子中sales表在db2数据库中,employee表在mysql数据库中。要将sales和employee表通过sales中的sellerid和employee中的eid关联起来,过滤出state=”California”的所有sales和employee数据。

Sales表的结构和数据如下:

Employee表的结构和数据如下:

两个表来自不同数据库,没有办法用sql来实现join。这里采用Java的数据计算类库RowSet来实现。RowSet提供了JoinRowSet和FilteredRowSet类,可以进行跨库的计算。

Java程序的编写思路是:

1、  分别从db2和mysql数据库中读入sales表和employee表数据,存入CachedRowSet对象中。

2、  使用JoinRowSet完成两个表的内连接。

3、  使用FilteredRowSet完成条件过滤。

4、  打印出结果数据。

下面两个函数分别读入db2和mysql数据,具体的代码如下:

public static RowSet db2() throws Exception {

String drive = "com.ibm.db2.jcc.DB2Driver";

String url = "jdbc:db2://127.0.0.1:50000/demo";

String DBUSER="db2admin";

String password="db2admin";

Connection conn = null;

Statement stmt= null;

ResultSet result = null;

Class.forName(drive);

conn =DriverManager.getConnection(url,DBUSER,password);

stmt = conn.createStatement();

result1 =stmt.executeQuery("SELECT * FROM sales");

CachedRowSetcachedRS = new CachedRowSetImpl();

cachedRS.populate(result);

result.close();

stmt.close();

conn.close();

returncachedRS;

}

public staticRowSetmysql() throws Exception {

Stringdrive = "com.mysql.jdbc.Driver";

String url ="jdbc:mysql://127.0.0.1:3306/test";

String DBUSER="root";

String password="root";

Connection conn = null;

Statement stmt= null;

ResultSet result1 = null;

Class.forName(drive);

conn=DriverManager.getConnection(url,DBUSER,password);

stmt = conn.createStatement();

result1 =stmt.executeQuery("SELECT * FROM employee");

CachedRowSetcachedRS = newCachedRowSetImpl();

cachedRS.populate(result1);

result1.close();

stmt.close();

conn.close();

returncachedRS;

}

下面的函数实现两个表的连接(join)和过滤(filter)。

publicstatic void myJoin() throws Exception {

//从两个数据库中取数

RowSetmysqlRS= mysql();

RowSetdb2RS= db2();

//完成两个表的join

JoinRowSetjoinRS= new JoinRowSetImpl();

joinRS.addRowSet(db2RS,"SELLERID");

joinRS.addRowSet(mysqlRS,"EID");

//完成条件过滤

FilteredRowSetfilterRS= new FilteredRowSetImpl();

filterRS.populate(joinRS);

StateRangerange = new StateRange();//过滤条件,具体实现见后

filterRS.setFilter(range);

while(filterRS.next()){//打印结果

int  ORDERID=filterRS.getInt("ORDERID");

int  SELLERID =filterRS.getInt("SELLERID");

StringNAME = filterRS.getString("NAME");

String STATE =filterRS.getString("STATE");

System.out.print("ORDERID="+ORDERID+";");

System.out.print("SELLERID="+SELLERID+";");

System.out.print("NAME="+NAME+";");

System.out.print("STATE="+STATE+";");

}

}

其中的StateRange对象需要自行实现,例如下面这个内部类:

public staticclass StateRange implements Predicate {

publicStateRange(){}

publicbooleanevaluate(RowSetrs) {

try {

if(rs.getString("STATE").equals("California"))

return true;//如果state等于California则保留

} catch (SQLException e) {

// do nothing

}

return false;

}

publicboolean evaluate(Objectvalue, int column) throws SQLException {

return false;

}

publicboolean evaluate(Objectvalue, String columnName)

throwsSQLException{

return false;

}

}

上面的代码实现了db2和mysql的跨库关联和过滤计算,但是有很多局限。首先是JoinRowSet只支持inner join,不支持outterjoin。第二是db2、mysql和hsql经过测试是可以使用JoinRowSet的,但是oracle 11g和其他数据库关联的的时候虽然不报错,但是结果集为空。如果是oracle11g的两个数据库用户跨库做join,使用JoinRowSet可以得到正确的结果。所以说不同数据库厂家提供的Jdbc实现可能会影响上述方法的结果。第三,就是编程还是有点复杂。

采用集算器esProc辅助会是个更轻松的方案。集算器是专门为结构化(半结构化)数据处理设计的开发语言,实现跨数据库的关联计算很轻松,并和Java程序能无缝结合,从而使Java程序可以象SQL那样灵活实现跨库数据计算。集算器支持各种数据库,包括:oracle、db2、mysql、sqlserver、sybase、postgre等,均可完成inner join和outter join等各种跨库关联运算。

实现上述需求的esProc代码只需要8行,如下:

A1:连接预先配置好的db2数据源。

A2:连接预先配置好的mysql数据源。实际上对于oracle等其他数据库也同样支持。

A3、A4:分别从db2和mysql中读取sales序表和employee序表。esProc的集成开发环境可以直观的显示出导入的数据,如上图右边部分。

A5:使用集算器的对象引用机制,将sales序表和employee序表通过sellerid=eid关联。

A6:按照state="California"过滤序表。

A7:生成一个新的序表,得到需要的字段。

A8:返回给集算器程序的调用者。

最后,还需要在Java程序中调用这段esProc程序获得结果,使用esProc提供的jdbc即可完成。将上述esProc程序保存为test.dfx文件的话,Java调用的代码如下:

//建立esProcjdbc连接

Class.forName("com.esproc.jdbc.InternalDriver");

con= DriverManager.getConnection("jdbc:esproc:local://");

//调用esProc程序(存储过程),其中test是dfx的文件名

com.esproc.jdbc.InternalCStatementst;

st =(com.esproc.jdbc.InternalCStatement)con.prepareCall("calltest()");

//执行esProc存储过程

st.execute();

//获取结果集

ResultSet set = st.getResultSet();

时间: 2024-07-31 20:10:15

java实现跨数据库关联运算的简便方法的相关文章

用集算器实现跨数据库关联报表

实际应用中很多报表的数据来源于多个不同类型的数据库,报表数据源跨数据库是报表开发中的常态.目前实现这类跨库关联报表的方式有多种,但都会存在这样那样的问题. 使用报表工具自身多源关联功能 现在大多数主流报表工具都支持多数据源关联,这在某些方面确实为报表用户带来了便利.然而我们也经常会遇到通过报表自身的多源关联功能很难实现一些跨库关联的报表(由于数据结构和业务本身决定).这当然容易理解,报表工具主要是来做数据展现的,而对数据计算本身来说并不擅长. 即使有的能实现,在报表中做跨库关联计算的效率也较低,

Java实现文本文件按条件过滤的简便方法

程序开发中经常会碰到处理文本文件中数据的情况,这里通过一个例子来看用java实现文本文件按条件过滤的方法:从文本文件employee.txt中读取员工信息,从中找出1981年1月1日(含)之后出生的女员工. 文本文件empolyee.txt的格式如下: EID   NAME       SURNAME        GENDER  STATE        BIRTHDAY        HIREDATE         DEPT         SALARY 1       Rebecca  

Java连接MySQL数据库增删改查通用方法

Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类下面写好多方法,要是多个数据库,就要写多个类多个方法,导致代码编写太过于繁琐,所以为了改变这样的繁琐,我将连接数据库的方法进行了一系列的封装,使用户传入一个对象值Object就可以得到想要的. 我在之前写过一篇普通的Java连接MySQL数据库,大家可以看看,以便对比参考之后就知道差距了  数据库--MySQL-->Java篇 接下来我给大家讲讲如何将

Java读写Excel文件中数据的简便方法

Java开发项目中经常会碰到处理Excel文件中数据的情况,这里通过一个例子来看一下实现方法:从Excel文件orders.xls中读取订单信息,从中找出2010年1月1日(含)之后,并且SELLERID等于18的订单.找到的数据写入order_result.xls文件. Excel文件orders.xls的内容如下: ORDERID CLIENT SELLERID AMOUNT ORDERDATE 1 UJRNP 17 392 2008/11/2 15:28 2 SJCH 6 4802 200

java写的专门对付运算式子的方法

就是把昨天写的写成了爪哇,少了一些功能,基本的在,牛逼的大牛可以拿去修改做的更好. public boolean judge(char ch)//判断是不是字符数字 { if(ch >= '0' && ch <= '9') { return true; } return false; } public String[] tochange(String s_1)//中缀表达式转换为后缀表达式 { String S[] = new String[1000]; StringBuffe

在App_Data中创建数据库获取连接串简便方法!

原文发布时间为:2008-07-25 -- 来源于本人的百度文章 [由搬家工具导入] 1、在App_Data右击添加一个SQL数据库2、双击该数据库,在左边添加表,并显示表数据进行添加数据3、把刚刚创建好得表直接拖放到设计视图中的那个打开的页面中。 这时Visual Studio自动创建建立一个绑定到SqlDataSource控件的GridView。而且你还会看到Web.config里面得连接串了!你可以把那个连接串名字改成好记的,如本例用testconn。 4、最后你可以把那个 SqlData

爆料:为什么Entity Framework不能进行跨数据库查询

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 在上篇随笔中提到"对于跨数据库查询,我们没有找到通过LINQ to Entities实现的方法".后来仔细想想,从理论来讲,实现跨数据库查询应该不难啊,与非跨数据库查询相比,只是多了个数据库名,比如下面的非跨数据库查询语句: SELE

在java中对数据库进行增删改查(转)

1.java连接MySql数据库 代码区域: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 package com.oracle.jdbc.demo1; import java.sql.Connection; import java.sql.DriverManager; import java.sql.S

关系代数的问题与尝试(2)关联运算及描述

下面我们来讲关系代数中的具体的问题,先谈关联运算的描述. 使用SQL对于单表进行查询并不是很难理解和实施,一般也就是选取字段.过滤.排序等,只有分组汇总稍复杂些,也不是多难懂. 但是,有意义的查询经常是多表的,比如查一下从北京到上海打了多少电话,存款超过10万元的人中本科学历及以上的有多少.这些都需要用到多表关联运算. SQL中用多表关联运算是用JOIN运算实现的,JOIN运算在关系代数中定义非常简单通用,就是两个表做笛卡尔积后再过滤. 简单的好处,就是适用面广,什么都能表达:但也有坏处,它没有