戏说平台 第五章 异构 一种独特的实现异构数据库操作的方法
2009-02-11 20:52
351 查看
接到了工作室成立后的第一个任务,三人愁眉不展的坐在了工作室的会议室中。投影幕上显示的是第一个任务的要求:
1. 写一个能够操作多种异构关系数据库的中间件
2. 支持在程序中直接书写Insert、Update、Delete、Select等常见语句的能力
3. 要求可在不改动程序的情况下提供对未知关系数据库支持的能力
说明:以上所指的关系数据库是指符合相关SQL标准的关系数据库
姚鑫辰问:“不知两位可有办法?”
爱找碴爱理不理的道:“这个任务太难了,我看是他们故意找碴,我估计是没什么希望了,干脆散伙得了!”又小声嘀咕:“又不是我要回家,反正我无所谓!“
姚鑫辰无助的看向包打听:“包打听,你可得帮我啊,我的前程全压在你的头上了!“
包打听:“实现第一个目标不难,现正流行的ORM框架都有现成的实例,比如业界(C#)最出名的NHibernate就实现了对常见关系数据库的支持,而且还有源码,要是只有第一个目标,直接COPY过来就行了!不过…“
包打听顿了一顿,继续说道:“至于第三点,NHibernate的HQL现倒是支持Select,暂时还不支持Insert、Update、Delete,何况还有一个‘等’字!说道支持Insert、Update、Delete,Hibernate倒是支持,不过那是JAVA的东西,但也不支持’等’啊!至于第二点,NHibernate就更不可能了,而且好像我还没有听过能够已经做到这一点的!”。
“那就是不可能了?” 姚鑫辰灰心的道。
包打听:“不是说不可能,是没有现成的东西!况且不是我说你,兄弟!做事情不能老是灰心丧气的,我觉得人生其实特短暂!”喝了口水,包打听继续说道:“眼睛一闭,一睁,啊哈,一天就过去了;眼睛一闭,没睁,一辈子就过去了。你不像我们NPC,想死都不能,简直是他妈的生不如死啊!”
包打听用只能自己听得见的声音小声嘀咕:“要不谁愿意加入你的工作室啊,这不是没事找事干嘛!”
“我靠,意思是死还是一种幸福啊!” 姚鑫辰苦笑,振作道:“不过前面那句话倒是说对了,世上无难事,只怕有心人!我决不可以放弃!”
包打听:“这样就对了嘛!其实我们碰到了问题,可以慢慢分析考虑嘛,比如说第二点,要提供在不改动程序的情况下提供支持未知关系数据库,其实就隐含了配…”
姚鑫辰兴奋的打断:“对,配置!就是配置,要提供在不改变程序的情况下更改程序行为,只有通过配置来实现!”顿了顿,又继续想道:“我们是不是可以这样想,要求支持的不同的关系数据库都有一个共同点,就是都支持相关SQL标准,只是具体的顺序和关键字及函数等可能有不同,就像普通话与地方语言一样,比如普通话你先走,广东话是你走先,普通话说什么,广东话是乜嘢…”
“对啊,思路正确!如果我们要把普通话翻译成广东话,那应该…”包打听继续提示道。
姚鑫辰兴奋道:“借助翻译机!其实也就是一段翻译程序,是不是我们也可以这样理解,我们可用标准SQL或某一数据库语言为标准,然后通过翻译程序把标准语言翻译成对应关系数据库的语言就行了!”,想了想道:“不过,这个翻译程序可不是简单的事啊!包打听,你有好的办法吗?”
包打听:“说到翻译,我倒是有个新想法,就是不知可不可行?”
姚鑫辰:“什么新想法,说来听听!”
包打听:“你知道XSLT吧?”
姚鑫辰:“知道啊,现在有很多网站都用XSLT+XML来做啊,据说这样更能使界面和数据分离,其原理就是解析引擎通过XSLT样式把XML数据翻译成HTML网页啊!对了,等等!我知道了!”
姚鑫辰跳了起来,激动的说道:“我们把标准的SQL语言解析成XML树状结构,然后针对每种不同数据库分别写一份XSLT样式文件,解析引擎就能把XML树状结构的SQL语言转成对应的数据的语言!”
姚鑫辰兴奋得跳了起来,说道:“ 我觉得这种方案可行!因为解析引擎可直接用现成的,需要做的工作只是把标准SQL解析成XML,然后针对不同数据库写不同的XSLT就行了,嗯!工作量应该也不算太大!并且能满足所有的要求,支持未知数据库也不要改程序,只需要写对就数据库的XSLT就行了!”高兴道:“这个方案好,就用这个方案了!”
几分钟后,还没有从激动中恢复过来,继续说道:“下面我以实际为例来进行简单模拟!”
“首先,我们就以T-SQL为标准吧,比如说’select top 1 * from tb’这样一句T-SQL语句,我们首先把它解析成类似以下的XML样式:
<select>
<top>1</top>
<list>
<column>*</column>
</list>
<from>tb</from>
</select>”
喝了一口水,继续说道:“比如我们要把这个XML转成MYSQL语法,因为MYSQL没有TOP,而是在语句的最后用Limit限制记录数,所以需写类似以下的select的转换样式:
<xsl:template match="select">
select
…
<xsl:if test="@top">
limit <xsl:value-of select="@top"/>
</xsl:if>
</xsl:template>“
顿了一顿,接着说道:“然后通过XslCompiledTransform类进行转换就行了!”
“愿望是美好的,现实是残酷的,实际情况恐怕不是这么简单吧!”爱找碴阴阳怪气说道。
“这是自然,不过只要我们认准方向,排除万难,坚持到底,就一定是胜利!” 姚鑫辰满怀信心,说道:“今天晚了,明天我们就开始吧!”
…
若干时间以后,鑫辰工作室终于完成了它的第一个任务!也正式进级到B级,虽然离S级还有一段距离,离回家还有更漫长的路要走,但我们的主角却信心满满,因为他坚信:
坚持到底,就一定是胜利!
Ps:上述所说的支持异构数据库方法是我偶而想到的,我写了个示例程序,目前仅支持select和insert,又因我只熟悉SqlServer,转换的XSLT也只是乱写的,如有朋友需要源码研究,可留下EMAIL,不过如完善后,别忘记给我一份!谢谢!
作者: 一万光年外 欢迎交流
邮箱: freeoasoft@126.com
Blog: http://www.cnblogs.com/yaozy/
主页: http://www.freeoasoft.com
1. 写一个能够操作多种异构关系数据库的中间件
2. 支持在程序中直接书写Insert、Update、Delete、Select等常见语句的能力
3. 要求可在不改动程序的情况下提供对未知关系数据库支持的能力
说明:以上所指的关系数据库是指符合相关SQL标准的关系数据库
姚鑫辰问:“不知两位可有办法?”
爱找碴爱理不理的道:“这个任务太难了,我看是他们故意找碴,我估计是没什么希望了,干脆散伙得了!”又小声嘀咕:“又不是我要回家,反正我无所谓!“
姚鑫辰无助的看向包打听:“包打听,你可得帮我啊,我的前程全压在你的头上了!“
包打听:“实现第一个目标不难,现正流行的ORM框架都有现成的实例,比如业界(C#)最出名的NHibernate就实现了对常见关系数据库的支持,而且还有源码,要是只有第一个目标,直接COPY过来就行了!不过…“
包打听顿了一顿,继续说道:“至于第三点,NHibernate的HQL现倒是支持Select,暂时还不支持Insert、Update、Delete,何况还有一个‘等’字!说道支持Insert、Update、Delete,Hibernate倒是支持,不过那是JAVA的东西,但也不支持’等’啊!至于第二点,NHibernate就更不可能了,而且好像我还没有听过能够已经做到这一点的!”。
“那就是不可能了?” 姚鑫辰灰心的道。
包打听:“不是说不可能,是没有现成的东西!况且不是我说你,兄弟!做事情不能老是灰心丧气的,我觉得人生其实特短暂!”喝了口水,包打听继续说道:“眼睛一闭,一睁,啊哈,一天就过去了;眼睛一闭,没睁,一辈子就过去了。你不像我们NPC,想死都不能,简直是他妈的生不如死啊!”
包打听用只能自己听得见的声音小声嘀咕:“要不谁愿意加入你的工作室啊,这不是没事找事干嘛!”
“我靠,意思是死还是一种幸福啊!” 姚鑫辰苦笑,振作道:“不过前面那句话倒是说对了,世上无难事,只怕有心人!我决不可以放弃!”
包打听:“这样就对了嘛!其实我们碰到了问题,可以慢慢分析考虑嘛,比如说第二点,要提供在不改动程序的情况下提供支持未知关系数据库,其实就隐含了配…”
姚鑫辰兴奋的打断:“对,配置!就是配置,要提供在不改变程序的情况下更改程序行为,只有通过配置来实现!”顿了顿,又继续想道:“我们是不是可以这样想,要求支持的不同的关系数据库都有一个共同点,就是都支持相关SQL标准,只是具体的顺序和关键字及函数等可能有不同,就像普通话与地方语言一样,比如普通话你先走,广东话是你走先,普通话说什么,广东话是乜嘢…”
“对啊,思路正确!如果我们要把普通话翻译成广东话,那应该…”包打听继续提示道。
姚鑫辰兴奋道:“借助翻译机!其实也就是一段翻译程序,是不是我们也可以这样理解,我们可用标准SQL或某一数据库语言为标准,然后通过翻译程序把标准语言翻译成对应关系数据库的语言就行了!”,想了想道:“不过,这个翻译程序可不是简单的事啊!包打听,你有好的办法吗?”
包打听:“说到翻译,我倒是有个新想法,就是不知可不可行?”
姚鑫辰:“什么新想法,说来听听!”
包打听:“你知道XSLT吧?”
姚鑫辰:“知道啊,现在有很多网站都用XSLT+XML来做啊,据说这样更能使界面和数据分离,其原理就是解析引擎通过XSLT样式把XML数据翻译成HTML网页啊!对了,等等!我知道了!”
姚鑫辰跳了起来,激动的说道:“我们把标准的SQL语言解析成XML树状结构,然后针对每种不同数据库分别写一份XSLT样式文件,解析引擎就能把XML树状结构的SQL语言转成对应的数据的语言!”
姚鑫辰兴奋得跳了起来,说道:“ 我觉得这种方案可行!因为解析引擎可直接用现成的,需要做的工作只是把标准SQL解析成XML,然后针对不同数据库写不同的XSLT就行了,嗯!工作量应该也不算太大!并且能满足所有的要求,支持未知数据库也不要改程序,只需要写对就数据库的XSLT就行了!”高兴道:“这个方案好,就用这个方案了!”
几分钟后,还没有从激动中恢复过来,继续说道:“下面我以实际为例来进行简单模拟!”
“首先,我们就以T-SQL为标准吧,比如说’select top 1 * from tb’这样一句T-SQL语句,我们首先把它解析成类似以下的XML样式:
<select>
<top>1</top>
<list>
<column>*</column>
</list>
<from>tb</from>
</select>”
喝了一口水,继续说道:“比如我们要把这个XML转成MYSQL语法,因为MYSQL没有TOP,而是在语句的最后用Limit限制记录数,所以需写类似以下的select的转换样式:
<xsl:template match="select">
select
…
<xsl:if test="@top">
limit <xsl:value-of select="@top"/>
</xsl:if>
</xsl:template>“
顿了一顿,接着说道:“然后通过XslCompiledTransform类进行转换就行了!”
“愿望是美好的,现实是残酷的,实际情况恐怕不是这么简单吧!”爱找碴阴阳怪气说道。
“这是自然,不过只要我们认准方向,排除万难,坚持到底,就一定是胜利!” 姚鑫辰满怀信心,说道:“今天晚了,明天我们就开始吧!”
…
若干时间以后,鑫辰工作室终于完成了它的第一个任务!也正式进级到B级,虽然离S级还有一段距离,离回家还有更漫长的路要走,但我们的主角却信心满满,因为他坚信:
坚持到底,就一定是胜利!
Ps:上述所说的支持异构数据库方法是我偶而想到的,我写了个示例程序,目前仅支持select和insert,又因我只熟悉SqlServer,转换的XSLT也只是乱写的,如有朋友需要源码研究,可留下EMAIL,不过如完善后,别忘记给我一份!谢谢!
作者: 一万光年外 欢迎交流
邮箱: freeoasoft@126.com
Blog: http://www.cnblogs.com/yaozy/
主页: http://www.freeoasoft.com
相关文章推荐
- 一种在windows平台下实现自动操作应用的方法,附带源码地址及使用方法
- Android平台Camera实时滤镜实现方法探讨(一)--JNI操作Bitmap
- .NET平台下基于webservice,通过获取硬件cpu序列号和随机字符串序列号实现软件加密的一种方法。
- 拦截器、执行-拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。-by小雨
- 一种通过鼠标操作实现多边形的绘制的实现方法
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- C#实现程序启动唯一实例的一种方法
- [Java]Java实现线程操作的两种方法
- Java与C/C++异构平台的本地通信(Java也可以操作硬件)
- 实现磁贴的效果的一种方法
- IPv4_IPv6隧道技术的一种实现方法
- 实现对gridview删除行时弹出确认对话框的一种简单方法
- 整型数据与字符串类型相互转化的一种实现方法
- 一种客户端导航菜单的实现方法
- Java操作Excel的一种方法
- 一种高效率的排序方法-归并排序的实现(主要解决matlab中多维数组排序的问题)
- web app实现基站定位获取精确地理位置的一种简单方法
- 一种在SQLServer中实现Sequence的高效方法
- Robotium学习(七)- 实现用shell命令执行一些操作的方法
- Java操作Excel的一种方法