友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第187章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




插入我自己的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 远程方法  



为通过网络执行其他机器上的代码,传统的方法�
返回目录 上一页 下一页 回到顶部 赞(0) 踩(0)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!