`

理解 pureQuery:IBM 最新的 Java 数据库应用编程范例

阅读更多

http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0708ahadian/index.html

 

 

简介

关系数据访问的对象化

大多数业务都建立在信息管理系统的基础上,而这些信息管理系统主要的底层基础设施又是基于存储在一个或多个关系数据库中的数据。这些系统由一些软件程序组成,这些软件程序专门用于信息处理,并且是以 Java 之类的托管语言实现的。

作为一种以封装、继承和多态为特征、易于使用、基于面向对象的语言,Java 一方面用于实现信息处理程序的计算和逻辑方面,另一方面则用于访问和操纵关系数据。Java 按照对象 来定义信息,而数据库则使用 。对象是其所属类的惟一实例,在物理上,对象之间互有区别。同样,关系数据库中的行也是惟一的,它们由主键值标识。另一方面,对象是独立的,只要还被一个或多个其它对象引用,它就继续存在着。而行被包含在表当中,当被从表中删除时,也就随之消失。

因此,虽然对象与行在很多方面相似,但对象对于模块化编程的内在价值在于可伸缩性、可扩展性和高效的代码维护,这是通过 对象化(objectization) 抽 象关系行的设计基础。我们把对象化定义为这样一种过程:将面向对象的基本概念(封装、继承和多态)引入到使用 SQL 执行的指令式的、内联的数据查询实践。简言之,对象化就是创建无缝对象的过程,使用的方法可以通过纯面向对象范例执行数据库操作(包括创建、替换、更新和 删除)。

对于通过对象化来编程式地访问和操纵关系数据,最流行的方式是通过一些 API 和包装器,这些 API 和包装器提供了一个或多个编写为文本字符串的 SQL 语句。整个关系数据处理都是基于这些封装的 SQL 语句的,它们是程序逻辑的重要组成部分。但是,这些 SQL 语句对于 Java 语言不是透明的,不能享受编译时优化和语义及语法验证的好处 —— 更不用说诸如内容辅助之类可以在底层设计和实现过程中节省大量时间的设计时特性了。

因此,在提高程序员的效率和生产率时,一个主要的挑战是将关系数据转换为可通过自然的面向对象方式无缝使用的对象,从而编写底层代码。要实现这种转换,需 要很好地理解如何安排数据访问 API 调用的顺序,并从技术上理解底层的数据访问编程模型(例如 JDBC),此外,还需要具备优秀的编程技能并能够将软件(尤其是它的数据访问层)拆分成多个模块化部分。

pureQuery 项目为数据库应用开发人员提供了一套基于 GUI 且易用的方法,它能够显著提高应用程序的设计和实现阶段的生产效率。通过将关系数据自动转换为 Java 对象的实现方式,方便了用户对数据的访问和操纵。将关系数据转换为 Java 对象后,就可以很自然的通过面向对象编程范例无缝地利用这些对象来编写业务逻辑和底层代码。通过将查询语言与 Java 本身相集成,pureQuery 可以代替传统的 JDBC 编程。

本文对 pureQuery 进行了概述,并提供一个详细的场景,以展示 pureQuery 如何显著提高程序员的生产率。

 




回页首


pureQuery 是什么?

pureQuery 是一个基于 Eclipse 的、可插拔的组件,它可以与 Eclipse 集成开发环境(IDE)无缝集成。它自动提供设计和运行时方式,可将关系数据作为对象管理。这种设计使开发人员可以指定一个数据库连接(例如使用 DB2®),然后使 Eclipse Java 项目能够识别底层的数据库工件(例如表、存储过程等)。在建立连接并完成所有数据库工件的自动发现之后,用户可以通过 GUI 直观地将任何底层关系表实体转换成 Java 对象。这是通过自动生成相关 SQL 语句和自动创建封装这些语句的父 Java 对象来实现的。然后,还可以在一个自然的 Eclipse IDE 编程环境中,使用充分集成的 SQL 和 Java 编辑功能对生成的 Java 对象和其中包含的 SQL 语句进行进一步定制。

Java 编辑器与 SQL 的紧密集成可以提高编程生产率,提供无缝的设计时体验,并在编写 Java 代码时简化 SQL 编码。编辑器集成包括设计时编译过程中完全支持的语义和语法验证、内容辅助、语法着色以及在 Java 中动态、选择性执行 SQL,当出错时,像处理 Java 错误一样在错误面板中进行标记。

而且,设计和运行时之间的紧密联合,使得 SQL 语句可在设计时运行。运行 SQL 语句时,将考虑所使用的全部主机变量和参数,以预览结果集,并自动回滚执行 SQL 语句导致的副作用。

此外,在设计时,可通过启动 Visual Explain 对选择的 SQL 语句进行性能分析,为查询请求的优化器实现提供可视化表示。查询请求被拆分成不同的部分,每个部分用图标表示。Visual Explain 还包括关于查询优化器所考虑和选择的数据库对象的信息。Visual Explain 提供了对查询实现的详细表示,在设计时就可以从集成的 SQL-Eclipse Java 编辑器中轻松找到造成昂贵成本的原因。

pureQuery 对象化过程

pureQuery 系统提供三种不同的方式来将关系访问层转换成基于对象的模型。

  • 数据库驱动的对象化(Database-driven objectization,DDO):
    pureQuery 的最常见用法是选择一个表,然后生成用于数据访问和操纵(即创建、替换、更新、删除)的对象。此时,pureQuery 生成基于面向对象的类和接口,用于在所选表上执行 CRUD 操作。它还生成一个特殊的类,这个类可用于对创建的对象进行单元测试。实际上,这是一个表到 Java 的转换,其中,根据底层表的特征生成以 Java 为中心的 CRUD 操作。在 概览 小节中我们将对此作详细讨论。
  • 查询驱动的对象化(Query-driven objectization,QDO):
    通常,需要从一组已有的数据库查询语句(SQL)实现应用程序构建。这时就需要基于已有的查询语句生成对象层次,这些查询语句又可用于构建底层的应用程 序。实际上,这是一个 SQL 到 Java 的转换,此转换过程将查询语句无缝地转换为以 Java 为中心的对象。在 pureQuery 系统中,只需单击选中一个查询语句,利用直观的 GUI 方式(弹出的上下文菜单),就可以很容易地生成相关的对象类层次。该系统实际上利用作为解析查询语句的结果的元数据(或者通过它所维护的来自底层数据库连 接的元数据)自动生成所需的对象类。
  • 对象-关系映射(ORM):
    有 时候已经存在表示一个关系表的 bean 类,但是还不存在该类与所需的数据库表之间的实际链接。pureQuery 凭借其丰富的内容辅助基础设施提供了一种直观的机制,可以执行类名到底层数据库中给定表名之间的一对一映射,并能够将类的受保护(或公共)变量映射到表中 的列。实际上,这是一个 Java 到 SQL 的转换,此转换过程将以 Java 为中心的实体无缝地转换成基于 SQL 的 CRUD 操作。

有时候,已经存在一个 bean 类,其中包含所有需要的关系映射元数据,但是这个类所映射的底层物理表却丢失了。pureQuery 提供了直观的 GUI 方式来根据 bean 类生成所需的 DDL 语句,以创建所需的底层数据库工件(即表和列)。

 




回页首


概览

接下来的小节将介绍 pureQuery 的最常见用法,包括 pureQuery 对象化过程 小节中介绍的 DDO 过程、QDO 过程和 ORM 过程 。最后,对 pureQuery 与 Eclipse Java Editor 的紧密集成和它所提供的附加特性作一个概述。这包括设计与运行时之间的联合,从而测试 SQL 语句的运行。

在尝试下面的场景之前,应确保已安装以下软件:

  • DB2 for Linux®, UNIX®, and Windows® Version 8.0 或更高版本,以及附带的 SAMPLE 数据库
  • Developer Workbench Version 9.5
  • pureQuery plug-in Version 1.0

在本文 参考资料 小节中可以找到用于下载 DB2 和 IBM Viper Developer V9.5 Open Beta (含 Developer Workbench 和 pureQuery 插件)的链接。

数据库驱动的对象化(DDO)案例场景

在本节中,我们研究一个简单的雇员场景,该场景的目的是以面向对象范例编程式地访问和操纵雇员数据。

下面的步骤将创建一个可感知 pureQuery 的 Java 项目,该项目将 DB2 SAMPLE 数据库中的 Employee 表转换成一个对象模型,后者可在任何 Java 应用程序中以一种自然的、面向对象的方式使用。

使用 pureQuery 开发数据库应用程序的设计模式由以下基本步骤组成:

步骤 1. 在 Eclipse IDE 中创建 Java 项目

在创建 Java 项目时,应确保创建 source 和 bin 文件夹。将项目命名为 “Personnel”。

步骤 2. 为 Personnel Java 项目启用 pureQuery 支持

  1. 右键单击 Personnel Java 项目,在弹出菜单中选择 Add pureQuery Support

    图 1. 为 Eclipse Java 项目启用 pureQuery 支持
    为 Eclipse Java 项目启用 pureQuery 支持

    要查看放大后的图像,请单击 这里

    这时会打开 Add pureQuery Support 向导,通过该向导可以为 Java 项目启用 pureQuery。

  2. 该向导的第一页包括一些常规选项。可以保留默认值。最重要的是,要确保选中 Import required pureQuery JAR files into project 旁边的复选框。这是因为 pureQuery 有它自己特定的设计和运行时 JAR 文件,必须将这些文件包括在 Java 项目中。


    图 2. Add pureQuery Support 向导:pureQuery 常规选项页面
    Add pureQuery Support 向导:pureQuery 常规选项页面


    单击 Next 进入 Add pureQuery Support 向导的下一个页面。

  3. 接下来创建数据库连接。该页面显示所有已发现的数据库连接。从列表中选择一个数据库连接。如果不存在连接,该向导将指导您创建一个新的连接。对于这个例子,选择 SAMPLE 数据库,Employee 表就在这个数据库中。


    图 3. Add pureQuery Support 向导:pureQuery 数据库连接页面
    Add pureQuery Support 向导:pureQuery 数据库连接页面


  4. 单击 Finish 按钮关闭该向导,进入提供 pureQuery 支持的 Personnel Java 项目。

步骤 3. 将关系工件转换为 Java 对象并自动生成 pureQuery 代码

建立数据库连接后,这个 Java 项目就可以感知数据库了。这将导致特定连接上的所有数据库工件都会在 IDE 的 Database Explorer 树型视图中自动显示,如图 4 所示。


图 4. 包含 SAMPLE 数据库中所有工件的 Database explorer
包含 SAMPLE 数据库中所有工件的 Database explorer

要查看放大后的图像,请单击 这里

pureQuery 的威力在于,它能够自动生成将底层关系数据库表工件转换成 Java 对象所需的代码。只需选中所需的数据库工件,然后启动 pureQuery Code Generation 向导,就可以自动生成代码。

下面的步骤将关系工件转换成 Java 对象,并自动生成 pureQuery 代码:

  1. 对于本例,从数据库浏览器树型视图中选择 Employee 表节点,然后在该节点上单击鼠标右键,如图 5 所示。

    图 5. 将 Employee 表转换为 Java 对象:自动生成 pureQuery 代码
    将 Employee 表转换为 Java 对象:自动生成 pureQuery 代码

    要查看放大后的图像,请单击 这里


  2. 从弹出菜单中选择 Generate the pureQuery code 选项。 这时会打开 Generate pureQuery Code 向导,如图 6 所示。


    图 6. pureQuery Code Generation 向导
    pureQuery Code Generation 向导


  3. 指定 Java Bean General 选项。

    图 6 所示,Generate pureQuery Code for a Table 向导的第一页包含一些用于描述一个表示 Employee 表的 bean 类的属性。可以保留其中的默认值。我们来研究其中一些属性:

    • Source folder :该字段指定用于保存生成的 Java 文件的物理位置。可以保留默认值: Personnel/Src
    • Name : 该字段表示生成的 Java Bean 的名称。默认情况下,这个 bean 的名称与之前在 Database Explorer 中选择的、为之生成 pureQuery 代码的数据库表工件(在此即为 Employee)的名称相同。可以更改这个名称,但最后生成的文件中会有一个标注,以表明这个 bean 与相应的数据库表工件之间的映射。

      对于这个例子,将这个名称改为 MyEmployee 。于是,生成的标注为:

      @Table(name="EMPLOYEE", schema="DB2ADMIN")
      

    • Generate annotated-method interface for table : 这将导致生成一个 Interface 文件,该文件包含数据库 Create/Update/Delete/Insert 方法。这些方法实际上为前面 1.0 小节描述的数据库行的对象化提供了便利。当构建项目时,还会生成该接口的一个默认的实现,其中包含所有需要的 SQL 语句。注意,默认的接口名称也是可以更改的。
    • Generate test class for annotated-method interface for table :这将导致生成一个特殊的类,这个类可用于对 bean 接口进行单元测试。这个测试类的名称可以更改。
    • Generate test class for Inline-method style : 这将导致生成一个包含显式的内联 SQL 语句的文件,默认情况下,这些 SQL 语句将被生成为接口实现的方法。通过一个简化的 API,可以以一致的方式使用 SQL 来查询各个数据源。可以对应用程序进行配置,使其静态地运行数据库 SQL,而不会影响编程或用户体验。测试类的名称也可以修改。
    • 注意,无论出现上述哪一种情况,都可以通过选择 Generate JUnit test cases 复选框,请求系统自动生成一组 JUnit 测试实例。
    • Include Connection information and user name :该选项可以将连接字符串和用户名包括在所有生成的测试类中。
  4. 指定如何定义生成的 bean 变量。

    在该向导的第二个页面(如图 7 所示),可以指定生成 public 还是 protected 字段,是否包含 public 访问方法。



    图 7. 定义 bean 字段
    定义 bean 字段


    还可以更改 bean 变量的名称(默认情况下,bean 变量的名称与 Employee 表列的名称相同)。注意,对于变量名与其所映射的列的名称不相同的每个变量,会生成一个专门的标注。标注的格式如下所示:

    @Column(name="name of the table column")
    

    该标注被放在变量声明之前。例如,在这个例子中,将 Bean 字段名称 firstnme 改为 firstnme_new 。于是,Java 文件中生成的、放在声明之前的标注为:
    @Column(name="FIRSTNME") protected string firstnme_new
    

    对于其他所有不同于表列名的变量名也是如此(见 图 9 )。

    对于这个例子,确保选中 Protected Fields with Public accessor methods 。还可以将变量类型改为与其映射的列数据的类型不相同的类型。

  5. 指定所生成的 SQL 语句的风格。

    在该向导的最后一个页面中(见图 8),可以选择生成不同风格的 SQL 语句。对于这个例子,选择 Generate all SQL statements



    图 8. 生成不同风格的 SQL 语句
    生成不同风格的 SQL 语句


  6. 单击 Finish 生成 pureQuery 代码。

单击 Finish 按钮时,该向导除了生成以下 5 个完成 pureQuery 对象化过程 小节中描述的 DDO 过程的主要文件以外,还生成一个实用包。我们来看看生成的工件有哪些:

  • 构成对象层次的文件
    1. MyEmployee.java (见图 9):这是主 bean 类。这个类包含一些变量及其相应的访问方法,这些变量与 Employee 表中的列存在 1 对 1 的映射。

      图 9. 表示 Employee 表的 Java bean 类
      表示 Employee 表的 Java bean 类

      要查看放大后的图像,请单击 这里

    2. MyEmployeeData.java (见图 10):这是抽象数据库访问层的文件,用于数据查询和操纵。它包含一些抽象方法,实现这些方法的惟一目的是在底层表上执行 CRUD 操作。

      图 10. 包含用于 CRUD 操作的接口的 MyEmployeeData.java
      包含用于 CRUD 操作的接口的 MyEmployeeData.java

      要查看放大后的图像,请单击 这里

    3. MyEmployeeDataImpl.java (见图 11):这是前面提到的 MyEmployeeData 接口的默认实现。该实现包含封装所有用于数据访问和操纵的 SQL 语句的方法。

      请注意: 该文件当且仅当项目构建时生成。可以通过从主 Eclipse IDE 菜单中设置 Build Automaticallyoption of the Project 来构建项目,或者由开发人员手动构建项目。



      图 11. 包含接口方法实现的类
      包含接口方法实现的类

      要查看放大后的图像,请单击 这里

    4. MyEmployeeDataTest.java (见图 12):这是由 pureQuery 系统生成的默认类,这个类可用于单元测试。它包含一个 static main 函数,该函数实际上用于测试实现类(即 MyEmployeeDataTest.java)中所有方法的运行。

      图 12. 生成的类可用于单元测试
      生成的类可用于单元测试

      要查看放大后的图像,请单击 这里

    5. MyEmployeeInLineSample.java (见图 13):当且仅当 Generate Sample Class With Inline method call syntax 选项被选中时,才会生成该文件。实际上,这将通过 pureQuery 的运行时 API 使用内联风格的方法调用测试所有生成的 SQL 语句。

      图 13. 自动生成的测试类可以内联运行生成的 SQL 语句
      自动生成的测试类可以内联运行生成的 SQL 语句

      要查看放大后的图像,请单击 这里

  • 实用包

    除了前一小节提到的那些文件以外,pureQuery 系统还生成一个实用包,其中包含一个名为 SampleUtil.java 的文件(见图 14)。该文件包含很多常见的静态实用函数(例如获取连接、打印等),例如,生成的测试类(即 MyEmployeeDataTest.java)可以使用这些函数打印输出结果,以及创建底层数据库连接。



    图 14. 自动生成的示例类包含很多常见的静态实用函数
    自动生成的示例类包含很多常见的静态实用函数

    要查看放大后的图像,请单击 这里

 




回页首


查询驱动的对象化(QDO)案例场景

给定一个或多个 SQL 语句,通过 pureQuery 可以直观地为关系数据访问层自动创建对象层次。下面的逐步讲解将演示 pureQuery 仅根据给定的 SQL 语句创建对象模型的功能。

  1. 打开 DDO 案例场景 小节中创建的 Eclipse Java Personnel 项目。
  2. 在项目中添加一个新的 Java 文件,并在其 Main 方法中包括以下 SQL 语句:
    SELECT BIRTHDATE, BONUS, COMM, EDLEVEL, EMPNO, FIRSTNME, HIREDATE, JOB, LASTNAME, 
    MIDINIT, PHONENO, SALARY, SEX, WORKDEPT from EMPLOYEE
    

  3. 在 SQL 语句中的任何位置单击鼠标右键,从弹出的上下文菜单中选择 pureQuery Assist -> Generate SQL Bean 选项。这将打开 Create Bean for a SQL Result Set 向导。

    图 15. 根据 SQL 语句创建 bean
    根据 SQL 语句创建 bean

    要查看放大后的图像,请单击 这里

  4. 在第一个页面中,为生成的 Bean 类指定一个名称。对于这个例子,输入 “MySQLEmployee” 并单击 Next 按钮。

    图 16. 指定根据 SQL 语句生成的 Bean 类的名称
    指定根据 SQL 语句生成的 Bean 类的名称


  5. 在该向导的第二个页面中,可以指定如何定义 bean 字段。对于这个例子,可以保留默认值。还可以将变量类型改为与它所映射的列的数据类型不同的类型(见图 17)。

    图 17. 指定 bean 字段
    指定 bean 字段


  6. 单击 Finish 按钮。这将生成 bean 文件 MySQLEmployee.Java。

为了创建接口和默认实现类,可以像下一小节描述的那样使用 pureQuery 的 ORM 过程。

 




回页首


对象-关系映射(ORM)案例场景

给定一个 Java bean 类,通过 pureQuery 可以直观地将该类的成员映射为底层数据库表中的任何给定的关系实体。

注意需要根据表模式和相关规则 来进行设计时映射。例如,虽然在运行时可以将 double 类型的变量映射到 XML 类型的表列,但是这可能导致不可预测的运行时结果,并因此而产生错误。下面的例子演示了这种映射。

  1. 打开 DDO 例子 中创建的 Eclipse Java Personnel 项目。
  2. 为了演示 ORM 特性,可以使用一个已有的 bean,也可以使用表示数据库中某个表的 Java 用户定义类。在这个例子中,我们使用一个已有的 bean,所以删除 MyEmployee.Java 之外的所有生成的 Java 文件。

    图 18. 将一个 bean 映射到一个关系表
    将一个 bean 映射到一个关系表

    要查看放大后的图像,请单击 这里

  3. 在编辑器中打开 MyEmployee.Java 类,在类名的上面添加以下标注:
    @Table (name = "EMPLOYEE", Schema = "DB2ADMIN")

    该标注执行类名与底层数据库表之间的实际映射。

  4. 在要映射的每个字段/变量的上面添加以下注释。在这个例子中,我们只映射 BIRTHDAY 和 FIRSTNME 字段,因此在 BIRTHDAY 变量名之上添加
    @Column (name = "BIRTHDAY")

    ,在 FIRSTNME 变量名之上添加
    @Column (name = "FIRSTNME")

    (见图 19)。

    图 19. 标注创建主机变量与表列之间的映射
    标注创建主机变量与表列之间的映射

    要查看放大后的图像,请单击 这里

  5. 在编辑器中,在 MyEmployee 类中的任何地方单击鼠标右键,从弹出的上下文菜单中选择 pureQuery Assist -> Generate pureQuery CODE 选项。这将打开 Generate pureQuery Code for a Table 向导,该向导最终将生成相关的 pureQuery 代码(包括接口文件、测试类、实现代码等)。

注意,由于 Java bean 类已经存在,该向导的 Bean Field 页面被省略,没有提供给用户。

 




回页首


pureQuery 的内容辅助以及与 Java 编辑器的紧密集成

pureQuery 提供的最强大的一个特性是 SQL 与 Java 在同一个编辑器中的无缝集成。这种紧密集成为 Java 和 SQL 提供了一组相同的设计时特性,包括代码辅助、语法验证和着色,以及 SQL 语句的语义验证。

代码辅助提供:

 

  • SQL 语句完成(SQL statement completion ) 当输入 SELECT 之类的 SQL 关键字时,或者在期望一个操作符时,就会出现一个上下文窗口,其中显示用于完成语句的可能的方式。

    图 20. 语句完成
    语句完成

    要查看放大后的图像,请单击 这里

  • 内容辅助(Content Assist) 显示一组可能的实体名称,与一个给定的关系工件(例如一个表、模式等)相关,或者当需要在一个语句中指定参数时显示一组 Java 主机变量(见图 21 和 22)。

    图 21. 内容辅助
    内容辅助

    要查看放大后的图像,请单击 这里



    图 22. 主机变量内容辅助
    主机变量内容辅助

    要查看放大后的图像,请单击 这里

  • 快速修复(Quick Fix) 提供一种内联动态语法验证机制,通过这种机制可以检测并快速修复拼写错误之类的错误。

    图 23. 快速修复:Select 关键字被误拼为 Selct
    快速修复:Select 关键字被误拼为 Selct

    要查看放大后的图像,请单击 这里

  • 自动发现数据库定义 (见图 24 和 25),通过该特性,只需点击选择任何一个 bean 成员名称,就可以快速跳转到数据库浏览器中的数据库定义(例如,点击映射一个表名的类名就会跳转到数据库浏览器中的表节点,点击映射列名的变量名就会跳转 到数据库浏览器中的列节点,依此类推)。

    图 24. 点击选择 bean 类中的成员名称
    击选择 bean 类中的成员名称

    要查看放大后的图像,请单击 这里



    图 25. 点击选择将跳转到数据库浏览器
    点击选择将跳转到数据库浏览器

    要查看放大后的图像,请单击 这里

 




回页首


设计与运行时联合

pureQuery 的设计时功能当中最优越的一个特性是它能在编辑器中动态地运行任何给定的 SQL 语句。这个独特的特性使得在设计时能够动态执行 SQL 语句并允许回滚。

在 Java 编辑器中,要查看这个特性,只需在任何生成的 SQL 语句上单击鼠标右键。从上下文菜单中选择 pureQuery Assist -> Run SQL (见图 26)。 这将执行该 SQL 语句,并在 Eclipse IDE 的 Data View 中显示结果集(见图 27)。


图 26. 在设计时通过点击选择运行 SQL
在设计时通过点击选择运行 SQL

要查看放大后的图像,请单击 这里


图 27. Data View 中显示在设计时执行 SQL 的结果
Data View 中显示在设计时执行 SQL 的结果

要查看放大后的图像,请单击 这里

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics