使用全新的 IBM pureQuery 工具提高 Java 数据库开发生产力,第 1 部分: pureQuery 工具概述

10 种独特场景,10 倍生产力提升

如果您是一名 Java™ 开发人员或希望成为其中的一员,那么本文正好适合您。本文介绍了 IBM® pureQuery 工具如何前所未有地提高 Java 编程和 SQL 效率,使用比 JDBC 少得多的代码生成简单的数据访问层,使用静态 SQL 改善应用程序的性能,并使用 SQL 访问数据库和内存中(in-memory)集合。

Sonali Surange (ssurange@us.ibm.com), pureQuery Tools 主管, EMC

Sonali Surange 在位于加州圣何塞市的 IBM 硅谷实验室 IBM Data Server Tooling 开发团队领导 IBM pureQuery 工具的开发。在加入 IBM pureQuery 之前,Sonali 领导开发了 IBM Data Servers 的 Visual Studio .Net 工具,并针对 .NET 为 IBM 开发 SOA。在此之前,Sonali 领导了 Informix SOA 解决方案的开发,并且是 Object Relational 映射工具的首席开发人员。



2007 年 12 月 20 日

简介

在本系列文章中,了解 Java 应用程序开发人员在使用 Java 语言编程时如何减少 SQL 编码错误,以及如何能够在不编写代码的情况下构建高性能的示例 Java 应用程序和测试。使用 pureQuery 工具在 Java 应用程序内部定制 SQL,可以减轻 SQL 编程工作,这些工具包括 SQL 内容帮助、SQL 验证、SQL 执行、SQL 开放定义,等等。

本系列使您能够获得 pureQuery 工具的快速入门:

  • 使用 pureQuery 生产力工具快速构建数据库应用程序,并使用该工具在 Java 透视图内定制 SQL。
  • 使用单独的 API 处理数据库和内存数据源,从而前所未有地简化数据库应用程序开发工作
  • 无需额外工作,仅使用静态 SQL 便可构建应用程序
  • 在应用程序中使用 pureQuery 设计模式

pureQuery 工具和技术可从 IBM Viper Developer V9.5 获得。


文章目标

探究 pureQuery 工具的关键特性,即 SQL 编辑器与 Java 技术的集成以及 pureQuery 代码生成功能。创建并定制示例 pureQuery 应用程序,并使用 pureQuery 工具重用和迁移现有资源,例如 SQL 或 beans,从而实现不用编写代码即可创建 pureQuery 应用程序。


IBM pureQuery

pureQuery 是一款全新的高性能 Java 数据访问平台,旨在简化数据访问应用程序的开发和管理任务。

使用 pureQuery 可以使应用程序生命周期的所有阶段受益,包括开发、部署、管理和治理。

pureQuery 通过其工具、API 和运行时环境提供对数据库数据和内存中 Java 对象的访问。


为什么要使用 pureQuery 工具

现有解决方案的缺陷

如今,诸如 Hibernate、DALI 等产品允许您构建应用程序来访问数据库。然而,这些产品都依赖专有的查询语言,例如 HQL/ JPA 的 JQL 等等,因此您不得不重新学习另外一种查询语言。

这些解决方案对开发人员和 DBA 隐藏了实际的原生 SQL,因为这些查询在运行时被转换为原生查询语言。另外一个固有问题是,开发人员无法清楚掌握生成的 SQL 的效率,因此难于进行问题诊断。使用这种产品构建的应用程序严重依赖供应商查询语言。此外,很多时候,专有查询语言都不足以处理更加复杂的场景和查询。

目前,市场上所有基于 Eclipse 的产品都提供了与 Java 编辑器的有限集成(或零集成),帮助在 Java 应用程序内部构造标准 SQL。诸如 Hibernate、DALI 等工具为应用程序开发提供了 Java 编辑器和其专有语言的简单集成。这些工具的一个缺陷就是,只有使用专有查询语言时才能使用这种集成。

pureQuery 提供的解决方案

pureQuery 解决了这些问题,它允许您使用原生数据库查询语言 —— 标准 SQL 构建高性能的简单数据库访问层和应用程序。您不仅可以使用 SQL 访问数据库,还可以使用它访问内存中的集合。pureQuery 使开发人员能够在应用程序中充分控制 SQL。Java 技术与 SQL 的完美集成剔除了在 Java 应用程序内部开发 SQL 的所有繁重工作。

pureQuery 工具使用针对 createretrieveupdatedelete 语句的建议能够自动生成数据访问层。因此,开发人员能够专注于添加业务逻辑并使用高度灵活的 pureQuery 工具定制自动生成的代码。

本文对 pureQuery 工具的功能进行了概述,并介绍如何使用该工具提高生产力,从而降低应用程序开发和维护方面的成本。


pureQuery 工具如何提供帮助?

IBM pureQuery 提供了一些独特的技术和工具(正在申请专利),帮助在 Java 应用程序内部开发 SQL。从此,在使用 Java 语言编程时,您将获得和以前相同或者更好的 SQL 生产力特性。

pureQuery 增强功能可通过 Eclipse 中的标准 Java 编辑器获得,因此无需使用新的编辑器或学习新工具。


pureQuery 能力

