iBATIS In Action:序言和目录

序言

在我的软件开发生涯中,我曾工作于多种不同的环境中。在同一家公司中,人们往往会以不同的方式进行开发。考虑到各种各样的挑战——人、工具,它们就是开发人员所处的世界——我们会很快意识到这个世界是如此变化多端。我永远不能了解下一个咨询项目会给我带来何种意外的挑战,所以总会在工具箱里放上各种不同的工具。在数年时间内,iBATIS不过是一个小代码块,它能在我需要手工编写JDBC代码时为我节省一些时间。

那么iBATIS是如何从我的工具箱中的小工具蜕变为一个Apache项目,被数以千计的人使用的呢?我从未有意把iBATIS作为一个完全的开源项目。代码就放在那里,但我既没有出售它,也没有与任何人共享。这事儿跟JPetStore有关。

200271日,对于网上流传的PetStore的故事,我作出了自己的反应。位于雷蒙德的一家很大的软件公司声称C#语言和.NET平台的生产力大大超过了Java,达到几个数量级之多。我是一个技术不可知论者,尽管C#.NET相当不错,如此说法我还是不能接受。在几周内的晚上,我就在编写JPetStore的代码。JPetStoreJava社区内引发了很多讨论。讨论最多的问题在于它没有使用EJB持久层——而是使用了一个小型的框架iBATIS

别人经常问我,“为什么你不使用其它的开源工具?”。在那个时候还没有其它类似于iBATIS的工具。有很多代码生成器,但我对开发时和生成时的代码生成器表示强烈不满。我只想说,任何可以生成的代码都可以抽象入框架。这就是iBATIS的本质所在:一个加快JDBC编码速度的抽象框架。

另一个经常被提及的问题是,“为什么不使用O/RM工具?”。O/RM工具可以在正确的环境下使用。如果你对数据库和对象模型(object model)有着完全的控制权,它会表现地很好:你可以容易地实现理想的映射,避免两者间恶梦般的不匹配关系。但是,对于我经常打交道的那些数据库,没有人会想着在这两者之间进行映射。使用一个不错的O/RM工具,如HibernateTopLink,或许可以。问题是,是否该进行映射?

有人曾给我讲过一个故事,“当你拥有一把用得顺手的锤子,就会认为全世界都是钉子”,你也听说过吧。O/RM工具是一种框架。框架建立在一些约束和假设的基础之上。这些约束和假设在特定环境下是理想的,却不能够适用于所有情况——并非一切都是钉子。我们开发人员的工作是为手头的问题寻找理想的解决方案——这个方案不应局限于我们已了解的,或是最流行的,抑或是网上最热的——它应当是最适合我们面临的问题的那个。对于不同的情况,我们需要不同的工具——iBATIS是其中的一个。

现在iBATIS已经有了三种语言的实现:JavaC#Ruby。有超过一打的开发人员在维护它,还有一个数以千计的开发人员组成的社区。您可以通过书籍、文章或博客来了解它。尽管iBATIS不是最好的数据持久工具,而且它可能永远也不会是,它仍然是成功的。在我停止回复邮件列表的时候,我意识到:社区已经接管了它。

拥有一个自发进行维护的社区是开源项目成功的真正标志。如果您读到这里,我认为您也是社区的一员。那一起来庆祝我们的小框架的成功吧!

CLINTON BEGIN

您需要了解的前提知识

(这段话原是作者对Java开发人员说的,这里就作一下转换)。

这本书将保持iBATIS简单性的主题,但有时一些抽象的概念需要更多笔墨。如果您对一些理论不熟悉,某些章节会显得有些冗长难懂,另一些章节则可以快速阅读。

本书假设您具备一些基础,您需要了解C#,这里不会讲述其相关内容,它不应是您所阅读的第一或第二本C#书籍。最好您能体会到使用ADO.NET的痛苦,甚至体验过O/RM工具的缺陷。

希望您了解SQLiBATIS是一个以SQL为核心的框架。我们不会生成它,您需要对它全权负责,所以您应当有一些SQL开发经验。

最后,您应当熟悉XMLiBATIS使用XML进行配置。iBATIS的未来版本可能会使用其它方式进行配置和开发,但是现在,您需要熟悉XML


译者的话

微软当年曾声称以28倍的性能优势和1/4的代码量领先于Java,这种结论能被一个Java开发人员接受才怪呢。

对于一个.NET开发人员来说,应该会很熟悉微软的SQLHelper了,它是对ADO.NET的简单封装。在博客园的经历让我知道,很多人在尝试编写自己的SQLHelper,让它更符合自己的需要。如果以这种方式开发,我们会很熟悉DataReaderDataSet,开发模式也趋向于数据库驱动了,我甚至一度对OO产生了怀疑。

