Derby 数据库支持两种交互模式:网络 模式和嵌入 模式。较为熟悉的交互模式可能是网络模式,在这种模式下,数据库服务器运行在一台计算机上,并且数据库客户机通过网络连接连接到中央服务器上。这种设置描述了大多数商业数据库的安装设置,通常都是遵循事务处理模型。
另一个模型是嵌入模式,在这种模式下,应用程序不但包含实现必要业务逻辑的软件,而且包含数据库引擎软件。最终,应用程序可以完全自包含,有助于简化安装和设置过程。为了强调这一点,因此考虑在本系列的所有文章中,始终只以嵌入模式使用 Apache Derby 数据库。
现在就要开始开发您自己的嵌入式 Derby 数据库应用程序。开发嵌入式数据库应用程序的过程一般可以分为三个步骤:
将数据库逻辑映射到 Java 类中。
开发管理数据库专有功能的 Java 代码。
实现 Java 应用程序中的业务逻辑。
这一节的其余部分先详细讨论这三个步骤,然后再继续讨论如何部署嵌入式 Apache Derby 应用程序。
对象-关系映射
这个简单的数据库将管理冲浪器材店的存货,主要关注包含冲浪器材店产品的数据库表。在本文中,您将开发一个显示冲浪器材店存货中具体项目详细清单的应用程序。
需要处理的第一步是实现映射到产品的 Java 类,该产品是 bigdog.products 表中的一行。在执行此操作时,您会遇到一个问题:表模式是在 SQL 中定义的,然而业务应用程序是用 Java 语言定义的。在 SQL 关系数据模型与 Java 对象模型之间映射有时会带来挑战,尤其是对于涉及通过主键-外键连接许多表的复杂数据库模式(或 Java 对象模型)。在形式上,此过程被称为对象-关系映射(Object-Relational Mapping,ORM)。
但是,对于这个演示应用程序,您将面对的惟一复杂度是如何把 bigdog.products 表的模式中使用的 SQL 数据库类型映射到适当的 Java 数据类型中。在本例中,过程相对简单,如清单 1 所示,在该清单中将定义 Product 类。
清单 1. 将产品表映射到 Java Product 类
public class Product {
private int itemNumber = 0 ;
private BigDecimal price = null ;
private Date stockDate = null ;
private String description = null ;
public Product(int itemNumber, BigDecimal price, Date stockDate, String description){
this.itemNumber = itemNumber ;
this.price = price ;
this.stockDate = stockDate ;
this.description = description ;
}
public void printProduct() {
String line = "------------------------------------" ;
System.out.println("\nBigdog's Surf Shop Product Information") ;
System.out.println(line + line);
System.out.printf("Item Number : %-11s\n", this.itemNumber) ;
System.out.printf("Item Price : $%-8.2f\n", this.price) ;
System.out.printf("Item StockDate : %-10s\n", this.stockDate) ;
System.out.printf("Item Description : %-40s\n", this.description) ;
System.out.println(line + line + "\n");
}
...
由于本系列的 第十篇文章 中从 bigdog.products 表中提取数据时介绍了关于执行查询的课程,因此您应对这个清单中提供的映射有些熟悉。该类定义了将 bigdog.products 表中的列与适当的 Java 数据类型相匹配的属性。在实践中,您可以为每个属性添加完整的 getter/setter 方法,虽然在这段演示代码中并没有这样做,但是大多数流行开发环境通常都会自动完成此操作。
Product 类中的两个主要方法是根据需要初始化对象的构造函数,以及为特定产品生成格式良好的输出的 printProduct 方法。此方法将被演示应用程序调用,但是放置在此类中以利用紧密耦合的优点 —— 毕竟,谁能比定义类更了解输出对象的方法?通常,您要为必须向业务应用程序公开的数据库中的每张表定义 Java 类。因此,虽然这样做对于这个简单的演示并不必要,但是您也可以构造一个 Java 类映射到 bigdog.vendors 表。
封装数据库逻辑
在数据库表被成功地映射到 Java 类中后,下一步是把数据库表与相应的 Java 类连接起来。一种可能的做法是将这段连接代码直接放到相应的 Java 类中 —— 例如,清单 1 中提供的 Product 类。但是,在大多数情况下,这样做不好,因为这将在数据库与数据库应用程序之间引入紧密连接。就像您在本 系列 中被反复警告的那样,通常应当尽量避免使用紧密耦合。
更好的方法是实现一个接口层,在该层中可以封装特定于数据库的 Java 代码。在这种方法中,如果数据库详细保存了更改,例如位置、版本甚至基本模式修改,则应用程序将被隔离;您需要做的惟一更改仅限于更改 DAO。此中间层中的 Java 类被称为 DAO,并且连接到数据库表的每个 Java 类通常都有一个 DAO 类。例如,在清单 2 中,ProductDAO 类提供了先前定义的 Product 类的 DAO。