IBM pureQuery 工具提供了以下能力:

  • 在数据和 Java 技术之间建立联系,可以在 Eclipse 环境中无缝工作
  • 使用 Java 编辑器内集成的复杂 SQL 编辑器在 Java 应用程序内部快速开发或定制 SQL
  • 不需要编写代码即可快速构建示例 Java 应用程序访问 IBM 数据库
  • 为结果代码自动生成测试应用程序和 JUnits
  • 实现灵活的应用程序开发,使用高度集成、丰富和易于使用的工具从数据库、SQL 或 Java bean 中构建 pureQuery 应用程序
  • 快速构建 pureQuery 应用程序以处理表、视图、别名或过程
  • 轻松使用 pureQuery API 构建应用程序,并且生成的代码远远要少于 JDBC
  • 构建应用程序以使用单个 API 查询内存中的集合和数据库
  • 使用静态 SQL 轻松构建 DB2 应用程序,显著提升性能
  • 使用 XML JPA 格式将所有 SQL 保存在 Java 文件外的统一位置
  • 在所有 IBM 数据库中构建 pureQuery 应用程序

本系列将通过各种示例深入探究以上每项能力提供的庞大功能集。


平台支持

IBM 数据库 —— IBM DB2® for Linux®, UNIX® and Windows®、zSeries® 和 iSeries®,以及 IBM Informix® Dynamic Server


Eclipse 环境

  • Developer Workbench 9.5 公测版
  • 对 shell 的未来支持包括 IBM Ration® Application Developer 和 Rational Software Architect

数据库浏览器集成 – 在数据和 Java 技术之间建立联系

通常,如果开发人员使用 Java 语言编写数据库应用程序,则无法访问在数据透视图的数据库浏览器视图中定义的各种连接。开发人员不得不在数据库工具和 Java 编程工具之间来回切换,方能编写数据库查询和相关代码。

pureQuery 工具提供了数据库工具和 Java 工具之间的无缝集成。

亮点 – 为 Java 项目添加 pureQuery 支持

  • 在 Java 透视图内,您可以从数据透视图中打开数据库浏览器视图。
图 1. 在 Java 透视图中打开数据库浏览器
在 Java 透视图中打开数据库浏览器
  • 现在,您可以使用 pureQuery 工具将一个 Java 项目与数据库浏览器中的连接关联起来。为此,向 Java 项目添加 pureQuery 支持。
    • 要添加 pureQuery 支持,右键单击该 Java 项目,选择 Add pureQuery support
    • 从数据库浏览器中选择一个现有连接或创建一个新连接。
图 2. 添加 pureQuery 支持
添加 pureQuery 支持

亮点 – 数据库浏览器连接定制建议

使用 pureQuery 对数据库浏览器连接进行定制以提高生产力:

  • 持久保存数据库密码并选择在启动时自动重新连接。pureQuery 工具使用以下设置提供易用性:
    1. 转到 Windows > Preferences,选择 Data
    2. 选择 Password information > Persistence scope,确保选中 “Automatically reconnect connections on startup”。Java 的 pureQuery SQL 集成现在使用的连接可在必要时自动重新连接。
  • 可以在离线、断开连接的情况下使用数据库:开发人员往往需要在离线模式下设计数据库,特别是,如果远程活动服务器在应用程序设计阶段不可用或速度较慢,这种需求更加强烈。这种特性对于具有大量对象的远程 zSeries 和 iSeries 服务器非常有用:
    1. 右键单击数据库浏览器连接,保持连接离线设置。pureQuery SQL 和 Java 技术的集成现在可在断开连接的模式下工作。
  • 对连接使用模式或对象过滤器:pureQuery 工具将在使用内容帮助列表、验证和其他 SQL 集成特性时使用这些设置。设置这些值可允许您处理所需的模式或对象,并且在处理包含大量对象的 zSeries 和 iSeries 服务器时还能提升性能。
  • 随意设置当前模式。默认情况下,该值与连接的用户 ID 相同。pureQuery 工具将使用这种模式限制所有不合格的 SQL。
    1. 当添加 pureQuery 支持时,添加当前模式值(或者,在项目属性下修改 pureQuery 设置以设定当前模式值)。

在 Java 编辑器内部集成 SQL 编辑器 – 在 Java 语言内编写 SQL

pureQuery 针对 SQL 与 Java 技术的集成提供的独特特性(正在申请专利)使开发人员在开发 Java 应用程序内部的 SQL 时获得巨大的性能提升。您可以使用 pureQuery 工具创建新的 SQL 或定制现有 SQL。

集成亮点包括:

  • 能够对 Java 编辑器内部的 SQL 使用 SQL 语义和语法验证
  • 能够对 Java 编辑器内部的 SQL 使用 SQL 语义和语法内容帮助
  • 能够在 Java 程序内部运行 SQL
  • 提供 SQL 语法突出显示功能
  • 在数据库浏览器中为 Java 程序内部的 SQL 打开定义
  • 在 Java 程序中提供 SQL 模板支持
  • 在 Java 程序中提供可视说明
  • 在程序中使用 pureQuery 的编辑器集成

能够对 Java 编辑器中的 SQL 使用 SQL 语义和语法验证

向 Java 编辑器输入 SQL 时将报告 SQL 错误:

  • 使用 Java 语言的错误显示方式显示 Java 程序中嵌入的查询的错误:
