谈到iBATIS工作原理问题尤其要注意的是,有了iBATIS,你就再不需要直接编写JDBC代码或ADO.NET代码了。JDBC和ADO.NET的确非常强大,但使用起来总不免觉得太过繁琐。代码清单2-2给出了一个使用JDBC的例子。

代码清单2-2使用JDBC的代码示例

JDBC的代码

从这个例子中很容易看出,使用JDBCAPI编写代码需要许多额外的工作。尽管如此,每一行代码又都是必不可少的,所以要减少代码量还真不是一件容易的事情。最多也只不过能将其中的一些代码挪到某个实用方法(utilitymethod)中,最明显的就是那些关闭资源(如PreparedStatement和ResultSet)的代码。

对于iBATIS工作原理其实,如果使用iBATIS,iBATIS在后台也是运行这些相同的JDBC代码。iBATIS会获取数据库连接,设置SQL语句的参数,执行SQL语句,获取执行结果,并在最后关闭所有的资源。然而,你需要自己亲自编写的代码量却大大地减少了。代码清单2-3给出了使用iBATIS运行相同的SQL语句时你需要编写的代码。

代码清单2-3iBATIS显然比JDBC要精简得多

iBATIS的代码

根本无须比较,iBATIS代码明显更加简洁,更容易阅读,因此也更容易维护。本章稍后会讨论更多关于使用iBATIS的好处。但是现在,你最关心的可能是如何用Java代码运行以上的“SQL语句”。其实就像你在之前的示例中已经看到的,运行它仅仅需要一行简单代码:

  1. Employeeemp=(Employee)sqlMap.queryForObject("getEmployee",newInteger(5));

没什么好多说的。这行代码会执行相应的SQL语句,设置其参数并返回一个真实的Java对象作为结果。SQL语句被“干干净净”地封装在Java代码之外的一个XML文件中。iBATIS负责管理幕后的所有资源,其运行的实际效果与我们之前所见的代码清单2-2所示的JDBC的例子是完全一样的。

这就引起一个问题,iBATIS对所有的系统来说都以一样的方式工作吗?或者它仅仅是适用于某一类特定的应用?以下几节我们将回答这个问题,首先从iBATIS是多么的适合于小型应用说起。

2.1.iBATIS工作原理之于小型、简单系统

小型应用通常只涉及一个数据库,只有一些相当简单的用户接口和领域模型。它的业务逻辑层非常简单,有时对一些简单的只涉及增查改删(CRUD:Create,Read,Update,Delete)操作的应用来说甚至根本就不存在业务逻辑。iBATIS之所以非常适合于小型应用,有3个原因。

第一,iBATIS自己就很小并且简单。它不需要服务器或者其他任何类型的中间件。不需要任何额外的基础设施(infrastructure)。iBATIS也没有任何第三方依赖。iBATIS的最简安装只需要2个JAR文件,总计不过375KB。除了需要配置一下你的SQL映射文件外,iBATIS不需要进行任何安装,因此只需要几分钟时间你就可以拥有一个可工作的持久层了。

第二,iBATIS不会对现存应用的设计或者数据库结构强加任何影响。因此,如果你有一个小型系统,且已经部分实现或者甚至已经发布了,则你仍然可以重构你的持久层以使用iBATIS,这非常简单。因为iBATIS很简单,所以它根本不会使得应用的架构过分复杂。而如果使用对象/关系映射工具或者代码生成工具,因为它们都事先就对应用以及数据库的设计做了某些假设,因此它们不可能对应用的架构毫无影响。

最后,只要你有过软件开发的经验,相信你就不会怀疑,任何一个小软件都几乎不可避免地有一天会成长为一个大软件。所有成功的软件都有进一步成长的趋势。这是一件好事,而我们接下来想说的就是,iBATIS同样非常适合于大型系统,它甚至可以扩展以满足企业级应用的需要。

2.2iBATIS工作原理之于大型、企业级系统

iBATIS就是为企业级应用而设计的。最重要的是,iBATIS在这个领域比之其他解决方案有着大量的优点。iBATIS最初的创建者只有从大型应用到企业级应用系统的开发经验。这一类系统通常都涉及不止一个数据库,且所有这些数据库都是不可控的。在第一章中我们讨论了各种类型的数据库,包括企业级数据库、私有数据库和遗留数据库。作者创建iBATIS框架一个很重要的原因就是针对这样的数据库。因此,iBATIS拥有许多使其非常适合于企业应用环境的特点。

其实iBATIS适用于大型系统中的第一个原因我们已经说过了,不过这个原因的确很重要,所以我们还是想再强调一下:iBATIS没有对你的数据库模型和对象模型的设计做任何假设。不论你的应用中这两个模型之间是多么不匹配,iBATIS都能适用。更进一步,iBATIS没有对你的企业级应用的架构做出任何假设。不论你对数据库是根据业务功能纵向划分,还是按照技术横向划分,iBATIS都允许你高效地处理数据并将它们整合到你的面向对象的应用中去。

第二点,iBATIS的某些特性使得它能够非常高效地处理大型数据集。iBATIS支持的行处理器(rowhandler)使得它能够批处理超大型记录集,一次一条记录。iBATIS也支持只获取某个范围内的结果,这就使得你可以只获取那些你当前亟需的数据。例如,假设你获取了10,000条记录,而你其实只需要其中的第500至600条,那你就可以简单的仅获取这些记录。iBATIS支持驱动提示使得执行这样的操作非常高效。

最后一点,iBATIS允许你用多种方式建立从对象到数据库的映射关系。一个企业级系统只以一种模式工作的情况是非常少见的。许多企业级系统需要在白天执行事务性的工作,而在晚上执行批处理工作。iBATIS允许你将同一个类以多种方式映射,以保证每一种工作都能以最高效的方式执行。iBATIS同样支持多种数据获取策略。例如,你可以选择对某些数据进行懒加载,也可以将一个复杂的对象图只用一条联合查询SQL语句就同时加载完毕,从而避免严重的性能问题。

以上所说的这些似乎好像在自我推销了。那么,既然我们已经进入了这种状态,为何不继续深入研究一下你需要使用iBATIS的理由呢?我们会在2.3节做这件事情。并且为了公平起见,在2.4节中,我们还会讨论一些你不应该使用iBATIS的情况。

iBATIS工作原理浅析就到这里,那么现在你对iBATIS工作原理是不是有些了解了呢?