另一方面,博客园中曾掀起过数次O/RM讨论热潮,仔细查看其中的讨论内容会发现,很多人仍将O/RM等同于O/RM工具,如NHibernateiBATIS.NETGentle.NET等,对O/RM存有一些误解(本人也是其中一员)。园子里的idior在他的这篇文章中对O/RM做了很好的阐述,加上后面的评论都很值得一看。

诚如本书作者所言,如果我们能对ADO.NETO/RM都有所体会,我们会更好地理解iBATIS

补充一点,除了作者提到的C#SQLXML,我们还需要一定的OO设计基础。如果还停留在DataReaderDataSet的思维方式上,使用iBATIS也不会很舒服 :)。不过如果您真的需要在iBATIS中使用DataSet,可以看看本人写过的一篇小文。唉,刚开始使用iBATIS的时候,老是想怎么连返回DataSet的方法都不提供,现在就不这么想了。

这一篇就作为我对《iBATIS in Action》翻译的开始了。书中的示例代码由Java语言实现,而iBATISJavaC#版本有所不同,所以打算将其转换为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.1iBATIS.NET Data Access 1.8.1版本。我在翻译过程中会尽量尊重原著,但限于Java与.NET版本的区别,会适当作一些转换;另外,对于示例代码,除了原著的例子,我有时还会提供一些自己的例子,数据库一般会是Northwind,这样我们就省却了安装数据库这一步了。

作者:Anders Cui
出处:http://anderslly.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Tag标签: iBATIS.NET
posted @ 2007-09-07 00:40 Anders Cui 阅读(2408) 评论(35)  编辑 收藏 网摘 所属分类: 25-iBATIS24-Open Source

  回复  引用    
#1楼2007-08-10 10:34 | apple[未注册用户]
每天都来学习下
lz加油

  回复  引用  查看    
#2楼[楼主]2007-08-11 00:20 | Anders Cui      
@apple
谢谢,我会尽量快一点

  回复  引用    
#3楼2007-08-11 15:04 | super c[未注册用户]
ibatis是个半自动的产品,这是它的灵活性所在,最讨厌繁复的配置文件了,两很快会有一个更灵活的产品替代它,或许是它的升级版。java社区的人太多,标准不统一的地方也太多。
  回复  引用  查看    
#4楼[楼主]2007-08-11 16:03 | Anders Cui      
@super c
iBATIS处于Domain Model和Database的中间层
减少了两者的依赖性
用CodeSmith能减少一定的工作量
我还想做一个自己的配置工具
进一步减少手工工作量

  回复  引用  查看    
#5楼2007-08-16 16:30 | 唐伯虎点.net      
LZ加油,很佩服你的,我会向你学习
  回复  引用  查看    
#6楼[楼主]2007-08-16 20:43 | Anders Cui      
@唐伯虎点.net
发现你也是用iBATIS的
一起学习!

  回复  引用  查看    
#7楼2007-09-07 15:31 | beyond精神      
Anders Cui 兄,是啊,我就是唐伯虎点.net ,现在改名啦~~

能加个QQ么~我现在正用NPetshop做参照来开发~ 53057610
或者MSN chaoren1641@hotmail.com

  回复  引用    
#8楼2007-11-21 14:57 | 李鑫[未注册用户]
十分感谢楼主的辛勤工作,为大家服务,为我们刚学习IBATIS的同学提供了很有用并且容易学的文档.祝福楼主能完成剩下的工作,让大家得到更多的学习.关注中.谢谢 :)
  回复  引用  查看    
#9楼[楼主]2007-11-22 11:41 | Anders Cui      
@李鑫
谢谢支持 :)

  回复  引用    
#10楼2007-12-28 00:17 | [心有灵犀][未注册用户]
iBATIS 也要需要生成各个表的实体类吧
  回复  引用  查看    
#11楼[楼主]2007-12-28 10:05 | Anders Cui      
@[心有灵犀]
是需要的 :)

  回复  引用    
#12楼2007-12-31 09:48 | gooddasenlin[未注册用户]
LZ加油!支持!支持!
  回复  引用  查看    
#13楼2008-02-06 00:28 | 畅想自由      
强力支持,这几天看那个英文文档,头都给我看大了,呵呵。
  回复  引用  查看    
#14楼2008-06-06 16:11 | yangjun      
It is cool,能看到这样的文章真是幸福。我越来越喜欢上博客园了,我想正是有你们的存在,博客园才越来越好。
  回复  引用    
#15楼2008-07-10 11:22 | glm[未注册用户]
我是来学习的,谁能给我一个用iBATIS做的,实现多表联合查询的完整的例子。
  回复  引用  查看    
