小型、简单系统
小型应用程序通常只涉及单个数据库,只有一些相当简单的用户界面和领域模型。它的业务逻辑非常简单,甚至对一些简单的CRUD (Create, Read, Update, Delete:增 删 查改)应用程序来说可能根本就不存在。MyBatis之所以非常适合于小型应用程序,有3个原因。
第一,MyBatis本身就很小并且简单。它不需要服务器或者其他任何类型的中间件。根本不需要任何额外的基础设施。MyBatis也没有任何第三方依赖。MyBatis的最简安装只需 要2个JAR文件,总计不过375KB。除了需要配置几个SQL映射文件外,MyBatis不需要进行任何其他安装,因此只需要几分钟时间就可以拥有一个可工作的持久层了。
第二,MyBatis不会对应用程序或者数据库的现有设计强加任何影响。因此,如果你有一个小型系统,且己经部分实现或者甚至己经发布了,那么依然可以轻松地重构持久层以使用MyBatis。 因为MyBatis很简单,所以它根本不会使得应用程序的架构过分复杂。而如果使用对象/关系映射工具或者代码生成工具,由于它们都对应用程序或数据库的设计做了某些假设,因此它们不可能 对应用程序的架构毫无影响。
最后,只要有过软件开发的经验,相信你就不会怀疑,任何一个小软件都几乎不可避免地有 一天会成长为一个大软件。所有成功的软件都有进一步成长的趋势。这是一件好事,而我们接下 来想说的就是,MyBatis同样非常适合于大型系统,它甚至可以扩展以满足企业级应用程序的需要。
MyBatis之于大型、企业级系统
MyBatis当初就是为企业级应用程序而设计的。最重要的是,MyBatis在这个领域比之其他解决方案有着大量的优点。MyBatis最初的创建者都只有从大型应用到企业级应用程序系统的开发经 验。这些系统通常都涉及不止一个数据库,且所有这些数据库都是不可控的。之前中我们讨论了各种类型的数据库,包括企业级数据库、私有数据库和遗留数据库。创建MyBatis框架一个很重要的原因就是针对这样的数据库。因此,MyBatis拥有许多适合于企业应用环境的特征。
其实MyBatis适用于大型系统中的第一个原因我们已经在其他地方说过了,不过这个原因的确很重要,所以我们再强调一下也不为过:MyBatis没有对数据库模型或对象模型的设计做任何假设。 不论你的应用程序中这两个模型之间是多么不匹配,MyBatis都能适用。况且,MyBatis没有对你的 企业级系统的架构做出任何假设。不论你对数据库是根据业务功能纵向划分,还是按照技术横向划分,MyBatis都允许高效地处理数据并将它整合到面向对象的应用程序中去。
第二点,MyBatis的某些特征使得它能够非常高效地处理大型数据集。MyBatis支持的行处理器使得它能够批处理超大型记录集(一次一条记录)。MyBatis也支持只获取某个范围 内的结果,这就使得你可以只获取那些你当前亟需的数据。例如,假设你有10 000条记录,但只 需要其中的第500条〜第600条,那么就可以轻松地仅获取这些记录。MyBatis支持驱动程序提示, 使得执行这样的操作非常高效。
最后一点,MyBatis允许你用多种方式建立从对象到数据库的映射关系。一个企业级系统只以一种模式工作的情况是非常少见的。许多企业级系统需要在白天执行事务性的功能,而在晚上执行批处理功能。MyBatis允许你将同一个类以多种方式映射,以保证每一种功能都能以最高效的方式执行。MyBatis同样支持多种数据获取策略。例如,可以选择对某些数据进行延迟加载,也可以 将一个复杂的对象图只用一条联合查询SQL语句就同时加载完毕,从而避免严重的性能问题。
我们有充足的理由说明,你几乎可以在任何系统中使用MyBatis。正如前面所介绍的, 像MyBatis这样一个框架能够使你的应用程序从架构级别上受益。本节就将讨论这些益处以及使这 些益处成为可能的iBATIS特征。
简单性
MyBatis被广泛认为是当今可用的最简单的持久化框架之一。简单性的理念根植于MyBatis开发团队,它在MyBatis的所有开发目标中居于首位。这种简单性的取得是因为MyBatis直接构建于JDBC 和SQL之上。MyBatis对于Java开发人员来说非常简单,因为它除了不用编写那么多代码外,与JDBC的工作机制非常相像。几乎你知道的关于JDBC的一切都对iBATIS同样适用。几乎可以认为, MyBatis就是以XML的形式描述的JDBC代码。也就是说,MyBatis拥有许多JDBC所没有的架构级的优点,我们随后就将讨论这些优点。MyBatis对于数据库管理员以及SQL程序员来说也非常容易 理解。iBATIS配置文件几乎人人都能读懂,只要有SQL编程的经验。
生产效率
任何一个优秀的框架,其基本目的都是使得框架的使用者能够获得更高的生产效率。一般情况下,框架负责处理公共的任务,减少编写重复的样板代码,以及解决复杂的架构级的问题。 MyBatis在给开发人员带来更高的开发效率方面做得非常成功。在Java用户组所做的—案例中, MyBatis减少了持久层大约62%的代码量。之所以能减少如此多的代码量, 究其原因是开发人员再不需要编写繁琐的JDBC代码了。SQL语句仍然是硬编码的,不过就像你在前面小节中所看到的,SQL不是问题——问题在于JDBCAPI。
性能
性能这个话题无疑会引起框架开发人员、框架使用者以及商业软件开发商之间的一场激烈争论。事实是,从一个较低的层次来看这个问题,无疑所有的框架都会带来一定的性能损失。一般 来说,如果你比较硬编码的JDBC代码和MyBatis代码,做一个1 000 000次的for循环,就会发现 JDBC在性能上的确有一些优势。幸运的是,在现代应用程序开发中,以上这样的for循环带来的 性能损失并不重要。真正重要的是,你如何从数据库中获取数据,何时获取,获取的频率又是多少。例如,从数据库中动态地获取记录的分页查询之所以能大大提高应用程序的性能就在于,你不会将潜在的成千上万条记录从数据库中一次取出。同样地,使用像延迟加载这样的特征可以避免加载那些当前用例并不需要的数据。另一方面,如果你确定需要加载一份复杂的对象图,涉及来自多个表的大量数据,那么使用一条SQL语句就完成所有对象的加载显然可以大大提高效率。 MyBatis支持许多性能优化措施。就目前而言,最重要的是 要知道MyBatis总是能通过一种简单的方式来配置和使用,其性能与JDBC相当,甚至更好。另一 个需要重点考虑的问题就是,并不是所有的JDBC代码都是编写良好的。JDBCAP非常复杂,编 写正确的代码需要非常小心。不幸的是,大量的JDBC代码都编写得相当糟糕,因此从较低层次上看甚至还没有MyBatis工作得好。