以前写了一个数据采集系统,由于时间紧,以前概念模糊,没有考虑到不同数据库之间的字段映射关系。现在这个系统需要进行全省推广,所以就必须要改造这部分代码。

按照以前的想法,改造的时候肯定需要修改许多代码,但是仔细一想Spring中的IOC概念,于是用这种思想试试。

果然很不错,说真的,IOC太好了。我只是在原有的代码中插入一个引用点,所有的业务都在实现IOC概念的xml配置文件中搞定了。这是大的方面的IOC概念

在代码级别,也通过IOC概念编写,就是代码只负责处理数据,不负责处理业务。业务就放在Xml中进行定义。

通过这些完成了代码的改造。

代码如下:
-----------改造点--------------
public String toString(DB2DB t) {
StringBuffer sb = new StringBuffer();
sb.append(this.getColumnName()).append(" ");

sb.append(t.transformType(this.getType()));//这里就是插入点

---------处理的xml的代码-------------
还未用singleton改造

public class DB2DB {

private List getMapping() {
try {
SAXReader reader = new SAXReader();
Document doc = reader.read(this.getClass().getResource("/db2db.xml").getPath());
Element e = doc.getRootElement();
//得到对应的数据库类型下的映射对照
return doc.selectNodes("/dbmapping/"+e.attributeValue("db2db")+"/*");
}catch(Exception e) {
e.printStackTrace();
}
return null;
}

private String getNewType(String oldType,List nlist) {
if (nlist == null || nlist.size() == 0)
throw new IllegalArgumentException("未找到对应的数据库字段映射,请检查名称或在db2db.xml登记 类:"+this.getClass().getName());
for (int i=0; i<nlist.size(); i++) {
Element e = (Element)nlist.get(i);
if (oldType.trim().equals(e.attributeValue("from").trim())){
return e.attributeValue("to");
}
}
//如果没有找到对应的映射,就返回默认映射
Element e = (Element)nlist.get(0);
if (e.attributeValue("dto") == null)
throw new IllegalArgumentException("未找到字段匹配和默认值,请检查名称或在db2db.xml登记 类:"+this.getClass().getName());
return e.attributeValue("dto");
}

public String transformType(String oldType) {
return getNewType(oldType,getMapping());
}



public static void main(String[] args) {
DB2DB t = new DB2DB();

System.out.println(t.transformType("int"));

}


---------------业务定义、映射XML--------------------


<?xml version='1.0' encoding='utf-8'?>
<!--
文档说明:db2db.xml用于登记不同数据库直接字段映射关系
dbmapping的db2db属性用于说明本系统使用的是哪种库的映射
<default dto >用于指定某种数据库字段映射为找到时使用的默认值
<field form to>用于指定字段类型的映射关系
-->
<dbmapping db2db="sybase2mssql">
<sybase2mssql>
<default dto="varchar(20)" />
<field from="int" to="int" />
</sybase2mssql>

<oracle2mssql>
<default dto="varchar(230)" />
<field from="int1" to="d" />
</oracle2mssql>

<mysql2mssql>
<default dto="varchar(20)" />
<field from="int" to="numberic" />
</mysql2mssql>


</dbmapping>
评论
kayo 2008-08-04
请你阅读这篇文章,也许对你有点作用。



http://kayo.javaeye.com/blog/196182
looxiaohu 2008-08-02
你好,向你请教关于java的数据采集技术,不知道怎么做,希望你能给例子,谢谢。
email:looxiaohu@hotmail.com
发表评论

您还没有登录,请登录后发表评论

kayo
搜索本博客
我的相册
Ad1461d2-8745-3eba-ab39-18389260fce2-thumb
s1125472579
共 14 张
最近加入圈子
存档
最新评论