尽管您可能是公司里最好的程序员,但事实上您还是要查阅编程手册,因为您无法记住所有这些编程API。别担心;不是只有您一个人有这个问题。如果您是中等水平的程序员,您可能有着非常繁忙的生活,忙于完成经理交给您的项目,即使他们已完全忘记了交给您什么事情!您开始怀疑您的工作与契约劳役有什么分别。
有时候,有些东西的设计意图是使您的生活稍稍轻松一些。当这些“东西”能够消除我们必须完成的乏味任务时,它们就特别有用。如果您是拿计时工资的,那么我们提前道歉;本文介绍的代码可以让您完成工作稍快一些。
如果有一个简单的、与平台无关的应用程序让您添加、删除和更新 DB2(DB2认证 DB2培训 ) 数据库表中的行而不必临时去知道表名和列名,那难道不好吗?应用程序基本上会可视化地显示您正试图操作的表中的内容。知道吗?我们要您考虑这个问题。
我们这里讲述的SQL实用程序是一个让您能够以直观和易用的方式与IBM DB2 数据库进行交互的应用程序。这个实用程序是与平台无关的,因为它是用基于Java的技术开发的。您将在这个应用程序中看到的GUI是用 Java Swing 组件构建的,并且数据库访问层是用 IBM 提供的 JDBC 2.0 驱动程序构建的。应用程序是用 JDK 1.3.1_02 开发和测试的。
请记住这个简单的工具无法取代 IBM 提供和支持的完整功能的 DB2 Table Editor。我们的工具在功能和作用域方面有限得多,但我们认为它有助于满足某些用户的需要,更不用说它给我们提供了编码 DB2 Java 语言应用程序的有趣练习。
先决条件
JDBC 的能力使这个项目成为可能,JDBC 是通过 Java 编程语言让您与数据库交互的 API。既然提到了 Java,那么应该想到平台无关性的概念。因此,我们介绍的代码可以方便地移植到您选择的平台(AIX、Windows NT等等)。我们在 Windows 2000 环境中编码应用程序。然而,正如您将从使用的代码中看到的那样,我们没有使用与平台有关的技术(例如 ODBC、MFC 等等)。
但是,我们的代码有以下要求:
DB2 通用数据库版本 7.2(也称为带修订包 3 的版本 7.1)。
请确保类路径(classpath)中有用于 DB2 的 JDBC 2.0 驱动程序。这极为重要,因为我们要接入 JDBC 2.0 的一些功能。
此外,需要确保使用的 JDK 支持 Swing。我们使用了许多 Swing 提供的功能来完成一些界面,您将用它们与 DB2 数据库交互。
应用程序概述
如图 1 所示,SQLUtility 应用程序允许您用 IBM DB2 数据库完成四件事情:
● 查看表
● 向表添加行
● 从表删除行
● 更新表

图 1:用 SQLUtility 应用程序可以做什么
最好下载本项目的代码,然后仔细研究它以理解其工作原理。我们已经尽最大努力来注释代码以使您能理解我们所做的工作。我们建议使用一个类似于 IBM VisualAge? for Java 的集成开发环境(IDE),它允许您单步调试代码并掌握应用程序流。
对应用程序的仔细研究
用户在能够查看或更改数据库中的表之前必须得到授权。应用程序的登录阶段(由 LoginDialog.java 实现)验证用户是否得到授权。图 2 显示了您在首次访问该实用程序时会看到的认证对话框。

图 2. 认证对话框
当使用在认证对话框中输入的信息与指定的数据库成功地建立连接时,您就获得了授权。授权代码驻留在 SQLFacade.java 的构造函数中,其中用清单 1 中所示代码建立到数据库的 JDBC 连接。
清单 1. 连接到数据库
if (!username.equals(""))
{
connection =
DriverManager.getConnection(dbURL, username, password);
}
else
{
connection = DriverManager.getConnection(dbURL);
}
如果成功地建立了到指定数据库的连接,就会出现一个类似于图 3 中所示的屏幕。

图 3. 成功认证用户后的 SQLUtility
图 4 显示如何向您呈现数据库中表的列表。

图 4. 用户创建的数据库表的下拉菜单
创建下拉菜单的数据是用 DatabaseMetaData 对象(SQLFacade.java,第 122 行)获取的。
当从下拉菜单选择一个表并单击 Go 按钮时,实用程序会在一个用户友好的表格式视图(如图 5 中所示)中显示数据库表的内容。显示的第一列是行号,它让您方便地标识特定的数据行。使用 GUI,您可以在所选的表中添加行、删除行或对现有行加以更新。

图 5. SQLUtility 显示 TEST 表的内容
添加行
要添加行,请单击 Add Row 按钮。通过 AddRowDialog.java 代码促进了向 DB2 表添加行的能力。单击 Add Row 按钮后,就出现一个带有两列的对话框(如图 6 中所示)。在这个界面中,第一列列出表的列名;第二列是输入数据库表每一列的值的位置。

