友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

Java编程思想第4版[中文版](PDF格式)-第136部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!


的。  

  

2。 步骤2:配置数据库  

同样地,我们只限于在 32 位 Windows 环境中工作;您可能需要研究一下自己的操作系统,找出适合自己平台 

的配置方法。  

首先打开控制面板。其中可能有两个图标都含有“ODBC ”字样,必须选择那个“32 位ODBC ”,因为另一个是 

为了保持与 16位软件的向后兼容而设置的,和JDBC 混用没有任何结果。双击“32 位ODBC ”图标后,看到的 

应该是一个卡片式对话框,上面一排有多个卡片标签,其中包括“用户DSN”、“系统DSN”、“文件DSN” 

等等。其中,“DSN”代表“数据源名称”(Data Source Name)。它们都与JDBC…ODBC 桥有关,但设置数据 

库时唯一重要的地方“系统DSN”。尽管如此,由于需要测试自己的配置以及创建查询,所以也需要在“文 

件DSN”中设置自己的数据库。这样便可让Microsoft Query 工具(与Microsoft Office 配套提供)正确地 

找到数据库。注意一些软件公司也设计了自己的查询工具。  

最有趣的数据库是我们已经使用过的一个。标准ODBC 支持多种文件格式,其中包括由不同公司专用的一些格 

式,如 dBASE。然而,它也包括了简单的“逗号分隔ASCII”格式,它几乎是每种数据工具都能够生成的。就 

目前的例子来说,我只选择自己的“people”数据库。这是我多年来一直在维护的一个数据库,中间使用了 

各种联络管理工具。我把它导出成为一个逗号分隔的ASCII 文件(一般有个。csv 扩展名,用 Outlook  

Express 导出通信簿时亦可选用同样的文件格式)。在“文件DSN”区域,我按下“添加”按钮,选择用于控 

制逗号分隔 ASCII 文件的文本驱动程序(Micr osoft Text Driver),然后撤消对“使用当前目录”的选择, 

以便导出数据文件时可以自行指定目录。  

大家会注意到在进行这些工作的时候,并没有实际指定一个文件,只是一个目录。那是因为数据库通常是由 

某个目录下的一系列文件构成的(尽管也可能采用其他形式)。每个文件一般都包含了单个“数据表”,而 

且SQL 语句可以产生从数据库中多个表摘取出来的结果(这叫作“联合”,或者 join )只包含了单张表的数 



                                                                   578 


…………………………………………………………Page 580……………………………………………………………

据库(就象目前这个)通常叫作“平面文件数据库”。对于大多数问题,如果已经超过了简单的数据存储与 

获取力所能及的范围,那么必须使用多个数据表。通过“联合”,从而获得希望的结果。我们把这些叫作 

 “关系型”数据库。  

  

3。 步骤3:测试配置  

为了对配置进行测试,需用一种方式核实数据库是否可由查询它的一个程序“见到”。当然,可以简单地运 

行上述的JDBC 示范程序,并加入下述语句:  

Connection c = DriverManager。getConnection(  

dbUrl; user; password);  

若掷出一个违例,表明你的配置有误。  

然而,此时很有必要使用一个自动化的查询生成工具。我使用的是与Microsoft Office 配套提供的 

Microsoft Query,但你完全可以自行选择一个。查询工具必须知道数据库在什么地方,而Microsoft Query 

要求我进入 ODBC Administrator 的“文件DSN”卡片,并在那里新添一个条目。同样指定文本驱动程序以及 

保存数据库的目录。虽然可将这个条目命名为自己喜欢的任何东西,但最好还是使用与“系统DSN”中相同 

的名字。  

做完这些工作后,再用查询工具创建一个新查询时,便会发现自己的数据库可以使用了。  

  

4。 步骤4:建立自己的SQL 查询  

我用Microsoft Query 创建的查询不仅指出目标数据库存在且次序良好,也会自动生成 SQL 代码,以便将其 

插入我自己的Java 程序。我希望这个查询能够检查记录中是否存在与启动Java 程序时在命令行键入的相同 

的“姓”(Last Name)。所以作为一个起点,我搜索自己的姓“Eckel”。另外,我希望只显示出有对应E

mail 地址的那些名字。创建这个查询的步骤如下:  

(1) 启动一个新查询,并使用查询向导(Query Wizard)。选择“people”数据库(等价于用适应的数据库 

URL 打开数据库连接)。  

(2) 选择数据库中的“people”表。从这张数据表中,选择FIRST,LAST 和 EMAIL 列。  

