本文配套源码
对于多数开发人员 — 尤其是各种Java版本的用户 — 数据绑定已经和闭包、单例(singletons)、Ajax一样变为常用词汇表中的一部分了。而且和其他术语一样,数据绑定也常常被错误的定义。
特别是大部分程序员在听到数据绑定 的时候,实际上想的是XML数据绑定。加上这个小小的单词XML,造成大多数程序员忽略了相当多的功能和灵活性,尤其是如果使用 Castor API的话。这是因为对于Castor而言,XML数据绑定仅仅是其中的一部分。除了绑定到XML文档之外,Castor还提供了将Java数据绑定到SQL数据库的能力。这就是所谓的SQL数据绑定。
定义SQL数据绑定
SQL数据绑定 也许是一个新的术语,概念其实非常简单。实际上,最好从一个更熟悉的术语 XML 数据绑定 出发来考察。XML 数据绑定就是在 XML 文档数据 — 通常存储在元素和属性中 — 和 Java 对象模型的属性之间建立映射的过程。可以通过编组程序和解组程序在两者之间移动数据。编组程序从 Java 对象模型获得数据存储到 XML 文档中,解组程序从 XML 文档获取数据存入Java对象模型的属性中。
在这个基础上,我们说 SQL 数据绑定是在 SQL 数据库数据 — 存储在模式、表、列等中 — 和 Java 对象之间建立映射的过程就毫不奇怪了。编组和解组的过程一样,只不过转换是在 Java 对象和 SQL 而不是 XML 之间进行的。实际上,多数数据绑定文章中如果将 XML 替换为 SQL,元素数据 更改为表记录,讨论的内容就变成了 SQL 数据绑定了。
SQL 数据绑定的意义
Java 技术刚诞生的时候基本上是一种玩具语言,很大程度上是因为它的 API 非常简单,而且主要关注于图像(还记得 AWT 吗?)。Java 技术走向成熟的标志是 Java 数据库连接(JDBC),能够持久到 SQL 数据库。JDBC 过去(现在也是)惟一的问题是用起来很笨重。并不是说多复杂,而是对于大多数程序而言增加了太多的额外工作。
使用 Castor 和 SQL 数据绑定可以避免大部分复杂性。更妙的是,这种 API 对于 XML 和 SQL 上下文功能基本相同。而且使用数据绑定,应用程序需要关心的细节也少了。处理 JDBC ResultSet 和行数不再是您的代码的问题了,几次简单的编组解组调用就能处理 Java 对象和 SQL 数据库之间的转换。
关于 SQL 数据绑定可能最有意思的是它没有受到过多 的压力和关注。特别是考虑到一大批程序员对 XML 心存芥蒂,说它冗长笨拙,或者他们更愿意使用二进制序列化。但是这些人对 SQL 双手欢迎。事实上,如果发现有一大批程序员甚至真正的程序员也不认为 SQL 是一种合法的数据存储和持久技术,您可能会非常吃惊(看看你周围有多少人认为关系数据库臃肿笨拙、夸大其词或者已经落伍)。
既然如此,SQL 数据绑定和它的 XML 兄弟相比无疑更有意义。企业应用程序中必然需要持久(或存储)数据,而编写数据访问和检索代码是痛苦的。SQL 数据绑定把一种熟悉的 API(假设您已经阅读过本系列前面的文章)用于 SQL 数据存储。几行命令就能把数据写入表(或者多个表)或者读出来。
仍然是映射
SQL 数据绑定特别重要的一点是,能够建立 Java 对象到 SQL 数据模式的映射而不需要绑定 Java 或者 SQL 名称。和 XML 相比,关系数据库的结构通常和 Java 对象的结构相距甚远。表是数据的集合,对象通常代表一部分(可能是一行)数据。对象之间的关系必须跟踪到其他对象,就像表之间的关系要跟踪到其他表。但是 Java 对象模型中没有一对多的连接表,当然也没有多对多连接。
即便是中等复杂程度的关系数据库,设计的东西也和对象模型不同。SQL 和 Java 对象之间的映射,大量的工作就是定义对象和表之间的映射。虽然映射可能很复杂,本文中将使用几个简单的映射说明 SQL 数据绑定中映射的基本原理。
这就是 JDO,对吗?
是。但也不全对。有几分对。这里有点让人费解。
Sun 有一个规范叫 Java 数据对象(Java Data Objects,JDO)。Java Specification Request (JSR) 12(JDO 1.0)和 JSR 243(JDO 2.0)定义了一种非常具体的 SQL 数据绑定方法(虽然从未明确地称为 “SQL 数据绑定”)。如果读过 JDO 然后再读本文开始的介绍部分,就会发现是一件事。但是,Castor 的 JDO(不错,Castor 也叫 JDO,事情更加混乱)不 同于 Sun 的 JDO,甚至没有任何关系,只不过两者的基本目标相同而已。
鉴于可能造成很大混淆,再强调一次:如果使用 Castor 的 JDO,那么它不是 Sun 的标准 API。但问题并不像看起来这么糟糕或者简单明了。实际上,Castor 的开发者正努力将其 API 的很多特性纳入 Sun 数据绑定和 JDO API。因此,虽然 Castor 现在还不是标准 API,但很多特性 — 包括 API 自身 — 可能有一天会成为标准化的 JDO API。