图 6. 添加新行的 GUI
输入每一列的值并单击 Add New Row后,输入的值临时存储在散列表中,该表的键就是列名。这个信息被传递到方法addRowToDatabase。ResultSetModel.java 的这个方法承担向数据库添加所需的行的任务。
当然,始终存在输入非法数据的可能性。这里的“非法”指的是使用无效字符和向非空列输入空值等行为。当 addRowToDatabase 方法试图添加一个被认为非法的行时,会抛出一个 SQL 异常。因此,添加将不被允许,而且您将看到一个如图 7 中所示的错误。

图 7. 错误对话框
另一方面,如果要在所需行中添加的数据是“合法的”,实用程序会把该行附加到当前的表。结果,GUI 自动被更新(如图 8 所示)。请留意 Tom Little 的新行。

图 8. 添加到 TEST 表的新行
删除行
要删除行,所有您要做的就是单击该行来选择它(如图 9 所示),然后单击 Delete Row。负责从数据库删除行的方法是 deleteRow,可在 ResultSetModel.java 中找到。

图 9. 从 TEST 表删除行
更新现有行
要更新现有的行,选择一个单元(图 10 中选择了姓名Jones),然后输入新值。您可以在多个行中对多个列进行更改。每个编辑过的单元显示为红色。编辑完成后,单击 Update Database 在数据库中进行更新。

图 10. 更新 TEST 表中的多个值
负责进行更新的方法是 updateDatabase,可以在 ResultSetModel.java中找到。这个程序跟踪表中单元所做的更改。当单击 Update Database 时,方法 updateDatabase() 在每个修改的行重复执行,并将更改推送至数据库。正如添加新行时有错误发生会显示一个错误对话框一样,更新现有行时出现错误会显示一个对话框。因为您可能在一次更新中操作多个行,所以对每个有错误的行都会显示一个对话框(请参阅图 11)。

图 11. 对每个更新得不正确的行显示的错误对话框
请注意在错误对话框标题中标识出了行号。有了这个信息,就可以方便地标识一行,因为行号是每行的第一列。
并行性所涉问题:注意我们设置中涉及的并行性问题是重要的。当从数据库检索数据时,我们没有锁定记录。因此,在尝试更新某一行时,可能有另一个用户进入并操作您正在处理的同一行。我们更新一行的方法本质上是在更新前对该行的内容进行快照。然后允许您声明希望更改的内容。然后您告诉数据库您希望更改与快照相似的行。如果与快照相似的行不存在(可能由于竞态条件而发生),那么更新操作将不会执行。有两行与快照的标识相匹配的可能性很小(在设计得很差的数据库模型中)(请参阅限制以了解关于这个问题的更多信息)。
面临的复杂情况
我们使用 IBM 提供的 JDBC 驱动程序开发 SQL Utility 应用程序。遗憾的是,因为我们使用的驱动程序当前不提供可滚动和可更新的 java.sql.ResultSet 实现,所以编码 SQL Utility 应用程序的工作会稍稍麻烦一点。我们必须对整个 ResultSet 对象重复执行并且在本地存储信息,而不是滚动到我们感兴趣的行。这个方法在 ResultSetModel.java 中可见。当然,拥有可滚动的 ResultSet 本来可以使方法 reloadTableModel() 中的所有代码更简单。但是,我们的变通方法可以完成这项工作。
另外,缺少可更新的 ResultSet 实现意味着我们必须创建 SQL Update 查询以更改数据库,而不是使用 jaba.sql.ResultSet 接口的 updateXXX() 方法。因此,在方法 updateDatabase() 中,我们必须动态地生成 SQL 更新语句。
限制:缺少可更新的 ResultSet 还会在我们的实用程序中产生一些限制。要删除或更新一行,该行必须是被唯一标识的。如果有可更新的结果集,这会自动发生。但我们必须自己标识感兴趣的行,而这正是可能遇到问题的地方。我们按以下方法在用于更新或删除的 SQL 查询中标识感兴趣的行。
DELETE from TESTTABLE WHERE col1 = 'value1' AND col2 =
'value2' AND col3='value3'
UPDATE TESTABLE SET col1 = 'new value1' WHERE
col1='value1' AND col2 = 'value2' AND col3='value3'
当数据库表有两行或多行拥有重复数据时,问题就出现了,这导致查询的 WHERE 子句要匹配多行而不是一行。根据我们生成的查询,这会更新或删除所有重复的行。然而,在正确设计的关系数据库中,重复行并不常见。因此,这个“错误”应该很少见。
结束语
DB2 无疑是功能极其强大的数据库。它可以毫无问题地容纳庞大数量的数据。IBM DB2 对许多任务关键商业应用程序起着基础技术的作用。随着越来越多的人使用 DB2,类似我们这里提供的简单工具可以帮助用户以可视方式简单地编辑数据而无需懂得 SQL。即使对于那些真正了解 SQL 的人而言,在处理大量复杂表时,要方便地撰写查询是很困难的。SQL 语句输入起来有时很长而且很乏味。如果忽略了一个单引号,您就有麻烦了。本文的目的是交给您一个能让您的生活更轻松的代码,向您提供能够可视化地操作 DB2 表的实用程序。
可以根据自己的目的修改本文的 Java 代码,但要自己承担使用它的风险。作者或 IBM 对使用本代码所产生的任何后果不承担任何责任。
『引自 IBM DW中国』 |