使用JDBC创建数据库对象(6)
· 一个可视化的数据库程序
为了对我们本章学习的内容进行总结,我们编写一个简单的 GUI 程序,它可以显示数据库的表名、列名和列内容。我们还将包括一个文本区域,您可以在其中键入一 个要对数据库执行的 SQL 查询。在 Companion CD-ROM 上的 \chapter20 子目录中,可以找到本程序(称为 dbFrame.java )所使用的 resultSet 和 Database 类。数据库图示"
在本程序中,默认数据库(groceries.mdb)的表名显示在左侧的栏中。当您单击其中一个表名时,列名就会显示在中间的栏中。最后,当您单击中间栏中的某一行时,该行的内容就会显示在右侧的栏中。
本程序的关键只是接收列表选择,然后清除并填充正确的列表框:
public void itemStateChanged(ItemEvent e) { Object obj = e.getSource(); if (obj == Tables) // 放入列名
showColumns(); if (obj == Columns) // 放入列的内容
showData(); } //-- private void loadList(List list, String[] s) { // 清除并填充指定的列表框
list.removeAll(); for (int i=0; i< s.length; i++) list.add(s[i]); } //-- private void showColumns() { // 显示列名
String cnames[] = db.getColumnNames(Tables.getSelectedItem()); loadList(Columns, cnames); } //-- private void showData() { String colname = Columns.getSelectedItem(); String colval = db.getColumnValue(Tables.getSelectedItem(), colname); Data.setVisible(false); Data.removeAll(); Data.setVisible(true); colval = db.getNextValue(Columns.getSelectedItem()); while (colval.length()>0) { Data.add(colval); colval = db.getNextValue(Columns.getSelectedItem()); } } |
· 执行查询
显示画面底部的文本区域使您可键入所需的任何 SQL 查询。演示程序中构建的一个查询如下所示:
String queryText = "SELECT DISTINCTROW FoodName, StoreName, Price "+ "FROM (Food INNER JOIN FoodPrice ON "+ "Food.FoodKey = FoodPrice.FoodKey) " + "INNER JOIN Stores ON "+ "FoodPrice.StoreKey = Stores.StoreKey "+ "WHERE (((Food.FoodName)=\'Oranges\')) "+ " ORDER BY FoodPrice.Price;"; | 此查询简单地列出每个杂货店的桔子价格。
当您单击 Run Query 按钮时,它将执行此查询,并将resultSet对象传送给一个对话框进行显示:
public void actionPerformed(ActionEvent e) { Object obj = e.getSource(); if (obj == Quit) System.exit(0); if (obj == Search) clickedSearch(); } //-- private void clickedSearch() { resultSet rs = db.Execute(query.getText()); String cnames[] = rs.getMetaData();
queryDialog q = new queryDialog(this, rs); q.show(); } |
· 查询结果对话框
查询对话框获得 resultSet 对象,并将每一行放入一个 String 数组中,然后将这些 String 数组放入一个 Vector 中,这样就可以在 paint() 子程序运行期间快速访问这些行。
private void makeTables() { // 将每一行放入一个 String 数组中,并将
// 这些字符串数组全部放入一个 Vector 中
tables = new Vector(); String t[] = results.getMetaData(); tables.addElement( t); while (results.hasMoreElements()) tables.addElement(results.nextElement()); } |
我们通过 Graphics 的 drawString() 方法将数据绘制在一个 Panel 中。就像在 Printer 对象中一样,我们必须自己跟踪 x 和 y 的位置。
public void paint(Graphics g) { String s[]; int x=0; // 计算字体的高度
int y =g.getFontMetrics().getHeight(); // 估算列的高度
int deltaX = (int)1.5f* (g.getFontMetrics().stringWidth("wwwwwwwwwwwwww")); // 遍历表矢量
for (int i=0; i< tables.size(); i++) { s = (String[])tables.elementAt(i); // 绘制字符串数组中的每一行
for (int j =0; j< s.length; j++) { String st= s[j]; g.drawString(st, x, y); x += deltaX; // 移到下一列
} x = 0; // 开始一个新行
y += g.getFontMetrics().getHeight(); // 列标签与列数据之间的额外空间
if (i == 0) y += g.getFontMetrics().getHeight(); } } | · 小结
在本文中,我们讨论了数据库以及检验数据库并对数据库执行查询的方法。我们已经看到, JDBC 提供了一种与平台和数据库无关的、面向对象的方法来访问这些数据,我们还学习了 JDBC 的主要对象: ResultSet 、 ResultSetMetaData 和 DatabaseMetaData 。 在用这些对象编写了一个简单的程序之后,我们设计了更高级别的 resultSet 和 Database 对象,我们用它们构建了一个简单的可视化界面来显示数据库信息。
如果您熟悉数据库的强大功能,就会认识到SQL语言可使您执行比我们此处所述操作更强大的任务。例如,您可以创建新表、添加、更改或删除表的行、列或单个表元。使用JDBC,所有这一切都变得通用和易于处理。
如果您使用的是特定平台的数据库驱动程序,如JDBC-ODBCBridge,则您在编写应用程序时会受到限制,因为applet不能连接在另一台计算机上运行的这个桥。其他客户机-服务器数据库,如IBM的DB2,允许您使用applet中的JDBC与其连接。
|