您现在的位置: 中国男护士网 >> 考试频道 >> 计算机等级 >> 二级辅导 >> JAVA >> 辅导 >> 正文    
  使用JDBC创建数据库对象(6) 【注册男护士专用博客】          

使用JDBC创建数据库对象(6)

www.nanhushi.com     佚名   不详 

  使用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与其连接。

 

文章录入:杜斌    责任编辑:杜斌 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     

    联 系 信 息
    QQ:88236621
    电话:15853773350
    E-Mail:malenurse@163.com
    免费发布招聘信息
    做中国最专业男护士门户网站
    最 新 热 门
    最 新 推 荐
    相 关 文 章
    没有相关文章
    专 题 栏 目

      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)                            【进男护士社区逛逛】
    姓 名:
    * 游客填写  ·注册用户 ·忘记密码
    主 页:

    评 分:
    1分 2分 3分 4分 5分
    评论内容:
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。