(3) 在“Filter Data”(过滤器数据库)下,选择LAST,并选择“equals”(等于),加上参数Eckel。点 

选“And”单选钮。  

(4) 选择EMAIL,并选中“Is not Null”(不为空)。  

(5) 在“Sort By”下,选择FIRST。  

查询结果会向我们展示出是否能得到自己希望的东西。  

现在可以按下SQL 按钮。不需要我们任何方面的介入,正确的 SQL 代码会立即弹现出来,以便我们粘贴和复 

制。对于这个查询,相应的SQL 代码如下:  

  

SELECT people。FIRST; people。LAST; people。EMAIL  

FROM people。csv people  

WHERE (people。LAST='Eckel') AND   

(people。EMAIL Is Not Null)  

ORDER BY people。FIRST  

  

若查询比较复杂,手工编码极易出错。但利用一个查询工具,就可以交互式地测试自己的查询,并自动获得 

正确的代码。事实上,亲手为这些事情编码是难以让人接受的。  

  

5。 步骤5:在自己的查询中修改和粘贴  

我们注意到上述代码与程序中使用的代码是有所区别的。那是由于查询工具对所有名字都进行了限定,即便 

涉及的仅有一个数据表(若真的涉及多个数据表,这种限定可避免来自不同表的同名数据列发生冲突)。由 

于这个查询只需要用到一个数据表,所以可考虑从大多数名字中删除“people”限定符,就象下面这样:  

  

SELECT FIRST; LAST; EMAIL  

FROM people。csv people  

WHERE (LAST='Eckel') AND   

(EMAIL Is Not Null)  



                                                                             579 


…………………………………………………………Page 581……………………………………………………………

ORDER BY FIRST  

  

此外,我们不希望“硬编码”这个程序,从而只能查找一个特定的名字。相反,它应该能查找我们在命令行 

动态提供的一个名字。所以还要进行必要的修改,并将SQL 语句转换成一个动态生成的字串。如下所示:  

  

〃SELECT FIRST; LAST; EMAIL 〃 +  

〃FROM people。csv people 〃 +  

〃WHERE 〃 +  

〃(LAST='〃 + args'0' + 〃') 〃 +  

〃 AND (EMAIL Is Not Null) 〃 +  

〃ORDER BY FIRST〃);  

  

SQL 还有一种方式可将名字插入一个查询,名为“程序”(Procedures),它的速度非常快。但对于我们的 

大多数实验性数据库操作,以及一些初级应用,用 Java 构建查询字串已经很不错了。  

从这个例子可以看出,利用目前找得到的工具——特别是查询构建工具——涉及SQL 及JDBC 的数据库编程是 

非常简单和直观的。  



15。7。2 查找程序的 GUI 版本  



最好的方法是让查找程序一直保持运行,要查找什么东西时只需简单地切换到它,并键入要查找的名字即 

可。下面这个程序将查找程序作为一个“application/applet ”创建,且添加了名字自动填写功能,所以不 

必键入完整的姓,即可看到数据:  

  

//: VLookup。java  

// GUI version of Lookup。java  

import java。awt。*;  

import java。awt。event。*;  

import java。applet。*;  

import java。sql。*;  

  

public class VLookup extends Applet {  

  String dbUrl = 〃jdbc:odbc:people〃;  

  String user = 〃〃;  

  String password = 〃〃;  

  Statement s;  

  TextField searchFor = new TextField(20);  

  Label pletion =   

    new Label(〃                        〃);  

  TextArea results = new TextArea(40; 20);  

  public void init() {  

    searchFor。addTextListener(new SearchForL());  

    Panel p = new Panel();  

    p。add(new Label(〃Last name to search for:〃));  

    p。add(searchFor);  

    p。add(pletion);  

    setLayout(new BorderLayout());  

    add(p; BorderLayout。NORTH);  

    add(results; BorderLayout。CENTER);  

    try {  

      // Load the driver (registers itself)  

      Class。forName(  

        〃sun。jdbc。odbc。JdbcOdbcDriver〃);  

      Connection c = DriverManager。getConnection(  



                                                                                          580 


…………………………………………………………Page 582……………………………………………………………

        dbUrl; user; password);  

      s = c。createStatement();  

    } catch(Exception e) {  

      results。setText(e。getMessage());  

    }  

  }  

  class SearchForL implements TextListener {  

    public void textValueChanged(TextEvent te) {  

      ResultSet r;  

      if(searchFor。getText()。length() == 0) {  

        pletion。setText(〃〃);  

        results。setText(〃〃);  

        return;  

      }  

      try {  

        // Name pletion:  

        r = s。executeQuery(  

          〃SELECT LAST FROM people。csv people 〃 +  

          〃WHERE (LAST Like '〃 +  

          searchFor。getText()  +   

          〃%') ORDER BY LAST〃);  

        if(r。next())   

          pletion。setText(  

            r。getString(〃last〃));  

        r = s。executeQuery(  

          〃SELECT FIRST; LAST; EMAIL 〃 +  

          〃FROM people。csv people 〃 +  

          〃WHERE (LAST='〃 +   

          pletion。getText() +  

          〃') AND (EMAIL Is Not Null) 〃 +  

          〃ORDER BY FIRST〃);  

      } catch(Exception e) {  

        results。setText(  

          searchFor。getText() + 〃n〃);  

        results。append(e。getMessage());  

        return;   

      }  

      results。setText(〃〃);  

      try {  

        while(r。next()) {  

          results。append(  

            r。getString(〃Last〃) + 〃; 〃   

            + r。getString(〃fIRST〃) +   

            〃: 〃 + r。getString(〃EMAIL〃) + 〃n〃);  

        }  

      } catch(Exception e) {  

        results。setText(e。getMessage());  

      }  

    }  

  }  

  public static void main(String'' args) {  

    VLookup applet = new VLookup();  



                                                                                        581 


…………………………………………………………Page 583……………………………………………………………

    Frame aFrame = new Frame(〃Email lookup〃);  

    aFrame。addWindowListener(  

      new WindowAdapter() {  

        public void windowClosing(WindowEvent e) {  

          System。exit(0);  

        }  

      });  

    aFrame。add(applet; BorderLayout。CENTER);  

    aFrame。setSize(500;200);  

    applet。init();  

    applet。start();  

    aFrame。setVisible(true);  

  }  

} ///:~  

  

数据库的许多逻辑都是相同的,但大家可看到这里添加了一个 TextListener,用于监视在TextField (文本 

字段)的输入。所以只要键入一个新字符,它首先就会试着查找数据库中的“姓”,并显示出与当前输入相 

符的第一条记录(将其置入pletion Label,并用它作为要查找的文本)。因此,只要我们键入了足够的 

字符,使程序能找到与之相符的唯一一条记录,就可以停手了。  



15。7。3 JDBC API 为何如何复杂  



阅览JDBC 的联机帮助文档时,我们往往会产生畏难情绪。特别是DatabaseMetaData接口——与Java 中看到 

的大多数接口相反,它的体积显得非常庞大——存在着数量众多的方法,比如 

dataDefinitionCausesTransactionmit(),getMaxColumnNameLength(),getMaxStatementLength(), 

storesMixedCaseQuotedIdentifiers(),supportsANSI92IntermediateSQL(),supportsLimitedOuterJoins() 

等等。它们有这儿有什么意义吗?  

正如早先指出的那样,数据库起初一直处于一种混乱状态。这主要是由于各种数据库应用提出的要求造成 

的,所以数据库工具显得非常“强大”——换言之,“庞大”。只是近几年才涌现出了SQL 的通用语言(常 

用的还有其他许多数据库语言)。但即便象SQL 这样的“标准”,也存在无数的变种,所以JDBC 必须提供一 

个巨大的DatabaseMetaData 接口,使我们的代码能真正利用当前要连接的一种“标准”SQL 数据库的能力。 

简言之,我们可编写出简单的、能移植的 SQL。但如果想优化代码的执行速度,那么为了适应不同数据库类 

型的特点,我们的编写代码的麻烦就大了。  

当然,这并不是Java 的缺陷。数据库产品之间的差异是我们和JDBC 都要面对的一个现实。但是,如果能编 

写通用的查询,而不必太关心性能,那么事情就要简单得多。即使必须对性能作一番调整,只要知道最终面 

向的平台,也不必针对每一种情况都编写不同的优化代码。  

在Sun 发布的Java 1。1 产品中,配套提供了一系列电子文档,其中有对 JDBC 更全面的介绍。此外,在由 

Hamilton Cattel 和 Fisher 编著、Addison…Wesley 于 1997 年出版的《JDBC Database Access with Java》 

中,也提供了有关这一主题的许多有用资料。同时,书店里也经常出现一些有关JDBC 的新书。  



15。8 远程方法  



为通过网络执行其他机器上的代码,传统的方法不仅难以学习和掌握,也极易出错。思考这个
返回目录 上一页 下一页 回到顶部 1 1
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!