图 3. Java 程序内部的 SQL 错误
Java 程序内部的 SQL 错误
  • 在问题面板中查看 SQL 错误。
  • 对具有无效 SQL 的 Java 代码行的编号使用错误标记。
  • 对 Java 程序内无效的 SQL 使用波浪线标记错误(或者 eclipse 默认的错误标记)。
  • 将鼠标悬停在错误上时显示详细信息。
  • 可以检测有关 SQL 关键字(语法)和模式、表、列或其他数据库名称(语义)错误。
  • 检测一条 SQL 语句中的多个错误。
图 4. Java 程序使用问题面板显示 SQL 错误
Java 程序使用问题面板显示 SQL 错误

能够对 Java 编辑器内部的 SQL 使用 SQL 语义和语法内容帮助

按下 Ctrl 键和 space 键(或者默认的内容帮助键),获得 SQL 内容帮助,从而不需要在 Java 编辑器中手工输入 SQL:

  • 搜索和选择 SQL 关键字。
  • 从模式列表中搜索和选择,这些模式的基础是与项目相关的数据库。任何与连接相关的模式过滤器都将影响显示的列表项。
  • 从列出的表和列名中搜索和选择。
  • 使用内容帮助搜索列以获得表别名。
  • 内容帮助建议显示数据库类型和主键。
  • 对 SQL 和与数据库模式相关的建议使用易于区分的图标。
图 5. Java 程序内部的 SQL 内容帮助
Java 程序内部的 SQL 内容帮助
  • SQL 内容帮助集成了 pureQuery 语法的 bean 属性

本文在 “构建 pureQuery 应用程序 – 快速应用程序开发” 小节讨论了 pureQuery bean 语法。

图 6. 针对 SQL pureQuery 语法的 Java bean 内容帮助
针对 SQL pureQuery 语法的 Java bean 内容帮助

能够在 Java 程序内部运行 SQL

无需编写任何测试应用程序,在设计时在 Java 程序内部使用参数运行 SQL:

  1. 右键单击 Java 程序内的 SQL,提供动态参数或 pureQuery bean 语法。pureQuery 工具为 IDE 会话记忆 bean 变量参数值。
  • 在数据输出面板中查看结果。
  • 在数据输出面板中查看输入和输出的消息和参数值。
图 7. 在 Java 程序内运行 SQL
在 Java 程序内运行 SQL

提供 SQL 语法突出显示功能

通过突出显示功能区分 Java 程序内的 SQL,从而可以轻松地查看复杂程序:

  1. 在 Java 程序内部突出显示 SQL。
  2. 使用 pureQuery 定制功能选择您偏爱的显示选项。默认设置为使用浅黄色方框将 SQL 包围起来:
图 8. 在 Java 程序内部突出显示 SQL —— 使用浅黄色方框包围 SQL
在 Java 程序内部突出显示 SQL

在数据库浏览器中为 Java 程序内部的 SQL 打开定义

类似 Java 语言的公开声明,可以在 Java 程序内部的 SQL 中查看表和列的定义:

  • 当定位到 SQL 时,可在数据库浏览器中查看 SQL 表示的一个或多个表。
  • 当定位到列时,在数据库浏览器中查看某条选择语句对应的列。
图 9. 在数据库浏览器中显示
在数据库浏览器中显示

在 Java 程序中提供 SQL 模板支持

重用 SQL 编辑器中喜爱的模板,在 Java 程序内部生成常见查询:

  • 在 Java 中使用 SQL 内容帮助时,查看并选择喜爱的 SQL 模板。
  • 使用 SQL 编辑器模板的编辑功能定制 SQL 模板。
图 10. Java 内的 SQL 模板
Java 内的 SQL 模板

在 Java 程序中提供可视说明

在 Java 程序内查看有关 SQL 的解释说明。

在程序中使用 pureQuery 的编辑器集成

pureQuery 的 SQL 集成可用于 Eclipse 中的标准 Java 编辑器。

默认情况下,对 pureQuery API 内使用的字符串启用了 SQL 编辑功能。

此外,可以对所选择的任何字符串以及在包含 SQL 的应用程序中使用该功能。

在涉及到 SQL 的现有或新 Java 项目中启用 pureQuery 编辑器支持

要运行 SQL、在数据库浏览器中显示,并对项目中的任何字符串生成 SQL bean 功能(请参考 “构建 pureQuery 应用程序 – 快速应用程序开发” 一节中有关 SQL bean 功能的内容),请执行以下简单步骤:

  1. 向 Java 项目添加 pureQuery 支持。这将把一个连接和 Java 项目关联起来。
  2. 添加完 pureQuery 支持后,确保重新打开了之前打开的 Java 文件,查看启用的 pureQuery 右键单击菜单。

要对应用程序中选择的任何字符串利用 SQL 内容帮助、SQL 验证和 SQL 模板功能,还需要执行以下步骤:

  1. 使用 @Sql 命令对进行 SQL 编辑的字符串的声明添加注释。
  2. 使用快捷键组合 Ctrl+Shift+O(或默认的键)导入 @Sql 的定义。将从 pureQuery 运行时导入定义:

    import com.ibm.pdq.annotation.Sql; @Sql String mySQL = "select * from ssurange.department"

