按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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();