1.1.2 理解IBATIS的优点
IBATIS是一个混合的解决方案.它吸收了这些方案中的优秀思想,并且协调它们.表1.1列出了IBATIS从以上讨论的各种方案中吸取的思想.
既然你明白了IBATIS的基础,接下来的章节将讨论IBATIS持久层最重要的两个特性:SQL的外部化和封装性.这些概念一起为框架提供了许多有价值的优点.
外部化的SQL
从软件开发的上个十年中学到的智慧就是将一个系统设计成不同的互相协调通信的子系统.你想要分离由不同编程角色(比如用户接口设计,应用程序开发,和数据库管理)处理的事务.即使一个人担当了所有这些角色,它能给你一个很好的分层设计,以便你能专注于系统的特定模块.如果你将SQL嵌入到JAVA源代码中,这通常无益于数据库管理员或者与这个数据库相关的.NET开发人员.外部化的SQL将程序源代码和SQL分离,保持了两者的干净.这样做保证了SQL的语言,平台无关性.大多数现代开发语言将SQL表现为string,在连接长SQL语句时提及过.看下下面的简单SQL语句:
SELECT
PRODUCTID,
NAME,
DESCRIPTION,
CATEGORY
FROM PRODUCT
WHERE CATEGORY = ?
当被作为 string 嵌入现代编程语言,比如JAVA,这句文雅的SQL语句就会变成一堆语言特征,而且不易管理的代码:
String s = "SELECT"
+ " PRODUCTID,"
+ " NAME,"
+ " DESCRIPTION,"
+ " CATEGORY"
+ " FROM PRODUCT"
+ " WHERE CATEGORY = ?";
简单的忘记在 FROM 语句前加上空格就会导致 SQL 错误.你可以想象一段复杂的 SQL 语句将导致多大的麻烦.
IBATIS 的一个重要优点就是, 可以象写 SQL 一样的写 SQL.下面给你看下 IBATIS 映射的 SQL 语句:
SELECT
PRODUCTID,
NAME,
DESCRIPTION,
CATEGORY
FROM PRODUCT
WHERE CATEGORY = #categoryId#
注意, SQL 在结构和简单性上并没有被改变.最大的区别在于,参数#categoryId#的格式,这个一般是语言相关的细节.IBATIS 使它变得轻便而且可读性更好.
既然我们已经把 SQL 从代码中移到一个我们方便操作的地方, 我们需要把它与软件联系起来,使它能够被运行.
"封装"的 SQL
模块化是计算机编程里最古老的概念之一.在过程化的程序中,代码可以被分隔成文件,函数和过程.在面向对象程序中,代码经常被组织成类和方法.封装是一种模块化方式,不但将代码组织成联系的模块,而且隐藏具体的实现细节,仅仅提供接口给调用代码.
这个概念被扩展进入我们的持久层.我们通过定义 SQL 的输入和输出(inputs & outputs, 就是它的接口)来"封装" SQL, 另一方面对程序的其他部分隐藏 SQL 代码.你可以将"封装"认为是和将接口和实现分离相同的方式.如果你是个 SQL 开发人员,你可以认为"封装"就象把 SQL 语句隐藏在存储过程中.
IBATIS 使用 XML 来"封装"SQL.选择 XML 是因为其轻便的跨平台性,业界的广泛采用,和 XML 貌似将象 SQL 一样的长寿.IBATIS 使用 XML 来映射输入和输出.大部分 SQL 需要一个或几个参数,并产生一些结果表.确切的说, 结果被组织成一系列行和列.IBATIS 使你可以简单在参数,结果集与对象的属性间建立映射.看下下面的例子:
<select id="categoryById"
parameterClass="string" resultClass="category">
SELECT CATEGORYID, NAME, DESCRIPTION
FROM CATEGORY
WHERE CATEGORYID = #categoryId#
</select>
注意 SQL 周围的 XML.这是对 SQL 的"封装".<select>元素定义了语句的名字,输入参数的类型,输出的结果类型.对一个面向对象软件开发者来说,这更象一个方法标记.
通过"封装"和外部化 SQL, 使其具有简单和一致的特性.更多的映射语法和API的使用将在第2章进行讨论.在我们继续之前,更重要的是什么时候 IBATIS 适合你的程序结构.
1.2 IBATIS 适合哪里
几乎好的程序块都使用分层设计.分层设计将一个程序的技术责任分割成互相关联而又独立的部分,每部分实现特定的技术或接口.分层设计可以被用在各种语言中.图1.2展示了一种可以被用在大量业务程序里的分层结构.
你可以将箭头认为是"依赖于"或"使用".这种分层思想的灵感来源于 Demeter 规则,"每一层对其他层的了解是有限的:只了解紧靠着的层.
这个思想就是每个层只能和它的直接下层交流.这保证了依赖关系是一个方向的,避免不使用分层设计的应用程序中常常出现的"复式代码"(spaghetti code).
IBATIS 是一个持久层框架.持久层定位在应用程序的逻辑层和数据库之间.这样的分隔对保证你的持久策略和业务逻辑代码互不混淆是很重要的.这样分隔可以让你对象模型的改进不依赖于数据库的设计,因此你的代码可以被更简单的保持.
虽然 IBATIS 主要集中在持久层,但了解应用程序的其他层次也是很重要的.虽然你将注意分散,可以最小的依赖于某个特定的实现,但认为你可以不了解层之间的交互是天真的想法.不管你设计的多好,层之间总会有不直接的行为联系.接下来的章节将介绍层和 IBATIS 如何处理他们.