现在,对字符串 mySQL 执行的所有任务将享受 pureQuery 编辑器特性带来的益处。


构建 pureQuery 应用程序 – 快速应用程序开发

使用 pureQuery 工具,您不需要编写任何代码就可构建 pureQuery 启动应用程序。您还可以在生成的应用程序中定制 SQL,或者向这些应用程序定制或添加新的 pureQuery API,从而满足应用程序开发需求。

何时使用何种功能 – pureQuery 工具特性

  1. 拥有数据库并希望生成数据访问代码?
    对数据库使用 pureQuery bottom up 场景
  2. 拥有 SQL 并希望重新使用它以及生成数据访问代码?
    对 SQL 使用 pureQuery bottom up 场景
  3. 拥有 database 和 Java bean,并且希望将 bean 和 bean 字段映射到数据库表和列以生成数据访问代码?

    使用 pureQuery meet-in-the-middle 场景
  4. 拥有数据库和经过映射的 Java bean 并希望生成数据访问代码?
    使用 pureQuery bottom up from bean 场景
  5. 拥有 bean 并希望生成数据库模式?
    使用 top down 场景
  6. 希望将所有 bean 注释和应用程序 SQL 放入一个 XML 文件?
    使用 pureQuery XML 场景
  7. 需要数据访问代码和更好的性能,但是不希望进行较多的开发?
    使用 pureQuery 静态 SQL 场景
  8. 需要处理数据库和内存中的数据,但不希望学习新的 API?
    使用 pureQuery 查询内存中的集合 支持。

对数据库使用 pureQuery bottom up 场景

应用程序开发人员通常通过以下步骤开始开发应用程序:

  1. 从一个示例入手并根据需要进行定制
  2. 使用工具生成存根并手工填入数据访问代码
  3. 手工编码整个应用程序

pureQuery 工具为以上所有场景提供了性能改善。

pureQuery 代码生成

使用 pureQuery 工具,您可以为表、视图和过程生成 pureQuery 数据访问代码。

pureQuery 工具为 createretrieveupdatedelete SQL 语句提供了建议,演示了使用 pureQuery 进行开发提供的便捷性。

您可以生成基于内联方法或注释方法风格的 pureQuery 应用程序:

  • 选择内联方法风格,使用应用程序内部的 SQL 创建应用程序,获得与 JDBC 类似的体验。
  • 使用注释方法风格使 SQL 与接口保持关联并通过接口将 SQL 从应用程序中分离出来。

通过添加新的 pureQuery 方法、接口和 SQL,或者修改现有方法、接口和 SQL,您可以轻松定制应用程序。

此外,您可以自动生成使用这些生成的 API 和 SQL 的示例程序或 JUnit 测试用例,并运行它们,无需编写任何代码。

对数据库使用 pureQuery bottom up 场景 – 表,视图

pureQuery 能够生成 pureQuery 代码访问和处理来自表、列和昵称的数据。pureQuery API 使用 bean 保存选择语句的结果。使用 pureQuery API,您可以通过 bean 实例为 selectinsertupdatedelete 语句提供输入参数值。这一特性大大简化了数据访问代码。pureQuery 工具为所有 bean、SQL 语句和使用它们的 pureQuery API 生成代码。

  • 右键单击数据库浏览器中的某个表,并选择 Generate pureQuery code
图 11. 从表中生成 pureQuery 代码
从表中生成 pureQuery 代码

bean 生成功能的亮点

您可以自动生成表示表或视图的 bean。如果需要遵循 Java 编码标准,执行以下操作:

  1. 根据需要修改 Java bean 名称、修改 bean 字段名,并自动生成到数据库的映射
  2. 使用公共的 getter、setter 方法生成公共字段或受保护字段
  3. 允许使用超类
  4. 如果需要定制 Java 类型映射,在向导中修改 bean 字段的默认类型映射即可,如图 12 所示。将在应用程序执行阶段应用标准的 JDBC 类型转换规则。
图 12. Bean 生成选项
图 12. Bean 生成选项

pureQuery 数据访问代码生成功能的亮点

pureQuery 语法以及表示 bean 字段的变量显著减少了代码量和 selectupdateinsertdelete 语句的复杂性,同时使用一个 bean 参数可表示多个参数。

pureQuery 提供了良好的易用性,它的查询 API 返回持有结果的 bean 迭代器,避免手动处理结果集来获得感兴趣的数据。

  • 您可以使用 pureQuery 的 queryFirst API 轻松获得某一行,而无需返回所有行。
  • 为使用 pureQuery API,生成的代码提供了针对 selectinsertupdatedelete 语句的建议。生成的 SQL 使用主键在适当的位置构造 where 子句。您也可以通过自动生成的键为表生成代码。
  • 根据应用程序需求,您可以生成内联方法风格或注释方法风格。

如果需要遵循 SQL 编码标准,您可以执行如下步骤:

  • 使用首选参数来应用 * 或选择的所有列
  • 在使用注释方法风格时,使用首选参数只生成少数推荐的方法建议

此外,您可以将新方法合并到现有的注释方法风格的接口中。

图 13. 代码生成首选参数
代码生成首选参数
清单 1. 生成的代码 —— Bean(参考代码中的注释进行代码分析)
/**************************************************************
 *A bean that represents the PROJECT table.
 *
 **************************************************************/
