2008-04-11
[原创]利用IOC的概念改造代码
以前写了一个数据采集系统,由于时间紧,以前概念模糊,没有考虑到不同数据库之间的字段映射关系。现在这个系统需要进行全省推广,所以就必须要改造这部分代码。
按照以前的想法,改造的时候肯定需要修改许多代码,但是仔细一想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>
按照以前的想法,改造的时候肯定需要修改许多代码,但是仔细一想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
http://kayo.javaeye.com/blog/196182
looxiaohu
2008-08-02
你好,向你请教关于java的数据采集技术,不知道怎么做,希望你能给例子,谢谢。
email:looxiaohu@hotmail.com
email:looxiaohu@hotmail.com
发表评论
- 浏览: 24249 次
- 性别:

- 来自: 安徽

- 详细资料
搜索本博客
我的相册
s1125472579
共 14 张
共 14 张
最近加入圈子
最新评论
-
遍历Set
lz你文不对题啊,你写的明明是遍历hashmap,怎么题目是遍历set,难道是这 ...
-- by Struts_Spring -
MMORPG
...
-- by kayo -
几种java开源缓存系统的性 ...
...
-- by kayo -
[原创]利用IOC的概念改 ...
请你阅读这篇文章,也许对你有点作用。http://kayo.javaeye.co ...
-- by kayo -
[原创]利用IOC的概念改 ...
你好,向你请教关于java的数据采集技术,不知道怎么做,希望你能给例子,谢谢。 ...
-- by looxiaohu






评论排行榜