|
简介
IBM pureQuery 技术和工具可以大大简化包含 SQL 的 Java 应用程序的开发任务。pureQuery 可以在 Eclipse 环境中对 Java 语言和 SQL 进行深入集成。pureQuery 工具使开发人员能够在 Java 编辑器中无缝地处理 SQL,支持使用各种生产力特性,比如 SQL 检验、SQL 内容辅助、SQL 执行、在数据库浏览器中显示表和列以及 SQL 模板。
关于 pureQuery 工具的概述请参考本系列的 第 1 部分。
本文主要讨论 Java 中的 SQL 检验。
另外,本文要使用 pureQuery 工具中的以下特性:
- 生成内联风格的 pureQuery 代码
- 使用 SQL 内容辅助纠正无效的查询
- 生成创建表所需的 DDL
本文还要使用以下 IBM DB2® Developer Workbench 工具:
- 修改表
- 数据库浏览器
- 数据连接持久化选项
- SQL / XQuery Editor
平台支持
IBM 数据库 —— IBM DB2® for Linux®, UNIX® and Windows®、zSeries® 和 iSeries®,以及 IBM Informix® Dynamic Server
Eclipse 环境
- Developer Workbench 9.5 公测版
- 对 shell 的未来支持包括 IBM Ration® 产品套件
前提条件
DB2 SAMPLE 数据库
IBM pureQuery
pureQuery 是一款全新的高性能 Java 数据访问平台,旨在简化数据访问应用程序的开发和管理任务。
使用 pureQuery 可以使应用程序生命周期的所有阶段受益,包括开发、部署、管理和治理。
pureQuery 通过其工具、API 和运行时环境提供对数据库数据和内存中 Java 对象的访问。
IBM pureQuery Eclipse 工具
IBM Viper Developer V9.5 提供的基于 Eclipse 的 pureQuery 工具支持:
- 在 Java 编辑器中以同样的生产力编写 SQL 和 Java 代码
- 在 Java 编辑器内调试 Java 和 SQL 代码
- 使用比 JDBC 少得多的代码自动生成简单的数据访问层
- 用静态 SQL 轻松地提高应用程序性能,不需要做额外工作
- 使用 SQL 访问数据库和内存中集合
为什么要在 Java 语言中使用 pureQuery SQL 检验
目前,对于需要在数据库应用程序中编写 SQL 语句的开发人员,Eclipse Java 开发环境提供的支持很少。与编写 SQL 代码相比,编写 Java 代码要方便得多。
Java 编辑器可以在输入代码时报告 Java 语法方面的错误。
图 1. Java 问题位置的标志
把光标停留在问题或问题标志上,就可以看到问题的细节,见图 2:
图 2. Java 问题的细节
如果忽略问题并继续编写代码,那么当保存文件或构建项目时(取决于项目是否设置为自动构建),Problems 视图会列出这些问题。在 Problems 视图中,双击一个问题就可以在 Java 编辑器中看到对应的代码。
图 3. 问题列表和到问题位置的导航
可以使用 Eclipse 的 Java 快速纠正支持或内容辅助来纠正问题。
在 Eclipse 中工作的 Java 应用程序开发人员长期以来一直受益于这种集成,以这种方式识别和纠正 Java 问题几乎成了他们的第二天性。
现有解决方案的缺陷
目前,在 Java 应用程序中编写 SQL 代码还不太容易。Java 编辑器无法探测 SQL 语法中的错误,也无法发现 SQL 语句引用的数据库对象不存在。实际上,当编写完应用程序时,没有任何迹象能够说明 SQL 代码是否有效;只有到执行应用程序时,才能看出来。在这个阶段,SQL 的执行失败,程序必须捕获异常来判断失败的原因。
可以使用两种方法寻找应用程序中的 SQL 问题:
- 在代码中处理 SQL 异常并运行应用程序,以此判断 SQL 是否有效。如果 SQL 语句中有错误,就纠正它并重新运行应用程序;为了捕捉并纠正所有 SQL 错误,可能需要多次运行应用程序。
- 使用 JDBC API 预备语句检验 SQL。这种解决方案的缺点是,这只能识别出 SQL 中的第一个问题。必须重复纠正和重试过程,直到消除所有 SQL 错误。
这两种方法都需要数据库连接,但是在应用程序设计阶段常常还没有建立数据库系统。另外,如果只能访问远程数据库,还可能受到网络状态的影响。
与 SQL 开发相反,使用 Eclipse 的 Java 编辑器进行 Java 开发是非常轻松的。Java 开发体验已经非常优化,生产力非常高,而编写 SQL 的过程还非常原始,效率很低。
pureQuery 工具在 Eclipse 的 Java 编辑器中集成了几个 SQL 编辑特性,从而解决了上述问题。
pureQuery SQL 检验的特点
pureQuery 工具直接集成在 Java 编辑器中,可以在开发人员输入代码时显示 SQL 语句中的问题。这些工具:
-
探测 SQL 中的数据库模式、表、列和其他数据库工件的错误。这个特性常常称为语义检验。
- 探测 SQL 关键字及其在 SQL 代码中的位置是否有效。这个特性常常称为语法检验。
-
识别 SQL 语句中的大多数错误,而不只是第一个错误。这个特性可以极大地提升生产力,可以一次纠正所有 SQL 问题。例如,如果一个语句中的两个列名拼写错了,pureQuery 会同时探测出这两个错误。
注意:如果表名拼写错了,那么就不会探测出列名错误;如果模式名拼写错了,那么就不会探测出表名和列名错误。如果 SQL 语法有问题,就不会探测出语义错误。
-
在两个位置描述 SQL 错误的细节:在代码中和在 Problems 视图中。把光标停留在代码中的错误上,或者双击 Problems 视图中的错误,就可以看到对错误的解释。在诊断错误时,不需要记住 SQL 代码,然后查阅手册。
-
根据首选项设置,在代码中突出显示 SQL 错误。
-
探测跨越 Java 字符串中多行的 SQL 语句中的错误。
-
允许在没有数据库连接的情况下使用保存的模型。
-
允许过滤数据库浏览器中的数据库对象,这样就能够只查看感兴趣的对象。
-
允许针对不同的数据库连接(比如开发、测试、生产数据库)或不同的模式检验 Java 应用程序。
-
允许关闭 SQL 检验。
-
允许把 SQL 错误视为警告。
在下一节中,我们试试 pureQuery 工具提供的这些特性。
pureQuery SQL 检验的使用效果
在应用程序的任何开发和部署阶段都可以因 pureQuery SQL 检验受益。在每种场景的每个阶段,生产力都会提升。
下面是一些可以因 pureQuery 检验和 SQL 编辑特性受益的场景:
提升应用程序开发生产力的 10 种独特场景
-
在创建或定制 SQL 时,希望探测数据库模式、表或列中的错误?
使用 用语义检验探测和纠正输入的 SQL 场景。
-
构建一个 pureQuery 应用程序,并在这个场景中体验每个 SQL 检验特性。使用 pureQuery SQL 内容辅助纠正问题。
-
在创建或定制 SQL 时,希望探测 SQL 关键字中的错误?
使用 用语法检验探测和纠正输入的 SQL 场景。
-
希望从开发数据库和模式切换到测试或生产数据库和模式,并继续使用直接的 SQL 检验?
使用 切换 SQL 检验所用的数据库 场景。
-
使用 pureQuery Generate DDL 特性生成 DDL 脚本,用脚本从 pureQuery bean 创建表。使用新的 SQL / XQuery 编辑器执行生成的 SQL。
-
在正在构造数据库模式期间,希望忽略 pureQuery 应用程序中的 SQL 错误?
使用 定制 SQL 检验的严重性 场景。
-
需要改变表名或列名,并用 SQL 检验了解对 Java 应用程序的影响?
使用 探测数据库的修改对 Java 应用程序的影响 场景。
-
不希望由于数据库服务器不可用而导致无错误 SQL 开发停顿?不希望受到其他团队成员对数据库做的修改的影响?
使用 在 Java 应用程序中进行断开连接的高效的无错误 SQL 开发 场景。
-
希望在每次打开 IDE 时自动执行 SQL 检验,避免重复输入连接密码?
使用 在数据库浏览器中保存密码 场景。
-
希望以报告格式查看应用程序中的错误?
使用 生成 SQL 问题报告 场景。
-
希望修改 Java 编程和 SQL 错误的默认错误显示选项?
使用 定制错误显示选项 场景。
-
希望在现有的所有程序中使用 pureQuery SQL 检验?
使用 扩展 pureQuery SQL 检验 场景。
首先,需要使用 pureQuery 工具从 sample 数据库创建一个 pureQuery 应用程序:
设置 —— 创建 pureQuery 代码
执行以下步骤:
-
打开 Java 透视图。在 Java 透视图中添加数据库浏览器视图 —— 导航到 Window > Show View,选择 Data 并双击 Database Explorer。
-
在数据库浏览器中连接 SAMPLE 数据库。
-
创建一个 Java 项目。
- 把它命名为 pureQuerySQLPrj。
图 4. 创建一个 Java 项目
-
在数据库浏览器中,右键单击 PROJECT 表并选择 Generate pureQuery code。
- 确保选中以下复选框:
图 5. 生成 pureQuery 代码
- 单击 Finish。
pureQuerySQLPrj 现在包含以下文件:
-
Project.java ——– 代表 PROJECT 表的 bean
-
ProjectInlineSample.java —— 内联方法风格的程序,包含对
create、select、update 和 delete 语句的建议
本文将处理 ProjectInlineSample.java 中生成的 SQL。
在本系列的下一篇文章中,将使用 pureQuery 支持的方法风格的应用程序开发。
-
在 Java 编辑器中打开 ProjectInlineSample.java。
观察程序如何通过 pureQuery 的 API 使用 create、select、update 和 delete 语句。
还要注意,程序中的所有 SQL 用黄色框突出显示。pureQuery 的 SQL 注解特性可以区分出 Java 程序中的 SQL。在本文的其余部分中,我们将处理这些突出显示的 SQL。
-
确保项目已经启用了 pureQuery 支持:
-
右键单击 pureQuerySQLPrj 并选择 Properties。
-
选择 pureQuery。观察与这个项目相关联的 SAMPLE 连接。
-
选择 Current schema 设置,可以看到连接所用的用户 ID 用作当前的模式设置。
pureQuery 工具使用这个连接对项目中的 Java 文件执行 SQL 检验。
用语义检验探测和纠正输入的 SQL
为了演示 pureQuery 的 SQL 检验特性,我们修改一下生成的 SQL。
-
在生成的第一个选择语句中,把两个列名改为无效的值(这个示例把 PROJNAME 和 PRENDATE 改为无效的值)。
观察错误的列名下面显示的 Java 语言错误标志(在默认情况下,是红色的波浪线)。
-
保存文件,观察编辑器中的问题标志(在默认情况下,是红色的叉)。
-
打开 Problems 视图 —— 导航到 Window > Show View > Problems。
注意,这里列出了 Java 程序中的所有 无效列名和其他 Java 语言错误:
图 6. 显示多个错误的列名
-
可以使用 pureQuery 的内容辅助特性纠正列名:
-
把鼠标放在列名前面,按 Ctrl + Space(或内容辅助特性的默认快捷键)激活内容辅助。
注意,这时会显示 PROJECT 表的列名列表。选择 PROJNAME 和 PRSTDATE 纠正列名错误。
图 7. 列内容辅助
-
在生成的第一个选择语句中,把表名改为无效的值(这个示例把 PROJECT 表改为 PROJECT1)。
观察错误的 SQL 下面显示的 Java 语言错误标志(在默认情况下,是红色的波浪线);在这个示例中,错误的 SQL 是表名 PROJECT1。
-
保存文件,观察编辑器中的问题标志(在默认情况下,是红色的叉)。
-
打开 Problems 视图 —— 导航到 Window > Show View >
Problems。
注意,这里列出了 Java 程序中的无效表名和其他 Java 语言错误:
图 8. 表错误
-
可以使用 pureQuery 的内容辅助特性纠正表名:
-
把光标放在表名前面,按 Ctrl + Space(或内容辅助特性的默认快捷键)激活内容辅助。
注意,这时会显示模式的表列表。选择 PROJECT 纠正表名。
图 9. 表内容辅助
-
现在,把模式名改为无效的值并观察相似的错误。使用内容辅助纠正模式名。
已经实现的目标:
我们观察了 pureQuery 如何同时标出 SQL 中的所有错误,比如所有列名错误。与识别 SQL 错误的其他机制(比如使用 JDBC 预备语句)相比,这个特性确实非常方便。
还看到了 pureQuery 可以识别跨多行的错误并显示与其他 Java 语言错误相似的错误标志。
用语法检验探测和纠正输入的 SQL
-
在生成的更新语句中修改 update 关键字。
这时会出现与修改表名时相同的效果。
-
可以使用快速纠正特性纠正某些 SQL 关键字。可以使用 Java 编辑器快速纠正特性纠正 update 关键字。
-
使用内容辅助纠正 SQL 关键字,见图 10:
图 10. update 关键字错误和内容辅助
注意:以后的 pureQuery 工具版本会提供 pureQuery 主机变量检验。
已经实现的目标:
我们观察到 pureQuery 能够探测和纠正 SQL 语句中的语法错误。
切换 SQL 检验所用的数据库
在通常情况下,在开发数据库上开发应用程序,在另一个数据库上测试,最后部署在生产数据库上。这些数据库的模式名常常是不同的。在这个场景中,学习如何在不修改任何代码的情况下,切换 pureQuery 项目所用的数据库并检验 SQL。
- 按照以下步骤,在 DB2 服务器上创建一个测试数据库,并把它命名为 TESTDB:
- 在 DB2 命令提示中运行以下 SQL 语句:
-
在数据库浏览器中创建到 TESTDB 数据库的连接。
-
把 Java 项目的连接改为指向 TESTDB:
-
右键单击 pureQuerySQLPrj 并选择 Properties。
-
选择 pureQuery 并把连接名改为 TESTDB:
图 11. 修改 Java 项目所用的数据库
-
现在,在 TESTDB 数据库中 TESTSCHEMA 模式下创建 PROJECT 表:
-
打开 Project.java bean。
-
右键单击 bean 并从 pureQuery Assist 菜单中选择 Generate DDL。
-
导航到 Window > Show View,然后选择 Console 打开控制台视图。
-
复制列出的 DDL(这是用来创建 Project bean 代表的表的 DDL 语句)。
图 12. 在 PROD 数据库中 PRODSCHEMA 模式下创建 PROJECT 表
-
使用 SQL / XQuery 编辑器运行 DDL:
-
在数据库浏览器中,右键单击 TESTDB 连接下的 TESTDB 数据库并选择 New SQL or XQuery Script,打开 SQL/XQuery 编辑器。
- 指定名称 ProjectDDL 并确保选择 SQL Editor 按钮。
- 把控制台视图中的 SQL 脚本复制到 SQL/ XQuery 编辑器中的 ProjectDDL.sql。
-
按照以下清单修改模式名:
清单 1. 运行 DDL
CREATE TABLE TESTSCHEMA.PROJECT (
DEPTNO VARCHAR(255) NOT NULL,
MAJPROJ VARCHAR(255) NOT NULL,
PRENDATE DATE NOT NULL,
PROJNAME VARCHAR(255) NOT NULL,
PROJNO VARCHAR(255) NOT NULL,
PRSTAFF DECIMAL(9 , 2) NOT NULL,
PRSTDATE DATE NOT NULL,
RESPEMP VARCHAR(255) NOT NULL
)
DATA CAPTURE NONE ;
ALTER TABLE TESTSCHEMA.PROJECT ADD CONSTRAINT PROJECTPK PRIMARY KEY (PROJNO);
|
- 在编辑器中右键单击并选择 Run SQL。查看执行结果。
图 13. 使用 SQL / XQuery 编辑器执行 DDL 脚本
-
在数据库浏览器中刷新 TESTDB 连接的模式。
-
重新打开 ProjectInlineSample.java。
注意,Java 编辑器会自动探测出原来的模式已经无效了。
图 14. Java 编辑器自动探测出原来的模式在测试或生产数据库中不再有效
- 使用内容辅助纠正错误。
注意,为了避免模式的修改导致代码修改,还可以避免使用属于当前模式的标识符进行限定。这样就可以简单地修改 Java 项目的当前模式,让它使用适当的模式名,如下所示:
图 15. 在 Java 项目连接上设置当前模式
已经实现的目标:
您学习了如何在开发数据库和测试数据库之间切换,并针对这两个数据库进行 SQL 检验。实现这个目标的方法是切换与 Java 项目相关联的数据库。
另外,在构造应用程序时,可以避免用模式名限定 SQL;这样,当模式名改变时,只需修改 Java 项目的当前模式。
定制 SQL 检验的严重性
pureQuery 工具允许灵活地对待 Java 程序中的 SQL 错误,可以把它们看作错误或警告,甚至允许忽略它们。如果数据库模式不同步或者还在开发过程中,就需要把这些错误当作警告对待。
为了把 SQL 检验错误当作警告对待,需要把 SQL 问题的严重性级别首选项设置为 “Warnings”。
另外,如果您正在开发 SQL,但是数据库模式还不存在,那么可以选择关闭 SQL 检验。关闭检验的方法是把 SQL 问题的严重性级别首选项设置为 “Ignore”。
可以决定在应用程序开发的某些阶段关闭检验,以后再打开它。
按照以下步骤设置首选项:
- 选择 Window > Preferences > Data > pureQuery > Compiler Settings,见图 16:
图 16. 把 SQL 检验严重性设置为忽略
修改这个首选项会触发工作空间重新构建。还可以选择重新构建特定的项目。
把 SQL 错误当作警告对待,会显示与 Java 语言警告相同的警告标志(在默认情况下,是黄色的波浪线),显示文件和行警告标志(在默认情况下,是黄色的叉),并在 Problems 视图的警告部分中列出警告。
已经实现的目标:
您学习了在数据库仍然处于开发阶段时如何关闭检验,以及如何把 SQL 错误当作警告对待。
探测数据库的修改对 Java 应用程序的影响
-
在 TESTSCHEMA 下面的 TESTDB 连接上选择 PROJECT 表,并选择 Alter。
-
按照图 17 修改两个列名,然后选择 Run DDL:
图 17. 修改表的列名
-
重新打开 ProjectInlineSample.java,修改列名的影响现在反映在 Java 程序中:
图 18. 探测出 Java 程序中出现受影响的数据库列名的所有地方
已经实现的目标:
您已经看到可以探测出 Java 应用程序中数据库修改的影响,这样就便于在开发应用程序时根据这些修改调整应用程序。
注意:未来的 pureQuery 工具版本会提供更完整的影响分析。
在 Java 中进行断开连接的高效的无错误 SQL 开发
可以在连接数据库的情况下使用 pureQuery SQL 检验,也可以在文件系统中保存连接并在离线情况下执行检验。
如果保存连接,pureQuery SQL 检验就使用保存的数据库元数据进行离线检验。
-
在数据库浏览器中,右键单击 SAMPLE 数据库的连接并选择 Save offline。
现在,所有 SQL 检验将使用保存的数据库模式。
已经实现的目标:
如果数据库实例由其他开发人员共享,那么可以把开发环境与数据库实例中的修改隔离开,这样在设计数据库应用程序时,就不需要连接数据库。这会大大提升生产力,避免应用程序开发受到干扰。
在数据库浏览器中保存密码
简化 SQL 检验所需的数据库连接操作:
- 可以请求保存连接的密码,让它在每次 Eclipse 调用时都自动生效。如果保存了密码,还可以通过设置首选项在启动时自动重新连接。
- 选择 Window > Preferences > Data,然后选择密码信息设置的 Persistence Scope。
- 选中在启动时自动重新连接的复选框。
注意:如果您的设置与以上设置不匹配,那么在 Eclipse 启动时,包含 SQL 代码的 Java 文件可能不显示无效 SQL 的错误标志。同样,在 Java 程序中 SQL 可能不会突出显示,您设置的 SQL 显示选项也无效。在文件的第一行会有一个警告,它指出这种现象的原因。
图 19. 如果没有建立连接,也没有离线保存连接,就会显示警告
已经实现的目标:
您学习了如何通过密码设置避免在每次打开 IDE 时重复输入密码。
生成 SQL 问题报告
探测出的所有 SQL 错误与其他 Java 语言错误一起显示在 Problems 视图中。可以使用标准的 Eclipse 特性定制 Problems 视图,让它只列出错误或警告。
图 20. 定制 Problems 视图
选择 Problems 视图中的所有错误,或者只选择您感兴趣的错误,然后可以把它们复制到 Eclipse 环境之外的报告文件中。
清单 2. 外部错误报告
Severity and description Path Resource Location Creation Time Id
Table "PROJECT" does not contain column "DETNO".
pureQueryValidationPrj/src/com/demo
ProjectInlineSample.java
line 6728
Table "PROJECT" does not contain column "PRTAFF".
pureQueryValidationPrj/src/com/demo
ProjectInlineSample.java
line6729 |
在 Java 程序中探测出的 SQL 错误与其他 Java 语言错误一起保存。也可以生成定制格式的报告,这需要编写一个实用程序,它扫描保存的错误并按所需的格式填充报告。
定制错误显示选项
Eclipse 允许把默认的错误/警告显示方式(错误采用红色的波浪线和叉;警告采用黄色的波浪线和叉)改为其他显示方式。这需要设置 SQL 错误的首选项。
按照以下步骤定制 Java 和 SQL 错误的显示方式:
-
导航到 Window > Preferences > General > Editors
> Text Editors > Annotations,选择 Errors。
- 修改以下首选项:
- 把 “Text as” 改为 “Highlighted”
- 把 “Color” 改为浅蓝色
图 21. 定制的错误显示
- 重新构建项目。
现在,所有 Java 和 SQL 错误以蓝色突出显示:
图 22. Java 和 SQL 错误以蓝色突出显示
已经实现的目标:
您已经看到,pureQuery 可以通过 Java 编辑器首选项为 Java 程序中的 Java 和 SQL 提供一致的外观和感觉。
扩展 pureQuery SQL 检验
在 Eclipse 中的标准 Java 编辑器中,可以使用 pureQuery 的 SQL 集成。
在默认情况下,对于 pureQuery API 中使用的字符串,启用了 SQL 编辑功能。另外,在包含 SQL 的应用程序中,可以对选择的任何字符串使用这个功能。
关于为 Java 应用程序启用这个特性的细节,请参考 第 1 部分 中的 “在 Java 编辑器内部集成 SQL 编辑器 > 在程序中使用 pureQuery 的编辑器集成”。
生产力为什么会提升 10 倍
本文展示了 pureQuery SQL 检验特性的效果以及定制和扩展的方法。
现在,我们来分析一下这个特性为什么会使开发人员的生产力提升 10 倍。
如果没有 pureQuery 工具,成功地构建 Java 数据库应用程序需要执行以下步骤:
-
在 Java 代码中手工编写 SQL。SQL 可以有输入参数,可以返回结果集。
-
手工编写应用程序来测试 SQL。
-
手工编写 SQL 的所有输入参数信息并获取结果。
-
手工编写 try-catch 结构并显示捕获的异常。
- 执行应用程序。
-
如果 SQL 是无效的,就要检查抛出的 SQL 异常。
-
查阅数据库手册,搜索异常中返回的错误码,从而判断失败的原因。
-
打开数据库厂商提供的 SQL 编辑器或构建器,尝试纠正 SQL。
-
把 SQL 粘贴回 Java 程序中。
- 重复步骤 5-8,直到获得成功。
还有一个大缺点:必须连接数据库,才能执行测试。如果无法连接数据库,就不可能检验 SQL。这对开发活动限制很大。
如果没有 pureQuery,就无法同时找到程序中所有 SQL 语句中的所有错误。
通过使用 pureQuery 工具,就可以轻松地在 Java 应用程序中编写有效的 SQL。pureQuery 把编辑-调试-测试循环简化为一个步骤,因此大大提升了生产力。
结束语和后续内容
在 DB2 和 IDS 等 IBM 数据库上开发 Java 应用程序时,pureQuery 工具可以大大提高 SQL 生产力。
在本系列的下一篇文章(第 3 部分)中,深入学习如何使用不同的 pureQuery 风格开发 pureQuery 应用程序。
第 4 部分将重点讨论 Informix 数据库上的 pureQuery 应用程序生命周期。
致谢
感谢 Brian Payton 和 Roger Roles 提供的 Integrated Query 和解析器技术。
特别感谢 Robert Heath 和 Michael Hsing 审阅了本文。
参考资料 学习
获得产品和技术
讨论
|