导读:
10 种独特场景,10 倍生产力提升
文档选项
未显示需要 JavaScript 的文档选项
Sonali Surange(ssurange@us.ibm.com), pureQuery Tools 主管, IBM
2007 年 12 月 20 日
如果您是一名 Java? 开发人员或希望成为其中的一员,那么本文正好适合您。本文介绍了 IBM pureQuery 工具如何前所未有地提高 Java 编程和 SQL 效率,使用比 JDBC 少得多的代码生成简单的数据访问层,使用静态 SQL 改善应用程序的性能,并使用 SQL 访问数据库和内存中(in-memory)集合。
简介
在本系列文章中,了解 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 工具使用针对 create、retrieve、update和 delete语句的建议能够自动生成数据访问层。因此,开发人员能够专注于添加业务逻辑并使用高度灵活的 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 透视图中打开数据库浏览器
现在,您可以使用 pureQuery 工具将一个 Java 项目与数据库浏览器中的连接关联起来。为此,向 Java 项目添加 pureQuery 支持。
要添加 pureQuery 支持,右键单击该 Java 项目,选择 Add pureQuery support。
从数据库浏览器中选择一个现有连接或创建一个新连接。
图 2. 添加 pureQuery 支持
亮点 – 数据库浏览器连接定制建议
使用 pureQuery 对数据库浏览器连接进行定制以提高生产力:
持久保存数据库密码并选择在启动时自动重新连接。pureQuery 工具使用以下设置提供易用性:
转到 Windows> Preferences,选择 Data。
选择 Password information> Persistence scope,确保选中 “Automatically reconnect connections on startup”。Java 的 pureQuery SQL 集成现在使用的连接可在必要时自动重新连接。
可以在离线、断开连接的情况下使用数据库:开发人员往往需要在离线模式下设计数据库,特别是,如果远程活动服务器在应用程序设计阶段不可用或速度较慢,这种需求更加强烈。这种特性对于具有大量对象的远程 zSeries 和 iSeries 服务器非常有用:
右键单击数据库浏览器连接,保持连接离线设置。pureQuery SQL 和 Java 技术的集成现在可在断开连接的模式下工作。
对连接使用模式或对象过滤器:pureQuery 工具将在使用内容帮助列表、验证和其他 SQL 集成特性时使用这些设置。设置这些值可允许您处理所需的模式或对象,并且在处理包含大量对象的 zSeries 和 iSeries 服务器时还能提升性能。
随意设置当前模式。默认情况下,该值与连接的用户 ID 相同。pureQuery 工具将使用这种模式限制所有不合格的 SQL。
当添加 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 错误
在问题面板中查看 SQL 错误。
对具有无效 SQL 的 Java 代码行的编号使用错误标记。
对 Java 程序内无效的 SQL 使用波浪线标记错误(或者 eclipse 默认的错误标记)。
将鼠标悬停在错误上时显示详细信息。
可以检测有关 SQL 关键字(语法)和模式、表、列或其他数据库名称(语义)错误。
检测一条 SQL 语句中的多个错误。
图 4. Java 程序使用问题面板显示 SQL 错误
能够对 Java 编辑器内部的 SQL 使用 SQL 语义和语法内容帮助
按下 Ctrl键和 space键(或者默认的内容帮助键),获得 SQL 内容帮助,从而不需要在 Java 编辑器中手工输入 SQL:
搜索和选择 SQL 关键字。
从模式列表中搜索和选择,这些模式的基础是与项目相关的数据库。任何与连接相关的模式过滤器都将影响显示的列表项。
从列出的表和列名中搜索和选择。
使用内容帮助搜索列以获得表别名。
内容帮助建议显示数据库类型和主键。
对 SQL 和与数据库模式相关的建议使用易于区分的图标。
图 5. Java 程序内部的 SQL 内容帮助
SQL 内容帮助集成了 pureQuery 语法的 bean 属性
本文在 “构建 pureQuery 应用程序 – 快速应用程序开发” 小节讨论了 pureQuery bean 语法。
图 6. 针对 SQL pureQuery 语法的 Java bean 内容帮助
能够在 Java 程序内部运行 SQL
无需编写任何测试应用程序,在设计时在 Java 程序内部使用参数运行 SQL:
右键单击 Java 程序内的 SQL,提供动态参数或 pureQuery bean 语法。pureQuery 工具为 IDE 会话记忆 bean 变量参数值。
在数据输出面板中查看结果。
在数据输出面板中查看输入和输出的消息和参数值。
图 7. 在 Java 程序内运行 SQL
提供 SQL 语法突出显示功能
通过突出显示功能区分 Java 程序内的 SQL,从而可以轻松地查看复杂程序:
在 Java 程序内部突出显示 SQL。
使用 pureQuery 定制功能选择您偏爱的显示选项。默认设置为使用浅黄色方框将 SQL 包围起来:
图 8. 在 Java 程序内部突出显示 SQL —— 使用浅黄色方框包围 SQL
在数据库浏览器中为 Java 程序内部的 SQL 打开定义
类似 Java 语言的公开声明,可以在 Java 程序内部的 SQL 中查看表和列的定义:
当定位到 SQL 时,可在数据库浏览器中查看 SQL 表示的一个或多个表。
当定位到列时,在数据库浏览器中查看某条选择语句对应的列。
图 9. 在数据库浏览器中显示
在 Java 程序中提供 SQL 模板支持
重用 SQL 编辑器中喜爱的模板,在 Java 程序内部生成常见查询:
在 Java 中使用 SQL 内容帮助时,查看并选择喜爱的 SQL 模板。
使用 SQL 编辑器模板的编辑功能定制 SQL 模板。
图 10. Java 内的 SQL 模板
在 Java 程序中提供可视说明
在 Java 程序内查看有关 SQL 的解释说明。
在程序中使用 pureQuery 的编辑器集成
pureQuery 的 SQL 集成可用于 Eclipse 中的标准 Java 编辑器。
默认情况下,对 pureQuery API 内使用的字符串启用了 SQL 编辑功能。
此外,可以对所选择的任何字符串以及在包含 SQL 的应用程序中使用该功能。
在涉及到 SQL 的现有或新 Java 项目中启用 pureQuery 编辑器支持
要运行 SQL、在数据库浏览器中显示,并对项目中的任何字符串生成 SQL bean 功能(请参考 “构建 pureQuery 应用程序 – 快速应用程序开发” 一节中有关 SQL bean 功能的内容),请执行以下简单步骤:
向 Java 项目添加 pureQuery 支持。这将把一个连接和 Java 项目关联起来。
添加完 pureQuery 支持后,确保重新打开了之前打开的 Java 文件,查看启用的 pureQuery 右键单击菜单。
要对应用程序中选择的任何字符串利用 SQL 内容帮助、SQL 验证和 SQL 模板功能,还需要执行以下步骤:
使用 @Sql命令对进行 SQL 编辑的字符串的声明添加注释。
使用快捷键组合 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 工具特性
拥有数据库并希望生成数据访问代码?
对数据库使用 pureQuery bottom up 场景。
拥有 SQL 并希望重新使用它以及生成数据访问代码?
对 SQL 使用 pureQuery bottom up 场景。
拥有 database 和 Java bean,并且希望将 bean 和 bean 字段映射到数据库表和列以生成数据访问代码?
使用 pureQuery meet-in-the-middle 场景。
拥有数据库和经过映射的 Java bean 并希望生成数据访问代码?
使用 pureQuery bottom up from bean 场景。
拥有 bean 并希望生成数据库模式?
使用 top down 场景。
希望将所有 bean 注释和应用程序 SQL 放入一个 XML 文件?
使用 pureQuery XML 场景。
需要数据访问代码和更好的性能,但是不希望进行较多的开发?
使用 pureQuery 静态 SQL 场景。
需要处理数据库和内存中的数据,但不希望学习新的 API?
使用 pureQuery 查询内存中的集合支持。
对数据库使用 pureQuery bottom up 场景
应用程序开发人员通常通过以下步骤开始开发应用程序:
从一个示例入手并根据需要进行定制
使用工具生成存根并手工填入数据访问代码
手工编码整个应用程序
pureQuery 工具为以上所有场景提供了性能改善。
pureQuery 代码生成
使用 pureQuery 工具,您可以为表、视图和过程生成 pureQuery 数据访问代码。
pureQuery 工具为 create、retrieve、update和 deleteSQL 语句提供了建议,演示了使用 pureQuery 进行开发提供的便捷性。
您可以生成基于内联方法或注释方法风格的 pureQuery 应用程序:
选择内联方法风格,使用应用程序内部的 SQL 创建应用程序,获得与 JDBC 类似的体验。
使用注释方法风格使 SQL 与接口保持关联并通过接口将 SQL 从应用程序中分离出来。
通过添加新的 pureQuery 方法、接口和 SQL,或者修改现有方法、接口和 SQL,您可以轻松定制应用程序。
此外,您可以自动生成使用这些生成的 API 和 SQL 的示例程序或 JUnit 测试用例,并运行它们,无需编写任何代码。
对数据库使用 pureQuery bottom up 场景 – 表,视图
pureQuery 能够生成 pureQuery 代码访问和处理来自表、列和昵称的数据。pureQuery API 使用 bean 保存选择语句的结果。使用 pureQuery API,您可以通过 bean 实例为 select、insert、update和 delete语句提供输入参数值。这一特性大大简化了数据访问代码。pureQuery 工具为所有 bean、SQL 语句和使用它们的 pureQuery API 生成代码。
右键单击数据库浏览器中的某个表,并选择 Generate pureQuery code。
图 11. 从表中生成 pureQuery 代码
bean 生成功能的亮点
您可以自动生成表示表或视图的 bean。如果需要遵循 Java 编码标准,执行以下操作:
根据需要修改 Java bean 名称、修改 bean 字段名,并自动生成到数据库的映射
使用公共的 getter、setter 方法生成公共字段或受保护字段
允许使用超类
如果需要定制 Java 类型映射,在向导中修改 bean 字段的默认类型映射即可,如图 12 所示。将在应用程序执行阶段应用标准的 JDBC 类型转换规则。
图 12. Bean 生成选项
pureQuery 数据访问代码生成功能的亮点
pureQuery 语法以及表示 bean 字段的变量显著减少了代码量和 select、update、insert和 delete语句的复杂性,同时使用一个 bean 参数可表示多个参数。
pureQuery 提供了良好的易用性,它的查询 API 返回持有结果的 bean 迭代器,避免手动处理结果集来获得感兴趣的数据。
您可以使用 pureQuery 的 queryFirst API 轻松获得某一行,而无需返回所有行。
为使用 pureQuery API,生成的代码提供了针对 select、insert、update和 delete语句的建议。生成的 SQL 使用主键在适当的位置构造 where子句。您也可以通过自动生成的键为表生成代码。
根据应用程序需求,您可以生成内联方法风格或注释方法风格。
如果需要遵循 SQL 编码标准,您可以执行如下步骤:
使用首选参数来应用 * 或选择的所有列
在使用注释方法风格时,使用首选参数只生成少数推荐的方法建议
此外,您可以将新方法合并到现有的注释方法风格的接口中。
图 13. 代码生成首选参数
清单 1. 生成的代码 —— Bean(参考代码中的注释进行代码分析)
/***/
/**************************************************************
*AbeanthatrepresentsthePROJECTtable.
*
**************************************************************/
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;
//
Autogeneratedmappingforbeantotablename
@Table(name
=
"
PROJECT
"
,schema
=
"
SSURANGE
"
)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
MyProject
...
{
//Classvariables
@Id
publicStringprojno;
//Autogeneratedmappingforfieldtocolumnname
@Column(name="PROJNAME")publicStringmyProjname;
publicStringdeptno;
publicStringrespemp;
publicBigDecimalprstaff;
publicDateprstdate;
publicDateprendate;
publicStringmajproj;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
清单 2. 生成的代码 —— 示例内联方法风格
//
createandusestandardjdbcconnectionforconn
Datadb
=
DataFactory.getData(conn);
db.setAutoCommit(
false
);
//
executetheselectstatementandreturnresultsinaniteratorofMyProjectbean
//
MyProjectbeanrepresentstheresult
IteratorgetMyProjects
=
db.queryIterator(
"
selectDEPTNO,MAJPROJ,
PROJNAME,PRENDATE,PROJNO,PRSTAFF,PRSTDATE,RESPEMPfromSSURANGE.PROJECT
"
,
MyProject.
class
);
//
getthebeanrepresentingthefirstrowtousetotestupdate,deleteandinsert.
//
Thechangesarerolledbackifthereisanyerror
MyProjectbean
=
null
;
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
if
(getMyProjects.hasNext())
...
{
bean=getMyProjects.next();
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
}
else
...
{
SampleUtil.printLn("Resultsetisempty.")
db.rollback();
return;
}
//
Suggestionforqueryusingprimarykeyandbeanparameter.ThisAPIreturnsone
//
bean.
//
Noticethattheparameterinformationisprovidedviaabeaninstance.
//
pureQueryalsosupportsstandarddynamicparameters(ie?)
MyProjectgetMyProject
=
db.queryFirst(
"
selectDEPTNO,MAJPROJ,PROJNAME,PRENDATE,
PROJNO,PRSTAFF,PRSTDATE,RESPEMPfromSSURANGE.PROJECTwherePROJNO
=
:projno
"
,
MyProject.
class
,bean);
SampleUtil.printClass(getMyProject);
//
Suggestionforqueryupdatestatement.Provideallvaluestosetinbeanfields!
db.update(
"
updateSSURANGE.PROJECTsetDEPTNO=:deptno,MAJPROJ=:majproj,
PROJNAME
=
:myProjname,PRENDATE
=
:prendate,PROJNO
=
:projno,PRSTAFF
=
:prstaff,
PRSTDATE
=
:prstdate,RESPEMP
=
:respempwherePROJNO
=
:projno
"
,bean);
getMyProjects
=
db.queryIterator(
"
select*fromSSURANGE.PROJECT
"
,MyProject.
class
);
SampleUtil.printLn(
"
Resultsforupdate(bean)
"
);
SampleUtil.printAll(getMyProjects);
//
Suggestionforquerydeletestatement.Provideallvaluestosetinbeanfields!
db.update(
"
deletefromSSURANGE.PROJECTwherePROJNO=:projno
"
,bean);
getMyProjects
=
db.queryIterator(
"
select*fromSSURANGE.PROJECT
"
,MyProject.
class
);
SampleUtil.printLn(
"
Resultsfor-delete(bean)
"
);
SampleUtil.printAll(getMyProjects);
//
Suggestionforqueryinsertstatement.Provideallvaluestosetinbeanfields!
db.update(
"
insertintoSSURANGE.PROJECT(DEPTNO,MAJPROJ,PROJNAME,PRENDATE,
PROJNO,PRSTAFF,PRSTDATE,RESPEMP)values(:deptno,:majproj,:myProjname,
:prendate,:projno,:prstaff,:prstdate,:respemp)
"
,bean);
getMyProjects
=
db.queryIterator(
"
select*fromSSURANGE.PROJECT
"
,MyProject.
class
);
SampleUtil.printLn(
"
Resultsfor-insert(bean)
"
);
SampleUtil.printAll(getMyProjects);
<myproject><br><br> <strong>对数据库使用 pureQuery bottom up 场景 - 过程</strong> <br> pureQuery 工具能够生成 pureQuery 代码来调用过程。pureQuery API 使用 bean 表示参数和保存结果集。pureQuery 工具为所有 bean、调用语句和 pureQuery API 生成代码,从而执行调用语句。 <br> 要生成过程调用语句的代码,在数据库浏览器中右键单击某个过程,选择 <strong>Generate pureQuery Code</strong>。然后按照向导步骤执行。 <br> 如果存在参数的话(input、output 或 in out),pureQuery 工具将生成 bean 保存参数值。pureQuery API 使用这个 bean 接受 input 参数或返回 input 和 in out 参数的值。 <br> 您可以为返回的结果集选择性生成 bean。pureQuery过程代码生成向导提供了过程运行选项,以发现和建议结果 bean 的形式。您可以使用公共的 getter 和 setter 对 bean 进行定制以包含超类、公共或受保护字段,或修改默认的 Java 类型映射。 <br> <strong>注:</strong>未来版本将允许您无需运行过程即可定义结果集的形式。 <br> <strong>图 14. 生成结果集 bean </strong><br> <img width="430" height="655" src="http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0709surange/figure16_procedureResult.jpg" alt=""><br> <br> <strong>pureQuery 数据访问代码生成功能的亮点</strong> <br> 请参考 清单 3(pureQuery 返回结果集 bean)中的示例 pureQuery API,它返回调用语句的结果并保存在结果 bean 中。 <br> 请参考 清单 6(pureQuery 返回原始 JDBC 结果集)中的示例 pureQuery API,它以原始结果 JDBC 结果集的形式返回结果。注意,如果您不打算运行过程来确定结果集 bean 形式,则可以使用原始 JDBC 结果集。 <br> 可以生成内联方法或注释方法风格的程序。 <br> 内联方法风格示例: <br> <strong>清单 3. pureQuery 返回结果集 bean</strong> <br> <br><br><div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: rgb(230, 230, 230) none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;"> <div> <img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Getjdbcconnection</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">Datadb</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">DataFactory.getData(conn);<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Initializeparameterbean</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">Procedure1Paramparms</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">Procedure1Param();<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">setparametervaluesfromargumentstotheprogram.</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">setParms(parms,args);<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">CalltheprocedureusingpureQueryAPI<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Notethatallparametersarerepresentedinthecallstatement<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Notethatparameterbeanispassedinasaparameter</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">StoredProcedureResultspResult</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt="">db.call(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">CallSSURANGE.PROCEDURE1(:param1,:param2)</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,parms);<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Retrievefirstresultsetintothecorrespondingresultbean</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">IteratorresultSet1</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">spResult.getIterator(ResultBean.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">);<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Printresults</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">SampleUtil.printAll(resultSet1);<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Retrievesecondresultsetintothecorrespondingresultbean</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">IteratorresultSet2</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">spResult.getIterator(ResultBean.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">);<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Printresults</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">SampleUtil.printAll(resultSet2);<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span> </div> </div> <resultbean1><resultbean2><br> <strong>清单 4. 自动生成的参数 bean</strong> <br> <br><br><div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: rgb(230, 230, 230) none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;"> <div> <img align="top" οnclick="this.style.display='none'; document.getElementById('_29_94_Open_Text').style.display='none'; document.getElementById('_29_94_Closed_Image').style.display='inline'; document.getElementById('_29_94_Closed_Text').style.display='inline';" src="https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif" id="_29_94_Open_Image" alt=""><img align="top" οnclick="this.style.display='none'; document.getElementById('_29_94_Closed_Text').style.display='none'; document.getElementById('_29_94_Open_Image').style.display='inline'; document.getElementById('_29_94_Open_Text').style.display='inline';" style="display: none;" src="https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif" id="_29_94_Closed_Image" alt=""><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">Procedure1Param</span><span style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255); display: none;" id="_29_94_Closed_Text">...</span><span id="_29_94_Open_Text"><span style="color: rgb(0, 0, 0);">{<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Classvariables</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif" alt=""></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">Stringparam1;<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif" alt=""></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">Stringparam2;<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif" alt="">}</span></span><span style="color: rgb(0, 0, 0);"></span> </div> </div> <br><br> <strong>清单 5. 使用自动生成的结果集 bean 保存第一个结果集</strong> <br> <br><br><div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: rgb(230, 230, 230) none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;"> <div> <img align="top" οnclick="this.style.display='none'; document.getElementById('_25_102_Open_Text').style.display='none'; document.getElementById('_25_102_Closed_Image').style.display='inline'; document.getElementById('_25_102_Closed_Text').style.display='inline';" src="https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif" id="_25_102_Open_Image" alt=""><img align="top" οnclick="this.style.display='none'; document.getElementById('_25_102_Closed_Text').style.display='none'; document.getElementById('_25_102_Open_Image').style.display='inline'; document.getElementById('_25_102_Open_Text').style.display='inline';" style="display: none;" src="https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif" id="_25_102_Closed_Image" alt=""><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">ResultBean1</span><span style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255); display: none;" id="_25_102_Closed_Text">...</span><span id="_25_102_Open_Text"><span style="color: rgb(0, 0, 0);">{<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Classvariables</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif" alt=""></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">Stringroutinename;<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif" alt=""></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">Stringroutineschema;<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif" alt="">}</span></span><span style="color: rgb(0, 0, 0);"></span> </div> </div> <br><br> 生成类似的 bean 保存第二个结果集: <br> <strong>清单 6. pureQuery 返回原始的 JDBC 结果集</strong> <br> <br><br><div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: rgb(230, 230, 230) none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;"> <div> <img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Ifyouchoosenottoruntheproceduretodiscovertheresultsetshapeusedto<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">definetheresultbean,pureQueryAPIsallowyoutoworkwiththeJDBCresultset<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Getjdbcconnection</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">Datadb</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">DataFactory.getData(conn);<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Initializeparameterbean</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">Procedure1Paramparms</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">Procedure1Param();<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt="">setParms(parms,args);<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">calltheprocedureusingpureQueryAPI</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">StoredProcedureResultspResult</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt="">db.call(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">CallSSURANGE.PROCEDURE1(:param1,:param2)</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,parms);<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Processtheresultsets</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);">results</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">spResult.hasResultSets();<br><img align="top" οnclick="this.style.display='none'; document.getElementById('_555_660_Open_Text').style.display='none'; document.getElementById('_555_660_Closed_Image').style.display='inline'; document.getElementById('_555_660_Closed_Text').style.display='inline';" src="https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif" id="_555_660_Open_Image" alt=""><img align="top" οnclick="this.style.display='none'; document.getElementById('_555_660_Closed_Text').style.display='none'; document.getElementById('_555_660_Open_Image').style.display='inline'; document.getElementById('_555_660_Open_Text').style.display='inline';" style="display: none;" src="https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif" id="_555_660_Closed_Image" alt=""></span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(results)</span><span style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255); display: none;" id="_555_660_Closed_Text">...</span><span id="_555_660_Open_Text"><span style="color: rgb(0, 0, 0);">{<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif" alt="">ResultSetrs</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">spResult.hasResultSet();<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif" alt="">SampleUtil.dumpResultSet(rs);<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif" alt="">Results</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">spResult.moveToNext();<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif" alt="">}</span></span><span style="color: rgb(0, 0, 0);"></span> </div> </div> <br><br> <strong>对 SQL 使用 pureQuery bottom up 场景</strong> <br> pureQuery 工具可以轻松重用现有资源(例如 SQL)构建 pureQuery 应用程序。使用这个特性,您可以方便地对现有 JDBC 或其他包含 SQL 的数据库应用程序进行迁移。 <br> pureQuery 工具通过在 Java 编辑器内提供灵活便捷的集成实现了这一点。您可以创建一个 bean 保存 SQL 语句的结果,然后使用简单的 pureQuery API 执行 SQL 并返回结果。 <br> 使用 pureQuery 工具,您可以执行下面列出的简单步骤: <br> 向您的 Java 项目添加 pureQuery 支持 <br> 打开/重新打开包含 SQL 的 Java 文件,右键单击 SQL,从 pureQuery 帮助菜单选择 <strong>Generate SQL bean</strong>,这将生成一个 bean 保存 SQL 的结果。现在,您可以对自动生成的 pureQuery 应用程序进行定制,以使用结果 bean。 <br> <strong>清单 7. 生成的代码 - 示例内联方法风格 </strong><br> <br><br>// change the generated code to represent your SQL and bean. <br>Iterator<mybean> getMyProjects = db.queryIterator ("your new SQL", MyBean.class); <br><br> <strong>图 15. 从 SQL 生成 bean</strong> <br> <img width="484" height="735" src="http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0709surange/figure17_beanfromSQL.jpg" alt=""><br> <br> <strong>pureQuery meet-in-the-middle 场景</strong> <br> <strong>重用现有 bean 和数据库模式并将其迁移到 pureQuery </strong><br> pureQuery 工具可以轻松地重用现有 bean 和数据库模式来构建 pureQuery 应用程序。通过对表、模式和列的 pureQuery 注释使用灵活易用的内容帮助,您可以很容易地将 bean 和字段映射到数据库表和列。 <br> 一旦完成映射后,您可通过 “show in database explorer” 特性查看映射后的表或列,以确保映射正确无误。 <br> pureQuery 工具提供了一种简单的方法将现有 bean 映射到数据库模式定义中。通过结合使用 pureQuery 注释、注释中的内容帮助和 Java 快速修复,您无需进行编码即可完成映射。 <br> 执行以下简单步骤: <br> 向您的 Java 项目添加 pureQuery 支持。 <br> 打开 Java bean。 <br> 通过在类中添加 @Table注释将 bean 映射到表。 <br> 注释在 com.ibm.pdq.annotation 包中进行了定义,您可以使用 <strong>Ctrl</strong>+ <strong>shift</strong>+ <strong>O</strong>键或默认的键将需要的 import语句导入到 bean 文件。 <br> 对 name 属性使用 <strong>Ctrl</strong>+ <strong>space</strong>以获得针对表和模式的内容帮助。类似地,使用 @Column注释将 bean 字段映射到数据库列。对 name 属性使用 <strong>Ctrl</strong>+ <strong>space</strong>获得列内容帮助。 <br> <strong>图 16. 模式内容帮助</strong> <br> <img width="564" height="513" src="http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0709surange/figure18_schemaCodeAssist.jpg" alt=""><br> <br> <strong>图 17. 表内容帮助</strong> <br> <img width="441" height="226" src="http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0709surange/figure19_tableCodeAssist.jpg" alt=""><br> <br> <strong>图 18. 列内容帮助</strong> <br> <img width="483" height="299" src="http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0709surange/figure20_columnCodeAssist.jpg" alt=""><br> <br> <strong>在数据库浏览器中查看经过映射的 bean</strong> <br> 您现在可以在数据库浏览器中打开 bean 或字段表示的表或列的定义: <br> 将光标放到任何 bean 字段上。 <br> 使用 pureQuery 帮助菜单,选择 <strong>Show in Database Explorer</strong>。表示 bean 字段的列定义将显示在数据库浏览器中。 <br> 另外,将光标放在 bean 文件中的任何位置并使用这个菜单在数据库浏览器中打开表示这个 bean 的表。 <br> <strong>图 19. 在数据库浏览器中显示 bean</strong> <br> <img width="441" height="775" src="http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0709surange/figure21_showindatabaseExpl.jpg" alt=""><br> <br> <strong>pureQuery bottom up from bean 场景</strong> <br> 使用 pureQuery 工具,您可以重用并迁移映射到数据库的 bean,从而生成 pureQuery 数据访问层。 <br> 使用 pureQuery 代码生成操作从经过映射的 bean 中生成 pureQuery 代码。和 bottom up 场景一样,您可以创建所有 pureQuery 风格和示例应用程序或 JUnit 测试用例。 <br> <strong>图 20. 从经过映射的 bean 中生成 pureQuery 代码</strong> <br> <img width="463" height="800" src="http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0709surange/figure22_generatecodeFromBe.jpg" alt=""><br> <br> <strong>pureQuery top down 场景</strong> <br> <strong>重用现有 bean 并生成关系模式</strong> <br> 您可以获得 SQL 脚本建议创建数据库对象,用它表示使用 pureQuery 工具的 bean。控制台窗口将显示表示 bean 的 DDL 脚本,您可以在 SQL 编辑器中对其进行修改并运行。 <br> Java 编辑器的内部 SQL 集成可以实现这些操作。 <br> 右键单击 bean 并选择 <strong>Generate DDL</strong>。 <br> 在控制台窗口查看建议的 DDL。 <br> <strong>pureQuery XML 场景</strong> <br> XML JPA 规范规定将应用程序信息导出为 XML 格式。您可以在注释方法风格的程序中使用 pureQuery 工具导出 SQL 以及 bean 到数据库的映射信息。这样,您可以在一个 XML 文件中管理这些信息。 <br> 您可以对 pureQuery 生成器属性进行设置,使它指向您的 XML 文件。注释方法接口的实现现在可以从 XML 中使用 SQL 和 bean 映射。 <br> 这些功能都集成到了 Java 编辑器中。 <br> 右键单击 bean 或接口,并选择 <strong>Generate XML</strong>。 <br> 右键单击 Java 项目,并选择 <strong>pureQuery</strong>,然后,在生成器部分中添加: <br> xmlFile – yourFile within the eclipse workspace <br> <strong>pureQuery 静态 SQL 场景</strong> <br> <strong>轻松提升应用程序性能</strong> <br> 静态 SQL 可在运行应用程序时带来性能提升。 <br> pureQuery 使得处理静态 SQL 极其简单。执行阶段将会判断是执行静态运行还是动态运行,并且不会影响应用程序开发体验。因此,开发人员不需要学习新的工具或编程范例,就可以使应用程序从静态 SQL 中获益。 <br> pureQuery 的静态 SQL 集成为现有 SQLJ 解决方案带来了显著的性能提升。 <br> 要查看 pureQuery 的静态 SQL 如何发挥作用,查看本文随附的屏幕捕捉视频 pureQuery_staticSQL.zip(参见 下载)。 <br> 要绑定应用程序,右键单击 Java 项目并选择 <strong>Bind pureQuery Application menu</strong>。 <br> 控制台显示的消息表示绑定过程成功。使用与项目相关联的连接执行绑定。 <br> 要将应用程序绑定到不同的数据库,只需修改与项目相关联的连接,然后使用上面的步骤再次绑定应用程序。右键单击项目,选择 Properties,在 pureQuery 下,修改关联的连接。 <br> <strong>图 21. 绑定 pureQuery 应用程序</strong> <br> <img width="541" height="702" src="http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0709surange/figure_23_bindApp.jpg" alt=""><br> <br> 要解除绑定,使用顶级菜单 <strong>Project</strong>><strong>Clean</strong>清除项目。 <br> 目前只有 DB2 数据库支持静态 SQL。并且只针对注释方法风格启用静态 SQL 支持。未来版本将把静态 SQL 集成到内联方法风格中。 <br> 将本文随附的 pdq.properties 文件(参见 下载)复制到项目的源文件夹。默认情况下为 src 文件夹。清单 8显示了 pdq.properties 文件。 <br> 在运行时,您可以选择静态运行应用程序或是动态运行应用程序。 <br> 要静态运行,保留 pdq.executionMode=STATIC <br> 要动态运行,删除 pdq.executionMode=STATIC <br> <strong>清单 8. Pdq.properties 文件</strong> <br> <br><br>#Below data zero properties can be overridden by supplying the system properties <br>as input to the JVM: <br># <br>#-Dpdq.config.file=filename //a file on file system. <br>#or <br>#-Dpdq.config.resource=filename //a file on classpath <br>(default is /com/ibm/zero/data/runtime/dzero.properties) <br>#or <br>#-DIndividualPropertyName=Value <br># <br>#If both pdq.config.file and pdq.config.resource are specified, <br>pdq.config.file has precedence. <br>#Name of datazero log file. Can be absolute or relative path. <br>pdq.log.file.name=c://temp//pdq.log <br>#detail level of messages written to the log file. <br>#Supported Levels are those supported by java.util.logging APIs: <br># OFF - Logging turned off. <br># SEVERE - Least detail, only severe problems are logged. <br># WARNING <br># INFO <br># CONFIG <br># FINE <br># FINER <br># FINEST - very detailed log. <br># ALL - All levels will be logged. <br># <br>pdq.log.file.level=ALL <br>#detail level of messages written to the console. <br>pdq.log.console.level=OFF <br>#Switch to buffer logs in memory and only write them on error. <br>#When non-zero, this will avoid the performance overhead of disk I/O of <br>#writing excessive logs, but will still provide some history around <br>#the vicinity of error conditions. <br>#Could be set to 1000 to buffer 1000 log records for example. <br>pdq.log.lazy.buffer=0 <br>#Data Zero runtime execution log. STATIC or DYNAMIC. <br>#STATIC is only supported by DB2 databases. <br>pdq.executionMode=STATIC <br><br> <strong>pureQuery 可对内存中的集合进行查询</strong> <br> pureQuery 现在允许您使用标准 SQL 查询诸如内存中的集合这样的信息源,从而在处理不同数据源时实现简单一致的代码。 <br> 在下面的 清单 9中,注意如何从数据库中检索职员信息以及如何在内存中将结果合并到部门信息中。 <br> 清单 10中的示例 pureQuery 代码将数据库查询结果并入到内存中的集合。 <br> <strong>清单 9. 内联方法风格</strong> <br> <br><br><div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: rgb(230, 230, 230) none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;"> <div> <img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">getjdbcconnection<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">getemployeesfromthedatabase</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">Datadb</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">DataFactory.getData(conn);<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt="">IteratorgetEmployees</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">db.queryIterator(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">selectBIRTHDATE,BONUS,COMM,</span><span style="color: rgb(0, 0, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">EDLEVEL,EMPNO,FIRSTNME,HIREDATE,JOB,LASTNAME,MIDINIT,PHONENO,SALARY,SEX,<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt="">WORKDEPTfromSSURANGE.EMPLOYEE</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,Employee.class);</span><span style="color: rgb(0, 0, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">createinmemoryarrayofdepartments</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">ArrayListdepts</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">ArrayList();<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt="">Departmentd</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">Department();<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt="">d.deptno</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">A00</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt="">d.deptname</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">SPIFFYCOMPUTERSERVICEDIV.</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt="">depts.add(d);<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt="">DataqocData</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">DataFactory.getData();<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">callthepureQueryAPItojoinemployeesfromthedatabasewithin-memory<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">collectionofdepartments<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">ThefirstparameteristheSQLlikeAPItouseforjoin<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Thesecondparameterrepresentsbeanclasstoholdtheresult<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">ThethirdparameterdefinestheEmployeebean<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">ThefourthparameterdefinestheDepartmentclass</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">Iteratorresult</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">qocData.queryIterator(<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">selecte.FIRSTNME,d.deptnamefrom?1.com.ss.Employeease,</span><span style="color: rgb(0, 0, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">.com.ss.Departmentasdwheree.workdept</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">d.deptno</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">InMemResult.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">,getEmployees,depts);<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">printresult</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 0);">SampleUtil.printAll(result);</span> </div> </div> <employee><inmemresult><br><br> <strong>清单 10. 持有结果的 Bean </strong><br> <br><br><div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: rgb(230, 230, 230) none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;"> <div> <img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);">com.inmem;<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""><br><img align="top" οnclick="this.style.display='none'; document.getElementById('_20_270_Open_Text').style.display='none'; document.getElementById('_20_270_Closed_Image').style.display='inline'; document.getElementById('_20_270_Closed_Text').style.display='inline';" src="https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif" id="_20_270_Open_Image" alt=""><img align="top" οnclick="this.style.display='none'; document.getElementById('_20_270_Closed_Text').style.display='none'; document.getElementById('_20_270_Open_Image').style.display='inline'; document.getElementById('_20_270_Open_Text').style.display='inline';" style="display: none;" src="https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif" id="_20_270_Closed_Image" alt=""></span><span style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255); display: none;" id="_20_270_Closed_Text">/***/</span><span id="_20_270_Open_Text"><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);">************************************************************<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif" alt="">*Abeanthatrepresentstheresultofjoinbetweenin-memorycollectionof<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif" alt="">*departmentswithemployeesfromthedatabase<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif" alt="">*<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif" alt="">*************************************************************</span><span style="color: rgb(0, 128, 0);">*/</span></span><span style="color: rgb(0, 0, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">com.ibm.pdq.annotation.Table;<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">com.ibm.pdq.annotation.Id;<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">java.sql.Date;<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">java.math.BigDecimal;<br><img align="top" οnclick="this.style.display='none'; document.getElementById('_419_492_Open_Text').style.display='none'; document.getElementById('_419_492_Closed_Image').style.display='inline'; document.getElementById('_419_492_Closed_Text').style.display='inline';" src="https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif" id="_419_492_Open_Image" alt=""><img align="top" οnclick="this.style.display='none'; document.getElementById('_419_492_Closed_Text').style.display='none'; document.getElementById('_419_492_Open_Image').style.display='inline'; document.getElementById('_419_492_Open_Text').style.display='inline';" style="display: none;" src="https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif" id="_419_492_Closed_Image" alt=""></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">InMemResult</span><span style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255); display: none;" id="_419_492_Closed_Text">...</span><span id="_419_492_Open_Text"><span style="color: rgb(0, 0, 0);">{<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif" alt=""></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Classvariables</span><span style="color: rgb(0, 128, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif" alt=""></span><span style="color: rgb(0, 0, 0);">@Id<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif" alt=""></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">Stringdeptname;<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif" alt=""></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">Stringfirstnme;<br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif" alt="">}</span></span><span style="color: rgb(0, 0, 0);"><br><img align="top" src="https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif" alt=""></span> </div> </div> <br> 请关注本系列的下一篇文章,了解更多详细信息。 <br> 生产力提升 10 倍 <br> 在 pureQuery 工具出现之前,开发人员必须在 Java 技术和 SQL 使用的不同工具之间切换,从而完成数据库应用程序开发任务。这个过程非常耗时并且容易出错,因此导致较高的应用程序开发成本。 <br> 本文已经查看了 pureQuery 工具提供的若干亮点,讨论了 10 余种独特特性,可以显著提高开发人员生产力并提供 SQL 与 Java 技术的集成。本文还查看了 pureQuery 工具如何加速数据库应用程序的开发。 <br> 本文讨论了如下特性: <br> 添加 pureQuery 支持 <br> SQL 验证 <br> SQL 内容帮助 <br> 运行 SQL <br> SQL 语法突出显示和在数据库浏览器中打开定义 <br> 对数据库使用 pureQuery bottom up 场景 <br> 对 SQL 使用 pureQuery bottom up 场景 <br> pureQuery meet-in-the-middle 场景 <br> pureQuery 静态 SQL 场景 <br> pureQuery 查询内存中的集合场景 <br> 本系列其余的文章将继续细究每个特性并探查各个特性如何提供 10 倍的生产力提升。 <br> 结束语 <br> 针对数据库进行 Java 应用程序开发是件苦差事,可是 pureQuery 通过提升性能完全改变了这种体验。 <br> 表 1 总结了每种 pureQuery 风格支持的特性: <br> <strong>表 1. 每种 pureQuery 风格支持的特性</strong> <br> <strong>特性</strong> <strong>注释方法风格</strong> <strong>内联方法风格</strong> <br> pureQuery 静态 SQL 支持 不支持 <br> pureQuery XML 场景 支持 不支持 <br> Code 生成合并 支持 不支持 <br> 所有其他特性 支持 支持 <br> 表 2 总结了每种数据库平台支持的特性: <br> <strong>表 2. 每种数据库平台支持的特性</strong> <br> <strong>特性</strong> <strong>DB2</strong> <strong>IDS</strong> <strong>zSeries</strong> <strong>iSeries</strong> <br> pureQuery 静态 SQL 支持 不支持 支持 支持 <br> 所有其他特性 支持 支持 支持 支持 <br> 本系列的下一期文章中,将深入了解 pureQuery 如何验证 SQL 并查看各种示例,了解在执行 Java 编辑器输入时 pureQuery 如何报告 SQL 错误。 <br> 本系列的第 3 部分将侧重于 pureQuery 快速应用程序开发。 <br> 致谢 <br> 加州圣何塞市硅谷实验室的 pureQuery 团队 <br> 感谢 Stephen Brodsky 提供的技术、架构和贡献 <br> 感谢 Steven Sit、Dinesh Nirmal、Audrey Wang 和 Swaminathan Gounder 做出的贡献 <br> 感谢 Becky Nin、Azadeh Ahadian 所做的工具开发 <br> 感谢 Shahneela Rahman、Mark Hager 和 Mi Wan 提供的工具质量确保 <br> Robert Heath、Ellen Livingood 提供的信息开发 <br> Bill Bireley、Anshul Dawra、Daya Vivek、Suavi Demir、Jaijeet Chakravorty、Delmar Blevins、Christopher M Ferrar、Heather Lamb 和 Christina Davis 提供的运行时 <br> 感谢 Brandon Wirick、Victoria Rabern 提供的运行时质量确保 <br> 特别感谢 Audrey、Robert、Becky、Mario Ds Briggs 和 Rafael Coss 对本文进行的审校工作。 <br> 下载 <br> 描述 名字 大小 下载方法 <br> SQL 和 pureQuery 屏幕捕捉视频 JLinQ_staticSQL.zip 7MB <br> 示例 pdq.properties 文件 pdq.zip 1KB <br> 参考资料 <br> <strong>学习</strong> <br> developerWorks Information Management 专区:了解有关 Information Management 的更多消息。查找技术文档、how-to 文章、培训、下载、产品信息等等。 <br> 随时关注 developerWorks 技术事件和网络广播。 <br> 技术书店:浏览关于这些主题或其他技术主题的图书。 <br> <strong>获得产品和技术</strong> <br> IBM Viper Developer V9.5 公测版:IBM pureQuery 和工具可以通过 Viper Developer V9.5 公测版获得。请享受它带来的优势吧。 <br> 使用 IBM 试用软件构建您的下一个开发项目,可从 developerWorks 下载获得。 <br> <strong>讨论</strong> <br> 参与 developerWorks blogs并加入 developerWorks 社区。 <br> 关于作者 <br> 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 映射工具的首席开发人员。 <br><br>本文转自 <br><a href="http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0709surange/index.html#one">http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0709surange/index.html#one</a> </inmemresult></employee></mybean></resultbean2></resultbean1></myproject>
10 种独特场景,10 倍生产力提升
文档选项
未显示需要 JavaScript 的文档选项
Sonali Surange(ssurange@us.ibm.com), pureQuery Tools 主管, IBM
2007 年 12 月 20 日
如果您是一名 Java? 开发人员或希望成为其中的一员,那么本文正好适合您。本文介绍了 IBM pureQuery 工具如何前所未有地提高 Java 编程和 SQL 效率,使用比 JDBC 少得多的代码生成简单的数据访问层,使用静态 SQL 改善应用程序的性能,并使用 SQL 访问数据库和内存中(in-memory)集合。
简介
在本系列文章中,了解 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 工具使用针对 create、retrieve、update和 delete语句的建议能够自动生成数据访问层。因此,开发人员能够专注于添加业务逻辑并使用高度灵活的 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 透视图中打开数据库浏览器
![](https://i-blog.csdnimg.cn/blog_migrate/259f607879b349747b2a2b19ac2154d6.png)
现在,您可以使用 pureQuery 工具将一个 Java 项目与数据库浏览器中的连接关联起来。为此,向 Java 项目添加 pureQuery 支持。
要添加 pureQuery 支持,右键单击该 Java 项目,选择 Add pureQuery support。
从数据库浏览器中选择一个现有连接或创建一个新连接。
图 2. 添加 pureQuery 支持
![](https://i-blog.csdnimg.cn/blog_migrate/177ab8a4d05c0ca4fbd860a448a495a6.png)
亮点 – 数据库浏览器连接定制建议
使用 pureQuery 对数据库浏览器连接进行定制以提高生产力:
持久保存数据库密码并选择在启动时自动重新连接。pureQuery 工具使用以下设置提供易用性:
转到 Windows> Preferences,选择 Data。
选择 Password information> Persistence scope,确保选中 “Automatically reconnect connections on startup”。Java 的 pureQuery SQL 集成现在使用的连接可在必要时自动重新连接。
可以在离线、断开连接的情况下使用数据库:开发人员往往需要在离线模式下设计数据库,特别是,如果远程活动服务器在应用程序设计阶段不可用或速度较慢,这种需求更加强烈。这种特性对于具有大量对象的远程 zSeries 和 iSeries 服务器非常有用:
右键单击数据库浏览器连接,保持连接离线设置。pureQuery SQL 和 Java 技术的集成现在可在断开连接的模式下工作。
对连接使用模式或对象过滤器:pureQuery 工具将在使用内容帮助列表、验证和其他 SQL 集成特性时使用这些设置。设置这些值可允许您处理所需的模式或对象,并且在处理包含大量对象的 zSeries 和 iSeries 服务器时还能提升性能。
随意设置当前模式。默认情况下,该值与连接的用户 ID 相同。pureQuery 工具将使用这种模式限制所有不合格的 SQL。
当添加 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 错误
在问题面板中查看 SQL 错误。
对具有无效 SQL 的 Java 代码行的编号使用错误标记。
对 Java 程序内无效的 SQL 使用波浪线标记错误(或者 eclipse 默认的错误标记)。
将鼠标悬停在错误上时显示详细信息。
可以检测有关 SQL 关键字(语法)和模式、表、列或其他数据库名称(语义)错误。
检测一条 SQL 语句中的多个错误。
图 4. Java 程序使用问题面板显示 SQL 错误
能够对 Java 编辑器内部的 SQL 使用 SQL 语义和语法内容帮助
按下 Ctrl键和 space键(或者默认的内容帮助键),获得 SQL 内容帮助,从而不需要在 Java 编辑器中手工输入 SQL:
搜索和选择 SQL 关键字。
从模式列表中搜索和选择,这些模式的基础是与项目相关的数据库。任何与连接相关的模式过滤器都将影响显示的列表项。
从列出的表和列名中搜索和选择。
使用内容帮助搜索列以获得表别名。
内容帮助建议显示数据库类型和主键。
对 SQL 和与数据库模式相关的建议使用易于区分的图标。
图 5. Java 程序内部的 SQL 内容帮助
SQL 内容帮助集成了 pureQuery 语法的 bean 属性
本文在 “构建 pureQuery 应用程序 – 快速应用程序开发” 小节讨论了 pureQuery bean 语法。
图 6. 针对 SQL pureQuery 语法的 Java bean 内容帮助
能够在 Java 程序内部运行 SQL
无需编写任何测试应用程序,在设计时在 Java 程序内部使用参数运行 SQL:
右键单击 Java 程序内的 SQL,提供动态参数或 pureQuery bean 语法。pureQuery 工具为 IDE 会话记忆 bean 变量参数值。
在数据输出面板中查看结果。
在数据输出面板中查看输入和输出的消息和参数值。
图 7. 在 Java 程序内运行 SQL
![](https://i-blog.csdnimg.cn/blog_migrate/1713d2e284c8508db5b5e1c518dfaa14.png)
提供 SQL 语法突出显示功能
通过突出显示功能区分 Java 程序内的 SQL,从而可以轻松地查看复杂程序:
在 Java 程序内部突出显示 SQL。
使用 pureQuery 定制功能选择您偏爱的显示选项。默认设置为使用浅黄色方框将 SQL 包围起来:
图 8. 在 Java 程序内部突出显示 SQL —— 使用浅黄色方框包围 SQL
在数据库浏览器中为 Java 程序内部的 SQL 打开定义
类似 Java 语言的公开声明,可以在 Java 程序内部的 SQL 中查看表和列的定义:
当定位到 SQL 时,可在数据库浏览器中查看 SQL 表示的一个或多个表。
当定位到列时,在数据库浏览器中查看某条选择语句对应的列。
图 9. 在数据库浏览器中显示
![](https://i-blog.csdnimg.cn/blog_migrate/9a33d3c3502e39c9684a7133fd43886c.png)
在 Java 程序中提供 SQL 模板支持
重用 SQL 编辑器中喜爱的模板,在 Java 程序内部生成常见查询:
在 Java 中使用 SQL 内容帮助时,查看并选择喜爱的 SQL 模板。
使用 SQL 编辑器模板的编辑功能定制 SQL 模板。
图 10. Java 内的 SQL 模板
![](https://i-blog.csdnimg.cn/blog_migrate/fe65d8c0bf577e6421f65dcfc861975c.png)
在 Java 程序中提供可视说明
在 Java 程序内查看有关 SQL 的解释说明。
在程序中使用 pureQuery 的编辑器集成
pureQuery 的 SQL 集成可用于 Eclipse 中的标准 Java 编辑器。
默认情况下,对 pureQuery API 内使用的字符串启用了 SQL 编辑功能。
此外,可以对所选择的任何字符串以及在包含 SQL 的应用程序中使用该功能。
在涉及到 SQL 的现有或新 Java 项目中启用 pureQuery 编辑器支持
要运行 SQL、在数据库浏览器中显示,并对项目中的任何字符串生成 SQL bean 功能(请参考 “构建 pureQuery 应用程序 – 快速应用程序开发” 一节中有关 SQL bean 功能的内容),请执行以下简单步骤:
向 Java 项目添加 pureQuery 支持。这将把一个连接和 Java 项目关联起来。
添加完 pureQuery 支持后,确保重新打开了之前打开的 Java 文件,查看启用的 pureQuery 右键单击菜单。
要对应用程序中选择的任何字符串利用 SQL 内容帮助、SQL 验证和 SQL 模板功能,还需要执行以下步骤:
使用 @Sql命令对进行 SQL 编辑的字符串的声明添加注释。
使用快捷键组合 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 工具特性
拥有数据库并希望生成数据访问代码?
对数据库使用 pureQuery bottom up 场景。
拥有 SQL 并希望重新使用它以及生成数据访问代码?
对 SQL 使用 pureQuery bottom up 场景。
拥有 database 和 Java bean,并且希望将 bean 和 bean 字段映射到数据库表和列以生成数据访问代码?
使用 pureQuery meet-in-the-middle 场景。
拥有数据库和经过映射的 Java bean 并希望生成数据访问代码?
使用 pureQuery bottom up from bean 场景。
拥有 bean 并希望生成数据库模式?
使用 top down 场景。
希望将所有 bean 注释和应用程序 SQL 放入一个 XML 文件?
使用 pureQuery XML 场景。
需要数据访问代码和更好的性能,但是不希望进行较多的开发?
使用 pureQuery 静态 SQL 场景。
需要处理数据库和内存中的数据,但不希望学习新的 API?
使用 pureQuery 查询内存中的集合支持。
对数据库使用 pureQuery bottom up 场景
应用程序开发人员通常通过以下步骤开始开发应用程序:
从一个示例入手并根据需要进行定制
使用工具生成存根并手工填入数据访问代码
手工编码整个应用程序
pureQuery 工具为以上所有场景提供了性能改善。
pureQuery 代码生成
使用 pureQuery 工具,您可以为表、视图和过程生成 pureQuery 数据访问代码。
pureQuery 工具为 create、retrieve、update和 deleteSQL 语句提供了建议,演示了使用 pureQuery 进行开发提供的便捷性。
您可以生成基于内联方法或注释方法风格的 pureQuery 应用程序:
选择内联方法风格,使用应用程序内部的 SQL 创建应用程序,获得与 JDBC 类似的体验。
使用注释方法风格使 SQL 与接口保持关联并通过接口将 SQL 从应用程序中分离出来。
通过添加新的 pureQuery 方法、接口和 SQL,或者修改现有方法、接口和 SQL,您可以轻松定制应用程序。
此外,您可以自动生成使用这些生成的 API 和 SQL 的示例程序或 JUnit 测试用例,并运行它们,无需编写任何代码。
对数据库使用 pureQuery bottom up 场景 – 表,视图
pureQuery 能够生成 pureQuery 代码访问和处理来自表、列和昵称的数据。pureQuery API 使用 bean 保存选择语句的结果。使用 pureQuery API,您可以通过 bean 实例为 select、insert、update和 delete语句提供输入参数值。这一特性大大简化了数据访问代码。pureQuery 工具为所有 bean、SQL 语句和使用它们的 pureQuery API 生成代码。
右键单击数据库浏览器中的某个表,并选择 Generate pureQuery code。
图 11. 从表中生成 pureQuery 代码
![](https://i-blog.csdnimg.cn/blog_migrate/d08618b0a0dc5aa4b11d3c7a8e005773.png)
bean 生成功能的亮点
您可以自动生成表示表或视图的 bean。如果需要遵循 Java 编码标准,执行以下操作:
根据需要修改 Java bean 名称、修改 bean 字段名,并自动生成到数据库的映射
使用公共的 getter、setter 方法生成公共字段或受保护字段
允许使用超类
如果需要定制 Java 类型映射,在向导中修改 bean 字段的默认类型映射即可,如图 12 所示。将在应用程序执行阶段应用标准的 JDBC 类型转换规则。
图 12. Bean 生成选项
![](https://i-blog.csdnimg.cn/blog_migrate/f40749ef5e86519620ec029cf8721ab1.png)
pureQuery 数据访问代码生成功能的亮点
pureQuery 语法以及表示 bean 字段的变量显著减少了代码量和 select、update、insert和 delete语句的复杂性,同时使用一个 bean 参数可表示多个参数。
pureQuery 提供了良好的易用性,它的查询 API 返回持有结果的 bean 迭代器,避免手动处理结果集来获得感兴趣的数据。
您可以使用 pureQuery 的 queryFirst API 轻松获得某一行,而无需返回所有行。
为使用 pureQuery API,生成的代码提供了针对 select、insert、update和 delete语句的建议。生成的 SQL 使用主键在适当的位置构造 where子句。您也可以通过自动生成的键为表生成代码。
根据应用程序需求,您可以生成内联方法风格或注释方法风格。
如果需要遵循 SQL 编码标准,您可以执行如下步骤:
使用首选参数来应用 * 或选择的所有列
在使用注释方法风格时,使用首选参数只生成少数推荐的方法建议
此外,您可以将新方法合并到现有的注释方法风格的接口中。
图 13. 代码生成首选参数
![](https://i-blog.csdnimg.cn/blog_migrate/05d3ca62b85c1f2a8edc0fa55e38b965.png)
清单 1. 生成的代码 —— Bean(参考代码中的注释进行代码分析)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
清单 2. 生成的代码 —— 示例内联方法风格
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)