接到了工作室成立后的第一个任务,三人愁眉不展的坐在了工作室的会议室中。投影幕上显示的是第一个任务的要求:
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,不过如完善后,别忘记给我一份!谢谢!
作者: 一万光年外 欢迎交流
Blog: http://www.cnblogs.com/yaozy/