直接描述的我的问题了。
我的需求是读取本地或异地的数据,程序中用到ResultSet(本地读取)和DepartResultset(异地读取,自己写的)来获得数据,程序就像这样:
[code="java"]
本地:代码一
conn = DBUtil.getConnection();
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = null;
rs = stmt.executeQuery(sql); [/code]
[code="java"]
异地:代码二
UnNativeDataSource ds = (UnNativeDataSource) DataSourceFactory.create(DataSourceTypes.UNNATIVETYPE);
DepartResultset rs = null;
rs = ds.exec(this.postCode,sql);
rs.first(); [/code]
下面再读取时统一用rs变量来读,如
[code="java"]
代码三:
if (rs.next()) {[/code]
我想问得是前面怎么设置两个不同类型rs, 怎么判断后给他转换个类型,就像如果true用本地rs,false用异地rs,最主要的是保证代码3不用修改。
[b]问题补充:[/b]
类被封装了,改不了。
我最简单的想法就是不用
[code="java"]if(本地)
if(rs.next)
...
else if(异地)
if(rs.next)
...[/code]
省略部分代码量比较大。
最好就是,[code="java"]Object rs = null;
if(本地)
rs = 本地
else
rs = 异地
然后if(rs.next)
...[/code]
有没有这种方式的实现。
[b]问题补充:[/b]
如果本地
Connection conn = DBUtil.getConnection();
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = null;
rs = stmt.executeQuery(sql);
/*
如果异地
UnNativeDataSource ds = (UnNativeDataSource) DataSourceFactory.create(DataSourceTypes.UNNATIVETYPE);
DepartResultset rs = null;
rs = ds.exec(this.postCode,sql);
rs.first();
*/
if(rs.next()){
...
}
我要做的是就是把注释的这段也实现出来,这样会不会清楚些。
[b]问题补充:[/b]
public void test(boolean isNative, Object obj){
if(flag)
rs = (ResultSet)Obj;
else
rs = (DepartResultset)Obj;
if(rs.next) ...
}
wangying95599 的做法试过,rs很难定义,定义成Object,它没有.next()方法;定义成ResultSet/DepartResultset,似乎不行。
最好的做法我想还是异地操作类继承ResultSet类比较好。但是类被封装起来了。想办法沟通去。谢谢大家!
[b]问题补充:[/b]
[quote]使用组合啊,你自定义一个类,做为抽象类,再下面搞两个实现类,一个实现类使用本地的ResultSet做为内在属性,然后覆盖它的某一些方法
另一个实现类使用远程的ResultSet做为内在属性,然后覆盖它的某一些方法,不就可以了吗?不需要去改已经封装好的代码,当然,这个方法也只能说是权宜之计,考虑一下,
wangdgsc (初级程序员) 2009-09-21 [/quote]
这个建议很好啊,虽然没做,但是思路比较清晰了,谢谢wangdgsc!
AbstractResulsetSet(抽象类)
|e
|x
|t
|e
|n
|d _____NativeResult {ResultSet rs; method(){return rs;}}
|s |
------|
|
_____UnNativeResult
{DepartResultset rs; method(){return rs;}}
使用组合啊,你自定义一个类,做为抽象类,再下面搞两个实现类,一个实现类使用本地的ResultSet做为内在属性,然后覆盖它的某一些方法
另一个实现类使用远程的ResultSet做为内在属性,然后覆盖它的某一些方法,不就可以了吗?不需要去改已经封装好的代码,当然,这个方法也只能说是权宜之计,考虑一下,
继承rs吧
rs对象不一样啊,你用instanceof判断是哪个rs对象不行吗
不是很清楚楼主的需求
用instance of 判断rs对象,就可以了。如果还是不行,只有等待高手了
可以利用Java的反射机制 用 rs.getClass().getName() 来获取类的名称
然后用获取的结果比对 DepartResultset 或者 ResultSet 来区分是本地还是异地。
public void test(boolean isNative, Object obj){
if(flag)
rs = (ResultSet)Obj;
else
rs = (DepartResultset)Obj;
if(rs.next) ...
}
只能 instanceOf 了
想办法,看能不能用多态,
异地实现ResultSet接口即可,不用判断.
定义一个MyResultSet接口继承ResultSet接口 你的问题不就解决了.
如果本地
Connection conn = DBUtil.getConnection();
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
MyResultSet rs = null;
rs = stmt.executeQuery(sql);
/*
如果异地
UnNativeDataSource ds = (UnNativeDataSource) DataSourceFactory.create(DataSourceTypes.UNNATIVETYPE);
MyResultSet rs = null;
rs = ds.exec(this.postCode,sql);
rs.first();
*/