序言
在我的软件开发生涯中,我曾工作于多种不同的环境中。在同一家公司中,人们往往会以不同的方式进行开发。考虑到各种各样的挑战——人、工具,它们就是开发人员所处的世界——我们会很快意识到这个世界是如此变化多端。我永远不能了解下一个咨询项目会给我带来何种意外的挑战,所以总会在工具箱里放上各种不同的工具。在数年时间内,iBATIS不过是一个小代码块,它能在我需要手工编写JDBC代码时为我节省一些时间。
那么iBATIS是如何从我的工具箱中的小工具蜕变为一个Apache项目,被数以千计的人使用的呢?我从未有意把iBATIS作为一个完全的开源项目。代码就放在那里,但我既没有出售它,也没有与任何人共享。这事儿跟JPetStore有关。
2002年7月1日,对于网上流传的PetStore的故事,我作出了自己的反应。位于雷蒙德的一家很大的软件公司声称C#语言和.NET平台的生产力大大超过了Java,达到几个数量级之多。我是一个技术不可知论者,尽管C#和.NET相当不错,如此说法我还是不能接受。在几周内的晚上,我就在编写JPetStore的代码。JPetStore在Java社区内引发了很多讨论。讨论最多的问题在于它没有使用EJB持久层——而是使用了一个小型的框架iBATIS。
别人经常问我,“为什么你不使用其它的开源工具?”。在那个时候还没有其它类似于iBATIS的工具。有很多代码生成器,但我对开发时和生成时的代码生成器表示强烈不满。我只想说,任何可以生成的代码都可以抽象入框架。这就是iBATIS的本质所在:一个加快JDBC编码速度的抽象框架。
另一个经常被提及的问题是,“为什么不使用O/RM工具?”。O/RM工具可以在正确的环境下使用。如果你对数据库和对象模型(object
model)有着完全的控制权,它会表现地很好:你可以容易地实现理想的映射,避免两者间恶梦般的不匹配关系。但是,对于我经常打交道的那些数据库,没有人会想着在这两者之间进行映射。使用一个不错的O/RM工具,如Hibernate或TopLink,或许可以。问题是,是否该进行映射?
有人曾给我讲过一个故事,“当你拥有一把用得顺手的锤子,就会认为全世界都是钉子”,你也听说过吧。O/RM工具是一种框架。框架建立在一些约束和假设的基础之上。这些约束和假设在特定环境下是理想的,却不能够适用于所有情况——并非一切都是钉子。我们开发人员的工作是为手头的问题寻找理想的解决方案——这个方案不应局限于我们已了解的,或是最流行的,抑或是网上最热的——它应当是最适合我们面临的问题的那个。对于不同的情况,我们需要不同的工具——iBATIS是其中的一个。
现在iBATIS已经有了三种语言的实现:Java,C#和Ruby。有超过一打的开发人员在维护它,还有一个数以千计的开发人员组成的社区。您可以通过书籍、文章或博客来了解它。尽管iBATIS不是最好的数据持久工具,而且它可能永远也不会是,它仍然是成功的。在我停止回复邮件列表的时候,我意识到:社区已经接管了它。
拥有一个自发进行维护的社区是开源项目成功的真正标志。如果您读到这里,我认为您也是社区的一员。那一起来庆祝我们的小框架的成功吧!
CLINTON BEGIN
您需要了解的前提知识:
(这段话原是作者对Java开发人员说的,这里就作一下转换)。
这本书将保持iBATIS简单性的主题,但有时一些抽象的概念需要更多笔墨。如果您对一些理论不熟悉,某些章节会显得有些冗长难懂,另一些章节则可以快速阅读。
本书假设您具备一些基础,您需要了解C#,这里不会讲述其相关内容,它不应是您所阅读的第一或第二本C#书籍。最好您能体会到使用ADO.NET的痛苦,甚至体验过O/RM工具的缺陷。
希望您了解SQL。iBATIS是一个以SQL为核心的框架。我们不会生成它,您需要对它全权负责,所以您应当有一些SQL开发经验。
最后,您应当熟悉XML。iBATIS使用XML进行配置。iBATIS的未来版本可能会使用其它方式进行配置和开发,但是现在,您需要熟悉XML。
译者的话:
微软当年曾声称以28倍的性能优势和1/4的代码量领先于Java,这种结论能被一个Java开发人员接受才怪呢。
对于一个.NET开发人员来说,应该会很熟悉微软的SQLHelper了,它是对ADO.NET的简单封装。在博客园的经历让我知道,很多人在尝试编写自己的SQLHelper,让它更符合自己的需要。如果以这种方式开发,我们会很熟悉DataReader和DataSet,开发模式也趋向于数据库驱动了,我甚至一度对OO产生了怀疑。
另一方面,博客园中曾掀起过数次O/RM讨论热潮,仔细查看其中的讨论内容会发现,很多人仍将O/RM等同于O/RM工具,如NHibernate,iBATIS.NET,Gentle.NET等,对O/RM存有一些误解(本人也是其中一员)。园子里的idior在他的这篇文章中对O/RM做了很好的阐述,加上后面的评论都很值得一看。
诚如本书作者所言,如果我们能对ADO.NET和O/RM都有所体会,我们会更好地理解iBATIS。
补充一点,除了作者提到的C#,SQL,XML,我们还需要一定的OO设计基础。如果还停留在DataReader和DataSet的思维方式上,使用iBATIS也不会很舒服
:)。不过如果您真的需要在iBATIS中使用DataSet,可以看看本人写过的一篇小文。唉,刚开始使用iBATIS的时候,老是想怎么连返回DataSet的方法都不提供,现在就不这么想了。
这一篇就作为我对《iBATIS in Action》翻译的开始了。书中的示例代码由Java语言实现,而iBATIS的Java和C#版本有所不同,所以打算将其转换为C#的实现。
本书的内容主要分为以下几大部分:iBATIS介绍,iBATIS基础,iBATIS实战,iBATIS诀窍(最佳实践等)。iBATIS介绍这一部分的内容并不简单,它是从较高层次来对iBATIS进行描述,有些内容较为抽象;后面几部分则较为具体,比较容易掌握。所以我决定从第二部分开始翻译,到最后对它有了更多理解后再翻译第一部分。
如果您也对使用iBATIS很有心得,我们可以一起讨论 :)。
已完成内容:
iBATIS
In Action:什么是iBATIS(一);
iBATIS
In Action:什么是iBATIS(二);
iBATIS
In Action: iBATIS的安装和配置;
iBATIS
In Action:使用映射语句(一);
iBATIS
In Action:使用映射语句(二);
iBATIS
In Action:执行非查询语句(一);
iBATIS
In Action:执行非查询语句(二);
iBATIS
In Action:使用高级查询技术(一);
您即将看到:
iBATIS In Action:使用高级查询技术(二);
iBATIS In Action:事务;
iBATIS In Action:使用动态SQL;
注意:文章中的API、配置文件等内容皆针对iBATIS.NET Data Mapper 1.5.1和iBATIS.NET
Data Access 1.8.1版本。我在翻译过程中会尽量尊重原著,但限于Java与.NET版本的区别,会适当作一些转换;另外,对于示例代码,除了原著的例子,我有时还会提供一些自己的例子,数据库一般会是Northwind,这样我们就省却了安装数据库这一步了。 |