import com.ibm.pdq.annotation.Table;
import com.ibm.pdq.annotation.Id;
import com.ibm.pdq.annotation.Column;
import java.math.BigDecimal;
import java.sql.Date;

//  Auto generated mapping for bean to table name
@Table(name="PROJECT", schema="SSURANGE")
public class MyProject  {

// Class variables
@Id
public String projno;
// Auto generated mapping for field to column name
@Column(name="PROJNAME") public String myProjname;
public String deptno;
public String respemp;
public BigDecimal prstaff;
public Date prstdate;
public Date prendate;
public String majproj;
 

}
清单 2. 生成的代码 —— 示例内联方法风格
// create and use standard jdbc connection for conn
Data db = DataFactory.getData (conn);
db.setAutoCommit(false);
// execute the select statement and return results in an iterator of MyProject bean
// MyProject bean represents the result
Iterator<MyProject> getMyProjects = db.queryIterator ("select DEPTNO, MAJPROJ,
PROJNAME, PRENDATE, PROJNO, PRSTAFF, PRSTDATE, RESPEMP from SSURANGE.PROJECT",
MyProject.class);
// get the bean representing the first row to use to test update, delete and insert.
// The changes are rolled back if there is any error
MyProject bean = null;
if (getMyProjects.hasNext()) {
bean = getMyProjects.next();
} else {
SampleUtil.printLn("Result set is empty.")
db.rollback();
return;
}

// Suggestion for query using primary key and bean parameter. This API returns one
// bean.
// Notice that the parameter information is provided via a bean instance.
// pureQuery also supports standard dynamic parameters  ( ie ?)
MyProject getMyProject = db.queryFirst ("select DEPTNO, MAJPROJ, PROJNAME, PRENDATE,
PROJNO, PRSTAFF, PRSTDATE, RESPEMP from SSURANGE.PROJECT where PROJNO = :projno",
MyProject.class, bean);
SampleUtil.printClass(getMyProject);