#16楼2008-11-26 00:36 | 上不了岸的鱼{ttzhang}      
我的Ibatis.NET学习之路,将从这里正式开始
  回复  引用  查看    
#17楼[楼主]2008-11-26 01:47 | Anders Cui      
@上不了岸的鱼{ttzhang}
嗯,拿一段时间看看iBATIS.NET不错
对于了解.NET下的数据访问技术蛮有帮助的 :-) 希望你能早点上岸,哈哈

  回复  引用    
#18楼2008-12-08 20:10 | tanghh[未注册用户]
版主加油,继续后面的章节,很期待!
  回复  引用    
#19楼2008-12-14 02:50 | anothi[未注册用户]
有个问题想请教下
映射xml中statements/select节点的id一定要唯一么
dog.xml和cat.xml都有<select id="GetAll"... 就不允许么
这样不是很麻烦,每个xml的select id都要弄成GetAllDog.GetAllCat....

  回复  引用  查看    
#20楼[楼主]2008-12-14 16:08 | Anders Cui      
@anothi
不是这样的,每个XML文件都有一个namespace吧,这个跟id一起确定一条语句,只要这两个不完全一样就行了

  回复  引用    
#21楼2008-12-14 22:36 | anothi[未注册用户]
是啊 我也猜想应该有namespace来约束的
可是我两个xml的ns是不一样的啊 都有GetAll时就报错
This SQL map already contains a MappedStatement named GetAll
xml中的statements是这样的
<statements>
<select id="GetAll"....
这样调用
Mapper.Instance().QueryForList("GetAll"
不是知道是不是我写错了

  回复  引用  查看    
#22楼[楼主]2008-12-14 23:56 | Anders Cui      
@anothi
那你改成Namespace.GetAll试试看

  回复  引用    
#23楼2008-12-15 00:34 | anothi[未注册用户]
还是一样的
而且不允许ns.GetAll这样调用...
This SQL map does not contain a MappedStatement named ns.GetAll

  回复  引用    
#24楼2008-12-15 00:44 | anothi[未注册用户]
日啊 重新仔细看了下guide 原来不在sqlmap.config里设置useStatementNamespaces="true"那么默认是false的..
设置下为true就ok了..
多谢Anders Cui大大了 以后有问题还要请教

  回复  引用  查看    
#25楼[楼主]2008-12-15 10:05 | Anders Cui      
@anothi
原来如此啊,不用客气:)

  回复  引用    
#26楼2009-01-07 17:00 | mare[未注册用户]
支持一个!!
继续加油啊!!大大~~

  回复  引用    
#27楼2009-02-24 21:08 | tshs[未注册用户]
@Anders Cui
我想问一下ibatis的insert操作可不可以返回刚刚插入的这条实体类?
好象只能返回int?

  回复  引用  查看    
#28楼[楼主]2009-02-24 22:00 | Anders Cui      
好久没看了。Insert方法的返回值是int类型的,但你在插入数据时传入的参数是不是实体类的实例?

我以前遇到的情况是:假设实体类为Person,有属性Id,它对应数据库表Person,主键为Id,那么实际上只有当Id为自增列时才有必要知道插入后的值是什么,这时是有办法在Insert后获得新的Id值的。请参考:http://www.cnblogs.com/anderslly/archive/2007/11/05/executingnonquerystatement01.html" target="_new">http://www.cnblogs.com/anderslly/archive/2007/11/05/executingnonquerystatement01.html

  回复  引用    
#29楼2009-02-25 21:52 | tshs[未注册用户]
嗯 多谢 似乎insert方法只能返回int的
用曲折点的办法来返回实体类吧

  回复  引用  查看    
#30楼2009-03-24 01:35 | 江海客      
撞到这里才发现已经停更这么长时间了...呵呵。
虽然如此也让我这个没有接触过ORM框架的人收获颇丰(原来是直接对象化表,手工映射...但并非一一对应,和iBatis感觉异曲同工)

  回复  引用  查看    
#31楼2009-03-24 01:53 | 江海客      
看过了这个系列,再去看官方文档将就轻松多了,不过貌似官方不怎么勤快...
demo还是vs03

  回复  引用  查看    
#32楼[楼主]2009-03-24 02:22 | Anders Cui      
  回复  引用  查看    
#33楼2009-06-20 17:25 | Stranger      
“我只想说,任何可以生成的代码都可以抽象入框架。”
真是太帅了。
谢谢楼主,继续学习中。

  回复  引用  查看    
#34楼2009-07-05 18:15 | 老破      
翻译了快两年了。辛苦楼主了。



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 848500




相关文章:

相关链接: