关系数据访问的对象化
大多数企业建立在信息管理系统上,其主要基础结构基于存储在一个或多个关系数据库中的数据。 这些系统由软件程序组成,其唯一目的是进行信息处理,并以Java之类的托管语言实现。
作为一种基于OO的语言,其特征在于易于封装,继承和多态,Java一方面用于实现信息处理程序的计算和逻辑方面,另一方面用于访问和操纵关系数据。 Java根据对象定义信息,而关系数据库使用行 。 对象是它们所属类的唯一实例,因此,它们在物理上是彼此不同的。 同样,关系数据库行也是唯一的,只要它们由主键值标识即可。 另一方面,只要对象仍然被一个或多个其他对象引用,它们就可以独立存在并继续存在。 但是,行作为表的元素存在,一旦删除,行就会被删除。
因此,尽管对象和行在许多方面都是相似的,但是出于可伸缩性,可扩展性和高效代码维护的目的,对象对于模块化编程的内在价值已成为设计基础通过对象化抽象关系行层的基础。 我们将对象化定义为将OO的封装,继承和多态性基本概念引入使用SQL进行的其他密集型指令内联数据查询实践的过程。 简而言之,对象化是使用能够在纯OO范式中执行数据库操作(包括创建,替换,更新和删除)的方法创建无缝对象的过程。
客观地以编程方式访问和操纵关系数据的最流行方法是通过特殊的API和包装程序,这些API和包装程序提供一个或多个以文本字符串形式编写SQL语句。 整个关系数据处理基于这些封装SQL语句,它们是程序逻辑的重要部分。 但是,这些SQL语句对Java语言不是透明的,因此无法从编译时优化以及语义和语法验证中受益-更不用说被排除在设计时功能(例如内容辅助功能)之外,这些功能可共同节省大量时间在基础设计和实施过程中提供帮助。
因此,提高程序员效率和生产率的主要挑战之一是将关系数据转换为可以以自然的OO编程方式无缝地用于编写基础代码的对象。 除了具有良好的编码能力和破坏能力之外,此过程还需要对如何对数据访问API调用进行排序有一个很好的了解,并且对底层数据访问编程模型(例如JDBC)有一个很好的技术了解。将软件(尤其是其数据访问层)划分为模块化的部分。
名为pureQuery的项目代码为数据库应用程序开发人员提供了一种基于GUI的简便方法,可以在设计和实施阶段显着提高生产力。 这是通过用户启动的将关系数据自动转换为Java对象以访问和处理数据来实现的。 反过来,可以在自然的OO编程范式中无缝利用这些对象来编写业务逻辑和基础代码。 pureQuery的功能通过将查询语言与Java集成在一起,实际上消除了传统的JDBC编程。
本文提供了pureQuery的概述,并分步介绍了pureQuery如何显着提高程序员的生产率。
pureQuery:这是什么?
pureQuery是基于Eclipse的可插入组件,可与Eclipse集成开发环境(IDE)无缝集成。 它自动提供用于将关系数据作为对象进行管理的设计和运行时方法。 该设计为开发人员提供了一种指定数据库连接的方法(例如,使用DB2®),从而使Eclipse Java项目能够了解底层的数据库工件(例如表,存储过程等)。 一旦完成所有数据库工件的连接和自动发现,用户就可以通过GUI直观地将任何基础关系表实体转换为Java对象。 这是通过自动生成相关SQL语句以及自动创建封装这些语句的父Java对象来实现的。 可以在具有完全集成SQL和Java编辑功能的自然Eclipse IDE编程环境中进一步定制生成的Java对象和包含SQL语句。
SQL与Java编辑器之间的紧密集成提供了所需的编程效率,并提供了无缝的设计时间体验,并且与编写Java代码一样易于使用SQL编码。 编辑器集成包括通过设计时编译,内容辅助,语法着色以及Java内部的动态和选择性SQL执行来完全支持的语义和语法验证,其中错误的标记方式与错误窗格中的Java错误相同。
此外,在设计和运行时之间进行紧密集成的握手使在设计时运行SQL语句成为可能。 考虑使用的任何主机变量和参数,预览结果集以及自动回滚SQL语句的执行可能引起的任何副作用。
此外,还可以通过启动Visual Explain对设计时的选定SQL语句进行性能分析,从而提供查询请求的优化程序实现的图形表示。 查询请求被分解成各个组件,每个组件的图标代表每个唯一组件。 Visual Explain还包括有关查询优化器考虑和选择的数据库对象的信息。 Visual Explain对查询实现的详细表示使从集成SQL-Eclipse Java编辑器内部更容易理解在设计时全部发生最大成本的地方。
pureQuery对象化过程
pureQuery系统提供了三种不同的方式来将关系访问层自动转换为基于对象的模型。
- 数据库驱动的对象化(DDO):
pureQuery的最常见用法是选择一个表并生成用于数据访问和操作的对象,否则称为CRUD(创建,替换,更新,删除)。 这是pureQuery生成在选定表上执行CRUD操作所需的基于OO的类和接口的地方。 它还会生成一个特殊的类,该类可用于对创建的对象进行单元测试。 实际上,这是一个表到Java的转换,其中基于底层表的特征生成以Java为中心的CRUD操作。 我们将在“ 快速浏览 ”部分中对此进行更详细的讨论。 - 查询驱动的对象化(QDO):
通常情况下,构建应用程序的过程源于拥有一组数据库查询语句(即SQL)。 在这种情况下,需要根据现有查询语句创建对象层次结构,而这些查询语句又可以用于构建基础应用程序。 实际上,这是一个SQL到Java的转换,其中Query语句被无缝转换为以Java为中心的对象。 通过对查询语句进行简单的点击选择并通过弹出的上下文菜单以直观的GUI方式,pureQuery系统可以很容易地被要求生成相关的对象类层次结构。 该系统实质上利用了通过解析查询语句而获得的元数据(如果适用,还可以通过其从其基础数据库连接维护的元数据)来自动生成所需的对象类。 - 对象关系映射(ORM):
在某些情况下,可以使用表示关系表的bean类,但是该类与数据库中所需表之间的实际链接不存在。 pureQuery通过其丰富的内容辅助基础结构提供了一种直观的机制,可以将类名与驻留在基础数据库中的给定表名进行一对一映射,并具有映射类的受保护(或公共)变量的功能到该表的列。 实际上,这是Java到SQL的转换,其中以Java为中心的实体无缝转换为基于SQL的CRUD操作。
在某些情况下,存在具有所有必需的关系映射元数据的给定Bean类,但是缺少映射到其的基础物理表。 pureQuery提供了直观的UI手段,可以从Bean类派生并生成所需的DDL语句,以创建所需的基础数据库构件(即表和列)。
快速浏览
以下各节通过DDO流程检查pureQuery的最常见用法,然后浏览pureDO对象化过程一节中先前介绍的QDO和ORM流程。 最后,将提供pureQuery与Eclipse Java编辑器的紧密集成及其提供的增值功能的概述。 这将包括设计和运行时之间的握手,以测试SQL语句的运行。
在尝试以下方案之前,请确保已安装以下组件:
- DB2Linux®,UNIX®和Windows®版本8.0或更高版本以及安装随附的SAMPLE数据库
- 开发人员工作台9.5版
- pureQuery插件版本1.0
下载DB2和IBM Viper Developer V9.5 Open Beta(Developer Workbench和pureQuery插件的源代码)的链接位于本文的“ 相关主题”部分。
数据库驱动的对象化(DDO)案例方案
在本节中,我们研究了一个简单的员工场景,其目标是在OO范式中以编程方式访问和操纵员工数据。
在以下步骤中,您将创建一个支持pureQuery的Java项目,该项目将DB2 SAMPLE数据库中的Employee表转换为一个对象模型,该对象模型又可以在任何Java应用程序中以自然的,面向对象的方式使用。
使用pureQuery开发数据库应用程序的设计模式包括以下基本步骤:
- 创建一个Eclipse Java项目
- 将Java项目附加到数据库连接
- 通过auto-pureQuery代码生成,将基础连接中的任何给定数据库表工件转换为Java对象
- 通过直观的编辑,测试运行和调试进一步定制
步骤1.在Eclipse IDE中创建一个Java项目
创建Java项目时,请确保已创建源文件夹和bin文件夹。 将项目命名为“ Personnel”。
步骤2.使您的Personnel Java项目pureQuery启用
- 用鼠标右键选择Personnel Java项目,然后从菜单中选择Add pureQuery Support 。
图1. pureQuery启用您的Eclipse Java项目
要查看此文件的较大版本,请单击此处 。
这将启动“添加pureQuery支持”向导,您可以使用该向导为Java项目启用pureQuery。
- 向导的第一页包含常规选项。 您可以保留默认值。 最重要的是,确保已选中将所需的pureQuery JAR文件导入项目旁边的复选框。 这是因为pureQuery具有自己的特定设计和运行时JAR文件,这些文件必须包含在Java项目中。
图2.添加pureQuery支持向导:pureQuery常规选项页面
单击“ 下一步”转到“添加pureQuery支持”向导的下一页 。
- 接下来,创建数据库连接。 此页面显示所有发现的数据库连接。 在这里,从列表中选择一个。 如果没有现有连接,向导将指导您创建一个新连接。 对于此示例,选择Employee表所在的SAMPLE数据库。
图3.添加pureQuery支持向导:pureQuery数据库连接页面
- 单击“ 完成”按钮以关闭向导并启用PureQuery启用Personnel Java项目。
步骤3.将关系工件转换为Java对象并自动生成pureQuery代码
建立数据库连接后,Java项目即可识别数据库。 这将导致在IDE的Database Explorer树形视图中自动显示该特定连接的所有数据库工件,如图4所示。
图4.数据库浏览器填充了SAMPLE数据库中的所有工件
要查看此文件的较大版本,请单击此处 。
pureQuery的功能在于自动生成所需代码的能力,以便将任何基础关系数据库表工件转换为Java对象。 只需选择所需的数据库工件并启动pureQuery Code Generation向导即可完成。
请按照以下步骤将关系工件转换为Java对象并自动生成pureQuery代码:
- 对于此示例,从数据库浏览器树视图中选择Employee表节点,然后在该节点上单击鼠标右键,如图5所示。
图5.将Employee表转换为Java对象:自动生成pureQuery代码
要查看此文件的较大版本,请单击此处 。
- 从弹出菜单中,选择“ 生成pureQuery代码”选项。 这将启动Generate pureQuery Code向导,如图6所示。
图6. pureQuery代码生成向导
- 指定“ Java Bean常规”选项。
为表向导生成pureQuery Code的第一页, 如图6所示,由用于描述代表Employee表的bean类的属性组成。 您可以保留默认值。 让我们检查一些属性:
- 源文件夹 :此字段指定所有生成的Java文件将物理驻留的位置。 您可以将默认值保留为: Personnel / Src 。
- 名称 :此字段表示生成的Java Bean的名称。 缺省情况下,该Bean的名称将与在数据库浏览器中为其请求pureQuery代码生成的所选数据库表工件(在这种情况下为Employee表)相同。 您可以更改名称,结果将是最终生成的文件中的注释,以指示Bean和相应的数据库表工件之间的映射。
对于此示例,将名称更改为MyEmployee 。 生成的注释将是:
@Table(name="EMPLOYEE", schema="DB2ADMIN")
- 为表生成带注释的方法接口 :这将导致生成包含数据库Create / Update / Delete / Insert方法的Interface文件。 从本质上讲,这些方法促进了数据库行的对象化,如第1.0节所述。 构建项目时,还将生成带有所有必需SQL语句的该接口的默认实现。 请注意,可以选择更改默认接口名称。
- 为表的带注释方法的接口生成测试类 :这将导致生成一个特殊的类,该类可用于bean接口的单元测试。 (可选)可以更改测试类名称。
- 生成内联方法样式的测试类 :这将导致生成包含显式内联SQL语句的文件,否则默认情况下将作为接口实现的方法生成该文件。 简化的API提供了使用SQL查询不同数据源的一致方法。 可以将应用程序配置为静态运行数据库SQL,而无需更改编程或用户体验。 (可选)可以更改测试类的名称。
- 请注意,在上述两种情况下,都可以选择选中“ 生成JUnit测试用例”复选框,要求系统自动生成一组JUnit测试实例。
- 包括连接信息和用户名 :此选项将导致在所有生成的测试类中包括连接字符串和用户名。
- 指定如何定义生成的bean变量。
在向导的第二页(如图7所示)中,您可以选择指定是生成公共字段还是受保护字段,并使用或不使用公共访问器方法。
图7.用于定义bean字段的pureQuery代码生成
您还可以选择更改bean变量名称的名称(默认情况下,其设置与Employee表的列相同)。 请注意,将为每个变量名称(与其各自的映射列名称不同)生成一个特殊注释。 注释将采用以下形式:
@Column(name="name of the table column")
并在变量声明之前。 例如,在这种特殊情况下,将Bean字段名称firstnme的名称更改为firstnme_new 。 在java文件中声明之前生成的注释将是:
@Column(name="FIRSTNME") protected string firstnme_new
与表列名称不同的所有其他变量名称都将发生相同的情况(请参见图9 )。
对于此示例,请确保选中了带有公共访问器方法的受保护字段 。 (可选)您也可以将变量类型名称更改为与其映射列数据类型不同的名称。
- 指定要生成的不同类型SQL语句。
在向导的最后一页(请参见图8),您可以选择选择要生成SQL语句的不同样式。 对于此示例,请选择“ 生成所有SQL语句” 。
图8.生成的各种SQL语句
- 单击完成以生成pureQuery代码。
单击“完成”按钮后,向导将除了以下五个主要文件之外,还会生成一个实用程序包,这些文件可以完成DDO流程,如前面在pureQuery objectization process一节中所述。 让我们检查一下生成的工件包括哪些:
- 构成对象层次结构的文件
- MyEmployee.java (参见图9):这是主要的bean类。 此类包含变量及其各自的访问器方法,这些方法及其1-1映射到Employee表列。
图9.代表Employee表的Java bean类
要查看此文件的较大版本,请单击此处 。
- MyEmployeeData.java (请参见图10):这是抽象数据库访问层以进行数据查询和操作的接口文件。 它包含抽象方法,其唯一实现目的是对基础表执行CRUD操作。
图10. MyEmployeeData.java包含CRUD操作的接口
要查看此文件的较大版本,请单击此处 。
- MyEmployeeDataImpl.java (请参见图11):这是MyEmployeeData接口的默认实现,如前所述。 该实现包含封装所有必需SQL语句以进行数据访问和操作的方法。
请注意:仅当构建项目时,才会生成此文件。 这可以通过在Eclipse IDE主菜单中设置“自动构建”选项来实现,也可以由开发人员手动构建该项目来实现。
图11.具有接口方法实现的类
要查看此文件的较大版本,请单击此处 。
- MyEmployeeDataTest.java (请参见图12):这是pureQuery系统生成的默认类,可以选择将其用于单元测试。 它包含一个静态的main函数,从本质上讲,它练习实现类(即MyEmployeeDataTest.java)中所有方法的运行。
图12.这个生成的类可用于单元测试
要查看此文件的较大版本,请单击此处 。
- MyEmployeeInLineSample.java (请参见图13):仅在以下情况下才生成此文件:-仅当-选中了使用内联方法调用语法生成样本类选项。 本质上,这是通过pureQuery的运行时API使用内联样式方法调用来练习所有生成SQL语句的运行。
图13.自动生成的测试类以执行嵌入式生成SQL语句
要查看此文件的较大版本,请单击此处 。
- MyEmployee.java (参见图9):这是主要的bean类。 此类包含变量及其各自的访问器方法,这些方法及其1-1映射到Employee表列。
- 工具包
除了上一节中生成的文件之外,pureQuery系统还生成一个实用程序包,该实用程序包包含一个名为SampleUtil.java的文件(请参见图14)。 该文件包含许多通用静态实用程序功能(例如获得连接,打印等),例如,生成的测试类(即MyEmployeeDataTest.java)将使用这些功能来打印输出结果并创建基础数据库连接。
图14.自动生成的示例类包含许多通用的静态实用程序函数
要查看此文件的较大版本,请单击此处 。
查询驱动的对象化(QDO)案例方案
给定一个或多个SQL语句,pureQuery提供了一种直观的方法来自动为关系数据访问层创建对象层次结构。 下面的分步介绍将说明pureQuery在仅提供SQL语句的情况下创建对象模型的功能。
- 打开与DDO用例场景上一节中创建的Eclipse Java Personnel项目相同的项目。
- 向项目中添加一个新的Java文件类,并在Main方法中包含以下SQL语句:
SELECT BIRTHDATE, BONUS, COMM, EDLEVEL, EMPNO, FIRSTNME, HIREDATE, JOB, LASTNAME, MIDINIT, PHONENO, SALARY, SEX, WORKDEPT from EMPLOYEE
- 用鼠标右键单击SQL语句中的任意位置,然后从弹出的上下文菜单中选择pureQuery Assist-> Generate SQL Bean选项。 这将导致启动“ 为SQL结果集创建Bean”向导。
图15.从SQL语句创建一个bean
要查看此文件的较大版本,请单击此处 。
- 在第一页上,指定要生成的Bean类的名称。 在这种情况下,输入“ MySQLEmployee”,然后单击“ 下一步”按钮。
图16.指定要从SQL语句生成的Bean类名称
- 在向导的第二页中,您可以指定如何定义bean字段。 对于此示例,您可以保留默认值。 (可选)您还可以将变量类型名称更改为与其映射列数据类型不同的变量(请参见图17)。
图17.指定bean字段
- 单击完成按钮。 这将生成Bean文件MySQLEmployee.Java。
要创建接口和默认实现文件,可以使用下一节中所示的pureQuery的ORM流程。
对象关系映射(ORM)案例方案
给定一个Java bean类,pureQuery提供了一种直观的机制,可以将该类的成员映射到基础数据库表中的任何给定关系实体。
请注意,设计时间映射需要根据表模式和游戏规则进行 。 例如,即使在设计时可以将数据类型为double的变量映射到XML类型的表列,运行时的后果也是不可预测的,因此会导致错误。 以下示例示例说明了此映射。
- 打开与DDO示例中创建的相同的Eclipse Java Personnel项目。
- 为了说明ORM功能,可以使用现有的bean或Java用户定义的类,该类代表数据库中的表。 在此示例中,我们使用现有的bean,因此删除除MyEmployee.Java之外的所有生成的Java文件。
图18.将bean映射到关系表
要查看此文件的较大版本,请单击此处 。
- 在编辑器中打开MyEmployee.Java类后,在类名称的顶部添加以下注释:
@Table (name = "EMPLOYEE", Schema = "DB2ADMIN")
该注释执行了类名和基础数据库中的表之间的实际映射。
- 在希望对其进行映射的每个字段/变量的顶部添加以下注释。 在此示例中,我们仅映射BIRTHDAY和FIRSTNME字段,因此添加
@Column (name = "BIRTHDAY")
在BIRTHDAY变量名称的顶部,然后@Column (name = "FIRSTNME")
在FIRSTNME变量名的顶部(请参见图19)。图19.注释创建主机变量和表列之间的映射
要查看此文件的较大版本,请单击此处 。
- 现在,用鼠标右键单击编辑器中MyEmployee类内的任何位置,然后从弹出的上下文菜单中选择pureQuery Assist-> Generate pureQuery CODE选项。 如前所述,这将导致启动为表向导生成pureQuery Code,该向导最终将生成与pureQuery相关的代码(包括接口文件,测试类,实现代码,等等)。
请注意,由于Java Bean类已经存在,因此向导的“ Bean字段”页面不会呈现给用户。
pureQuery的内容辅助以及与Java编辑器的紧密集成
pureQuery提供的最强大的功能之一是在单个编辑器中SQL和Java之间的无缝集成。 这种紧密的集成为Java和SQL提供了一套一致的设计时功能,包括代码辅助,语法验证和着色,以及SQL语句的语义验证。
代码协助提供:
- SQL语句完成 ,在此之后键入SQL关键字(例如SELECT)或期望使用运算符的地方,将显示一个上下文窗口,显示完成该语句的可能方式。
图20.语句完成
要查看此文件的较大版本,请单击此处 。
- Content Assist显示与给定的关系工件(例如表,模式等)关联的可能的实体名称的列表,或需要在语句中指定参数的Java主机变量的列表(请参见图21和22)。 。
图21.内容辅助
要查看此文件的较大版本,请单击此处 。
图22.主机变量内容辅助
要查看此文件的较大版本,请单击此处 。
- 快速修复提供了一种内联的动态语法验证机制,该机制可以检测并快速修复诸如拼写错误之类的错误。
图23.快速修复:选择拼写为Selct的关键字
要查看此文件的较大版本,请单击此处 。
- 自动发现数据库定义 (参见图24和25),通过单击任意一个Bean成员名称(例如,映射到的类名称),单击即可快速跳转到数据库浏览器中的数据库定义。表名将跳到数据库资源管理器中的表节点,映射到列名的变量名将跳至数据库资源管理器中的列节点,依此类推。
图24.并点击选择bean类中的成员名称
要查看此文件的较大版本,请单击此处 。
图25.点击选择跳转到数据库浏览器
要查看此文件的较大版本,请单击此处 。
设计和运行时握手
pureQuery设计时功能的最大优势之一在于它能够从编辑器内部动态运行任何给定SQL语句。 此独特功能使具有回滚功能的设计时动态执行SQL语句成为可能。
要在Java编辑器中查看此功能,只需用鼠标右键单击并在生成的任何SQL语句上单击即可。 从上下文菜单中选择pureQuery Assist-> Run SQL (请参见图26)。 这将执行SQL语句,结果集将显示在Eclipse IDE的Data View中(请参见图27)。
图26.单击选择以在设计时运行SQL
要查看此文件的较大版本,请单击此处 。
图27.设计时SQL执行的结果显示在Data View中
要查看此文件的较大版本,请单击此处 。
结论
在这样一个时代,数据及其有效的可访问性是将以数据库为中心的业务应用程序演变为通过Web(或其他方式)交付的纯服务的驱动力,并且为了提高生产率以进行快速的应用程序开发和维护,需要拥有面向对象的基础架构框架从未如此重要。 IBM的pureQuery通过关系访问的无缝直观对象化过程,为Eclipse IDE环境提供了最新的可插拔解决方案,以优化开发人员的生产力和性能。
翻译自: https://www.ibm.com/developerworks/data/library/techarticle/dm-0708ahadian/index.html