// Suggestion for query update statement. Provide all values to set in bean fields!
db.update("update SSURANGE.PROJECT set DEPTNO = :deptno, MAJPROJ = :majproj,
PROJNAME = :myProjname, PRENDATE = :prendate, PROJNO = :projno, PRSTAFF = :prstaff,
PRSTDATE = :prstdate, RESPEMP = :respemp where PROJNO = :projno", bean);
getMyProjects = db.queryIterator ("select * from SSURANGE.PROJECT", MyProject.class);
SampleUtil.printLn("Results for update (bean)");
SampleUtil.printAll(getMyProjects);

// Suggestion for query delete statement. Provide all values to set in bean fields!
db.update("delete from SSURANGE.PROJECT where PROJNO = :projno", bean);
getMyProjects = db.queryIterator ("select * from SSURANGE.PROJECT", MyProject.class);
SampleUtil.printLn("Results for - delete (bean)");
SampleUtil.printAll(getMyProjects);

// Suggestion for query insert statement. Provide all values to set in bean fields!

db.update("insert into SSURANGE.PROJECT (DEPTNO, MAJPROJ, PROJNAME, PRENDATE,
PROJNO, PRSTAFF, PRSTDATE, RESPEMP) values( :deptno, :majproj, :myProjname,
:prendate, :projno, :prstaff, :prstdate, :respemp)", bean);
getMyProjects = db.queryIterator ("select * from SSURANGE.PROJECT", MyProject.class);
SampleUtil.printLn("Results for - insert (bean)");
SampleUtil.printAll(getMyProjects);

对数据库使用 pureQuery bottom up 场景 - 过程

pureQuery 工具能够生成 pureQuery 代码来调用过程。pureQuery API 使用 bean 表示参数和保存结果集。pureQuery 工具为所有 bean、调用语句和 pureQuery API 生成代码,从而执行调用语句。

要生成过程调用语句的代码,在数据库浏览器中右键单击某个过程,选择 Generate pureQuery Code。然后按照向导步骤执行。

如果存在参数的话(input、output 或 in out),pureQuery 工具将生成 bean 保存参数值。pureQuery API 使用这个 bean 接受 input 参数或返回 input 和 in out 参数的值。

您可以为返回的结果集选择性生成 bean。pureQuery 过程代码生成向导提供了过程运行选项,以发现和建议结果 bean 的形式。您可以使用公共的 getter 和 setter 对 bean 进行定制以包含超类、公共或受保护字段,或修改默认的 Java 类型映射。

注:未来版本将允许您无需运行过程即可定义结果集的形式。

图 14. 生成结果集 bean
生成结果集 bean

pureQuery 数据访问代码生成功能的亮点

请参考 清单 3(pureQuery 返回结果集 bean)中的示例 pureQuery API,它返回调用语句的结果并保存在结果 bean 中。

请参考 清单 6(pureQuery 返回原始 JDBC 结果集)中的示例 pureQuery API,它以原始结果 JDBC 结果集的形式返回结果。注意,如果您不打算运行过程来确定结果集 bean 形式,则可以使用原始 JDBC 结果集。

可以生成内联方法或注释方法风格的程序。

内联方法风格示例:

清单 3. pureQuery 返回结果集 bean
// Get jdbc connection
Data db = DataFactory.getData (conn);

// Initialize parameter bean
Procedure1Param parms = new Procedure1Param();
// set parameter values from arguments to the program.
setParms(parms, args);

// Call the procedure using pureQuery API
// Note that all parameters are represented in the call statement
// Note that parameter bean is passed in as a parameter
StoredProcedureResult spResult =
db.call("Call SSURANGE.PROCEDURE1( :param1, :param2 )", parms );

// Retrieve first result set into the corresponding result bean
Iterator<ResultBean1> resultSet1 = spResult.getIterator(ResultBean.class);

// Print results
SampleUtil.printAll(resultSet1);

// Retrieve second result set into the corresponding result bean
Iterator<ResultBean2> resultSet2 = spResult.getIterator(ResultBean.class);

// Print results
SampleUtil.printAll(resultSet2);
清单 4. 自动生成的参数 bean
public class Procedure1Param  {

// Class variables
public String param1;
public String param2;

}
清单 5. 使用自动生成的结果集 bean 保存第一个结果集
public class ResultBean1  {

// Class variables
public String routinename;
public String routineschema;
}

生成类似的 bean 保存第二个结果集:

清单 6. pureQuery 返回原始的 JDBC 结果集
// If you choose not to run the procedure to discover the result set shape used to
// define the result bean, pureQuery APIs allow you to work with the JDBC result set

// Get jdbc connection
Data db = DataFactory.getData (conn);

// Initialize parameter bean
Procedure1Param parms = new Procedure1Param();
setParms(parms, args);

// call the procedure using pureQuery API
StoredProcedureResult spResult =
db.call("Call SSURANGE.PROCEDURE1( :param1, :param2 )", parms );

// Process the result sets
boolean results = spResult.hasResultSets();
while ( results){
ResultSet rs = spResult.hasResultSet();
SampleUtil.dumpResultSet(rs);
Results = spResult.moveToNext();
}

对 SQL 使用 pureQuery bottom up 场景

pureQuery 工具可以轻松重用现有资源(例如 SQL)构建 pureQuery 应用程序。使用这个特性,您可以方便地对现有 JDBC 或其他包含 SQL 的数据库应用程序进行迁移。

pureQuery 工具通过在 Java 编辑器内提供灵活便捷的集成实现了这一点。您可以创建一个 bean 保存 SQL 语句的结果,然后使用简单的 pureQuery API 执行 SQL 并返回结果。

使用 pureQuery 工具,您可以执行下面列出的简单步骤:

  1. 向您的 Java 项目添加 pureQuery 支持
  2. 打开/重新打开包含 SQL 的 Java 文件,右键单击 SQL,从 pureQuery 帮助菜单选择 Generate SQL bean,这将生成一个 bean 保存 SQL 的结果。现在,您可以对自动生成的 pureQuery 应用程序进行定制,以使用结果 bean。
清单 7. 生成的代码 - 示例内联方法风格
// change the generated code to represent your SQL and bean.
Iterator<MyBean> getMyProjects = db.queryIterator ("your new SQL", MyBean.class);
图 15. 从 SQL 生成 bean
从 SQL 生成 bean

pureQuery meet-in-the-middle 场景

重用现有 bean 和数据库模式并将其迁移到 pureQuery

pureQuery 工具可以轻松地重用现有 bean 和数据库模式来构建 pureQuery 应用程序。通过对表、模式和列的 pureQuery 注释使用灵活易用的内容帮助,您可以很容易地将 bean 和字段映射到数据库表和列。

一旦完成映射后,您可通过 “show in database explorer” 特性查看映射后的表或列,以确保映射正确无误。

pureQuery 工具提供了一种简单的方法将现有 bean 映射到数据库模式定义中。通过结合使用 pureQuery 注释、注释中的内容帮助和 Java 快速修复,您无需进行编码即可完成映射。

执行以下简单步骤:

  1. 向您的 Java 项目添加 pureQuery 支持。
  2. 打开 Java bean。
  3. 通过在类中添加 @Table 注释将 bean 映射到表。
  • 注释在 com.ibm.pdq.annotation 包中进行了定义,您可以使用 Ctrl + shift + O 键或默认的键将需要的 import 语句导入到 bean 文件。
  • 对 name 属性使用 Ctrl + space 以获得针对表和模式的内容帮助。类似地,使用 @Column 注释将 bean 字段映射到数据库列。对 name 属性使用 Ctrl + space 获得列内容帮助。
图 16. 模式内容帮助
图 16. 模式内容帮助
图 17. 表内容帮助
表内容帮助
图 18. 列内容帮助
列内容帮助

在数据库浏览器中查看经过映射的 bean

您现在可以在数据库浏览器中打开 bean 或字段表示的表或列的定义:

  1. 将光标放到任何 bean 字段上。
  2. 使用 pureQuery 帮助菜单,选择 Show in Database Explorer。表示 bean 字段的列定义将显示在数据库浏览器中。

    另外,将光标放在 bean 文件中的任何位置并使用这个菜单在数据库浏览器中打开表示这个 bean 的表。
图 19. 在数据库浏览器中显示 bean
图 19. 在数据库浏览器中显示 bean

pureQuery bottom up from bean 场景

使用 pureQuery 工具,您可以重用并迁移映射到数据库的 bean,从而生成 pureQuery 数据访问层。

使用 pureQuery 代码生成操作从经过映射的 bean 中生成 pureQuery 代码。和 bottom up 场景一样,您可以创建所有 pureQuery 风格和示例应用程序或 JUnit 测试用例。

图 20. 从经过映射的 bean 中生成 pureQuery 代码
从经过映射的 bean 中生成 pureQuery 代码

pureQuery top down 场景

重用现有 bean 并生成关系模式

您可以获得 SQL 脚本建议创建数据库对象,用它表示使用 pureQuery 工具的 bean。控制台窗口将显示表示 bean 的 DDL 脚本,您可以在 SQL 编辑器中对其进行修改并运行。

Java 编辑器的内部 SQL 集成可以实现这些操作。

  1. 右键单击 bean 并选择 Generate DDL
  2. 在控制台窗口查看建议的 DDL。

pureQuery XML 场景

XML JPA 规范规定将应用程序信息导出为 XML 格式。您可以在注释方法风格的程序中使用 pureQuery 工具导出 SQL 以及 bean 到数据库的映射信息。这样,您可以在一个 XML 文件中管理这些信息。

您可以对 pureQuery 生成器属性进行设置,使它指向您的 XML 文件。注释方法接口的实现现在可以从 XML 中使用 SQL 和 bean 映射。

这些功能都集成到了 Java 编辑器中。

  1. 右键单击 bean 或接口,并选择 Generate XML
  2. 右键单击 Java 项目,并选择 pureQuery,然后,在生成器部分中添加:
    • xmlFile – yourFile within the eclipse workspace

pureQuery 静态 SQL 场景

轻松提升应用程序性能

静态 SQL 可在运行应用程序时带来性能提升。

pureQuery 使得处理静态 SQL 极其简单。执行阶段将会判断是执行静态运行还是动态运行,并且不会影响应用程序开发体验。因此,开发人员不需要学习新的工具或编程范例,就可以使应用程序从静态 SQL 中获益。

pureQuery 的静态 SQL 集成为现有 SQLJ 解决方案带来了显著的性能提升。

要查看 pureQuery 的静态 SQL 如何发挥作用,查看本文随附的屏幕捕捉视频 pureQuery_staticSQL.zip(参见 下载)。

要绑定应用程序,右键单击 Java 项目并选择 Bind pureQuery Application menu

控制台显示的消息表示绑定过程成功。使用与项目相关联的连接执行绑定。

要将应用程序绑定到不同的数据库,只需修改与项目相关联的连接,然后使用上面的步骤再次绑定应用程序。右键单击项目,选择 Properties,在 pureQuery 下,修改关联的连接。

图 21. 绑定 pureQuery 应用程序
绑定 pureQuery 应用程序

要解除绑定,使用顶级菜单 Project > Clean 清除项目。

目前只有 DB2 数据库支持静态 SQL。并且只针对注释方法风格启用静态 SQL 支持。未来版本将把静态 SQL 集成到内联方法风格中。

将本文随附的 pdq.properties 文件(参见 下载)复制到项目的源文件夹。默认情况下为 src 文件夹。清单 8 显示了 pdq.properties 文件。

在运行时,您可以选择静态运行应用程序或是动态运行应用程序。

  • 要静态运行,保留 pdq.executionMode=STATIC
  • 要动态运行,删除 pdq.executionMode=STATIC
清单 8. Pdq.properties 文件
#Below data zero properties can be overridden by supplying the system properties
as input to the JVM:
#
#-Dpdq.config.file=filename //a file on file system.
#or
#-Dpdq.config.resource=filename //a file on classpath
(default is /com/ibm/zero/data/runtime/dzero.properties)
#or
#-DIndividualPropertyName=Value
#
#If both pdq.config.file and pdq.config.resource are specified,
pdq.config.file has precedence.


#Name of datazero log file. Can be absolute or relative path.
pdq.log.file.name=c:\\temp\\pdq.log

#detail level of messages written to the log file.
#Supported Levels are those supported by java.util.logging APIs:
# OFF - Logging turned off.
# SEVERE - Least detail, only severe problems are logged.
# WARNING
# INFO
# CONFIG
# FINE
# FINER
# FINEST - very detailed log.
# ALL - All levels will be logged.
#
pdq.log.file.level=ALL

#detail level of messages written to the console.
pdq.log.console.level=OFF

#Switch to buffer logs in memory and only write them on error.
#When non-zero, this will avoid the performance overhead of disk I/O of
#writing excessive logs, but will still provide some history around
#the vicinity of error conditions.
#Could be set to 1000 to buffer 1000 log records for example.
pdq.log.lazy.buffer=0

#Data Zero runtime execution log. STATIC or DYNAMIC.
#STATIC is only supported by DB2 databases.
pdq.executionMode=STATIC

pureQuery 可对内存中的集合进行查询

pureQuery 现在允许您使用标准 SQL 查询诸如内存中的集合这样的信息源,从而在处理不同数据源时实现简单一致的代码。

在下面的 清单 9 中,注意如何从数据库中检索职员信息以及如何在内存中将结果合并到部门信息中。

清单 10 中的示例 pureQuery 代码将数据库查询结果并入到内存中的集合。

清单 9. 内联方法风格
// get jdbc connection

// get employees from the database
Datadb = DataFactory.getData (conn);
Iterator<Employee> getEmployees = db.queryIterator ("select BIRTHDATE, BONUS, COMM,
EDLEVEL, EMPNO, FIRSTNME, HIREDATE, JOB, LASTNAME, MIDINIT, PHONENO, SALARY, SEX,
WORKDEPT from SSURANGE.EMPLOYEE", Employee.class);

// create in memory array of departments
ArrayList depts = new ArrayList();
Department d = new Department();
d.deptno = "A00";
d.deptname = "SPIFFY COMPUTER SERVICE DIV.";
depts.add(d);

   Data qocData = DataFactory.getData();
   
// call the pureQuery API to join employees from the database with in-memory
// collection of departments
// The first parameter is the SQL like API to use for join
// The second parameter represents bean class to hold the result
// The third parameter defines the Employee bean
// The fourth parameter defines the Department class
   Iterator<InMemResult> result = qocData.queryIterator (
    "select e.FIRSTNME, d.deptname from ?1.com.ss.Employee as e, 
    ?2.com.ss.Department as d where e.workdept=d.deptno",
   InMemResult.class, getEmployees, depts );
   // print result
   SampleUtil.printAll(result);
清单 10. 持有结果的 Bean
package com.inmem;
    

/**************************************************************
 *A bean that represents the result of join between in-memory collection of
 * departments with employees from the database
 *
 **************************************************************/
import com.ibm.pdq.annotation.Table;
import com.ibm.pdq.annotation.Id;
import java.sql.Date;
import java.math.BigDecimal;



public class InMemResult  {

// Class variables
@Id
public String deptname;
public String firstnme;


}

请关注本系列的下一篇文章,了解更多详细信息。


生产力提升 10 倍

在 pureQuery 工具出现之前,开发人员必须在 Java 技术和 SQL 使用的不同工具之间切换,从而完成数据库应用程序开发任务。这个过程非常耗时并且容易出错,因此导致较高的应用程序开发成本。

本文已经查看了 pureQuery 工具提供的若干亮点,讨论了 10 余种独特特性,可以显著提高开发人员生产力并提供 SQL 与 Java 技术的集成。本文还查看了 pureQuery 工具如何加速数据库应用程序的开发。

本文讨论了如下特性:

  1. 添加 pureQuery 支持
  2. SQL 验证
  3. SQL 内容帮助
  4. 运行 SQL
  5. SQL 语法突出显示和在数据库浏览器中打开定义
  6. 对数据库使用 pureQuery bottom up 场景
  7. 对 SQL 使用 pureQuery bottom up 场景
  8. pureQuery meet-in-the-middle 场景
  9. pureQuery 静态 SQL 场景
  10. pureQuery 查询内存中的集合场景

本系列其余的文章将继续细究每个特性并探查各个特性如何提供 10 倍的生产力提升。


结束语

针对数据库进行 Java 应用程序开发是件苦差事,可是 pureQuery 通过提升性能完全改变了这种体验。

表 1 总结了每种 pureQuery 风格支持的特性:

表 1. 每种 pureQuery 风格支持的特性
特性注释方法风格内联方法风格
pureQuery 静态 SQL支持不支持
pureQuery XML 场景支持不支持
Code 生成合并支持不支持
所有其他特性支持支持

表 2 总结了每种数据库平台支持的特性:

表 2. 每种数据库平台支持的特性
特性DB2IDSzSeriesiSeries
pureQuery 静态 SQL 支持不支持支持支持
所有其他特性支持支持支持支持

本系列的下一期文章中,将深入了解 pureQuery 如何验证 SQL 并查看各种示例,了解在执行 Java 编辑器输入时 pureQuery 如何报告 SQL 错误。

本系列的第 3 部分将侧重于 pureQuery 快速应用程序开发。


致谢

加州圣何塞市硅谷实验室的 pureQuery 团队

感谢 Stephen Brodsky 提供的技术、架构和贡献

感谢 Steven Sit、Dinesh Nirmal、Audrey Wang 和 Swaminathan Gounder 做出的贡献

感谢 Becky Nin、Azadeh Ahadian 所做的工具开发

感谢 Shahneela Rahman、Mark Hager 和 Mi Wan 提供的工具质量确保

Robert Heath、Ellen Livingood 提供的信息开发

Bill Bireley、Anshul Dawra、Daya Vivek、Suavi Demir、Jaijeet Chakravorty、Delmar Blevins、Christopher M Ferrar、Heather Lamb 和 Christina Davis 提供的运行时

感谢 Brandon Wirick、Victoria Rabern 提供的运行时质量确保

特别感谢 Audrey、Robert、Becky、Mario Ds Briggs 和 Rafael Coss 对本文进行的审校工作。


下载

描述名字大小
SQL 和 pureQuery 屏幕捕捉视频JLinQ_staticSQL.zip7MB
示例 pdq.properties 文件pdq.zip1KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management, Java technology, Open source
ArticleID=278611
ArticleTitle=使用全新的 IBM pureQuery 工具提高 Java 数据库开发生产力,第 1 部分: pureQuery 工具概述
publish-date=12202007