如果您已经阅读了“使用 JDBC 将 XML 中的数据插入到数据库”教程,就可以跳到 SELECT 语句剖析。)
在不久以前,为了与数据库交互,开发人员必须使用那个数据库的特定 API。这意味着创建一个独立于数据库的应用程序十分困难(如果可能的话)。
JDBC 与 ODBC(或“开放数据库连接”)类似:它提供一个标准的 API 中间层以访问数据库。正如您在左边所看到的,可以使用标准的 JDBC 命令,JDBC 驱动程序将它们转换成数据库自身的 API。
本教程中从没有提及某一特定数据库,因为选择哪一数据库在很大程度上是没有关系的。所有命令都是标准的 JDBC 命令,它们由驱动程序转换成您选择的任一数据库自身的命令。由于这种 API 的独立性,您可以轻松地使用另一个数据库,而不必更改您应用程序中除驱动程序名和可能的连接 URL(在创建连接时将使用)之外的任何东西。
有关下载适合于您的数据库的 JDBC 驱动程序的信息,请参阅参考资料。有超过 150 个 JDBC 驱动程序可以使用,几乎覆盖了每一种数据库。
甚至没有可用的 JDBC 驱动程序的数据库也可以选择。
只要有了 ODBC 驱动程序,数据库就不必有特定的 JDBC 驱动程序;可以使用 JDBC-ODBC 桥来替代。应用程序调用桥,桥将命令转换成 ODBC,然后 ODBC 驱动程序再将它们转换成数据库自身的 API。
JDBC-ODBC 桥不是推荐的访问数据库的方式,这涉及到性能和配置两方面原因 ― 命令必须通过两个 API,并且必须在每台客户机上安装和配置 ODBC 驱动程序 ― 但是如果没有纯 JDBC 驱动程序,也可以用它进行测试和开发。
如果选择使用桥,则通过选择 Start>Settings>Control Panel>ODBC Data Sources
来在 Windows 系统上创建一个“系统数据源名称(System Data Source Name (DSN))”。请记下 DSN 名称,因为您将在创建连接时用到它。
首先,确保安装和运行了您选择的任一数据库,并且驱动程序可用。可以从 http://industry.java.sun.com/products/jdbc/drivers 下载 JDBC 驱动程序。
一旦创建了数据库,则创建必要的表。本教程只使用一个表 products
。它的结构如左边所示。使用适合于您的数据库的步骤来创建表。
请注意:在通常情况下,应该至少在两个相关的表中表示这个数据;但为简单性起见,本示例只使用一个表。
|
使用 Java 语言与数据库交互通常由以下几步组成:
- 装入数据库驱动程序。这可以是一个 JDBC 驱动程序或 JDBC-ODBC 桥。
- 创建至数据库的
Connection 。 - 创建一个
Statement 对象。该对象实际执行 SQL 或存储过程。 - 创建一个
ResultSet ,然后用执行查询的结果填充(如果目标是检索或直接更新数据)。 - 从
ResultSet 检索或更新数据。 作为“JavaTM 2 SDK 标准版”发行的一部分,java.sql 包包含用于访问数据库的“JDBC 2.0 核心 API”。作为“Java 2 SDK 企业版”一部分发行的 javax.sql 包包含“JDBC 2.0 可选包 API”。 本教程仅使用“JDBC 2.0 核心 API”中的类。
要访问数据库,首先装入 JDBC 驱动程序。在任何给定的时间都可以使用一些不同的驱动程序;由 DriverManager 通过尝试创建与每个所知的驱动程序的连接来确定要使用哪一个。应用程序将使用第一个成功连接的驱动程序。DriverManager 有两种方法可以知道驱动程序是否存在。 第一种方法是使用 Class.forName() 直接装入它,如本示例中所示。当装入驱动程序类时,它向 DriverManager 注册,如下所示: public class Pricing extends Object {
public static void main (String args[]){
//For the JDBC-ODBC bridge, use
//driverName = "sun.jdbc.odbc.JdbcOdbcDriver"
String driverName = "JData2_0.sql.$Driver";
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
System.out.println("Error creating class: "+e.getMessage());
}
}
}
成功装入驱动程序之后,应用程序可以连接到数据库。 DriverManager 可以找到驱动程序的第二种方法是对在 sql.drivers 系统特性表中发现的任何驱动程序进行循环。sql.drivers 特性表是由一个冒号分开的潜在驱动程序列表。在动态装入类之前总是先检查该列表,因此如果要使用特定驱动程序,请确保 sql.drivers 特性表或者为空或者以您期望的驱动程序开始。
成功装入驱动程序之后,应用程序可以连接到数据库。 DriverManager 通过静态 getConnection() 方法进行连接,该方法以数据库的 URL 作为自变量。URL 通常被引用为: jdbc:<sub-protocol>:databasename
然而,还可以用活动驱动程序理解的任何格式编写引用 URL。有关 URL 的格式,请参考您的 JDBC 驱动程序文档。 涉及到子协议的一种情况是通过 ODBC 连接。如果直接通过 ODBC 访问 DSN 为 pricing 的样本数据库,则 URL 可能是: odbc:pricing
这意味着要通过 JDBC 连接,URL 可能是: jdbc:odbc:pricing
下面创建了实际的连接: import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Pricing extends Object {
public static void main (String args[]){
//For the JDBC-ODBC bridge, use
//driverName = "sun.jdbc.odbc.JdbcOdbcDriver"
//and
//connectURL = "jdbc:odbc:pricing"
String driverName = "JData2_0.sql.$Driver";
String connectURL = "jdbc:JDataConnect://127.0.0.1/pricing";
Connection db = null;
try {
Class.forName(driverName);
db = DriverManager.getConnection(connectURL);
} catch (ClassNotFoundException e) {
System.out.println("Error creating class: "+e.getMessage());
} catch (SQLException e) {
System.out.println("Error creating connection: "+e.getMessage());
}
}
}
一旦成功创建了连接,就可以执行任何需要的数据库操作(例如,插入或更新数据)。
|
因为 Statement 和 Connection 是对象,所以 Java 将对它们进行垃圾收集处理,释放它们占用的数据库资源。这可能会使您误认为无需去关闭这些对象,但实际不是这样。 Java 应用程序本身拥有大量可用资源是完全有可能的,这意味着很少进行垃圾收集。还有一种可能,虽然 Java 应用程序拥有大量资源,但可用的数据库资源却是有限的。很多数据库资源都可能由 Java 对象占用,而应用程序是本可以轻易关闭这些对象的。 不管是否有错误,确保关闭这些对象很重要,因此要向已有的 try-catch 块添加一个 finally 块: ...
Connection db = null;
try {
Class.forName(driverName);
db = DriverManager.getConnection(connectURL);
} catch (ClassNotFoundException e) {
System.out.println("Error creating class: "+e.getMessage());
} catch (SQLException e) {
System.out.println("Error creating connection: "+e.getMessage());
} finally {
System.out.println("Closing connections...");
try {
db.close();
} catch (SQLException e) {
System.out.println("Can't close connection.");
}
}
}
}
令人啼笑皆非的是,close() 方法本身可以抛出一个 SQLException ,因此它需要自己的 try-catch 块。
| |