使用JDBC将数据抽取到XML中

来源:互联网 发布:如何从零开始学编程 编辑:程序博客网 时间:2024/06/02 11:27
什么是 JDBC?第 1 页(共7 页)



如果您已经阅读了“使用 JDBC 将 XML 中的数据插入到数据库”教程,就可以跳到 SELECT 语句剖析。)

在不久以前,为了与数据库交互,开发人员必须使用那个数据库的特定 API。这意味着创建一个独立于数据库的应用程序十分困难(如果可能的话)。

JDBC 与 ODBC(或“开放数据库连接”)类似:它提供一个标准的 API 中间层以访问数据库。正如您在左边所看到的,可以使用标准的 JDBC 命令,JDBC 驱动程序将它们转换成数据库自身的 API。

本教程中从没有提及某一特定数据库,因为选择哪一数据库在很大程度上是没有关系的。所有命令都是标准的 JDBC 命令,它们由驱动程序转换成您选择的任一数据库自身的命令。由于这种 API 的独立性,您可以轻松地使用另一个数据库,而不必更改您应用程序中除驱动程序名和可能的连接 URL(在创建连接时将使用)之外的任何东西。

有关下载适合于您的数据库的 JDBC 驱动程序的信息,请参阅参考资料。有超过 150 个 JDBC 驱动程序可以使用,几乎覆盖了每一种数据库。

甚至没有可用的 JDBC 驱动程序的数据库也可以选择。

JBDC-ODBC 桥第 2 页(共7 页)

只要有了 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 名称,因为您将在创建连接时用到它。

设置数据库和驱动程序第 3 页(共7 页)

首先,确保安装和运行了您选择的任一数据库,并且驱动程序可用。可以从 http://industry.java.sun.com/products/jdbc/drivers 下载 JDBC 驱动程序。

一旦创建了数据库,则创建必要的表。本教程只使用一个表 products。它的结构如左边所示。使用适合于您的数据库的步骤来创建表。

请注意:在通常情况下,应该至少在两个相关的表中表示这个数据;但为简单性起见,本示例只使用一个表。

 


访问数据库的过程第 4 页(共7 页)

使用 Java 语言与数据库交互通常由以下几步组成:

  1. 装入数据库驱动程序。这可以是一个 JDBC 驱动程序或 JDBC-ODBC 桥。
  2. 创建至数据库的 Connection
  3. 创建一个 Statement 对象。该对象实际执行 SQL 或存储过程。
  4. 创建一个 ResultSet,然后用执行查询的结果填充(如果目标是检索或直接更新数据)。
  5. ResultSet 检索或更新数据

作为“JavaTM 2 SDK 标准版”发行的一部分,java.sql 包包含用于访问数据库的“JDBC 2.0 核心 API”。作为“Java 2 SDK 企业版”一部分发行的 javax.sql 包包含“JDBC 2.0 可选包 API”。

本教程仅使用“JDBC 2.0 核心 API”中的类。

实例化驱动程序第 5 页(共7 页)

要访问数据库,首先装入 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 特性表或者为空或者以您期望的驱动程序开始。

创建连接第 6 页(共7 页)

成功装入驱动程序之后,应用程序可以连接到数据库。

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());      }   }}

一旦成功创建了连接,就可以执行任何需要的数据库操作(例如,插入或更新数据)。


 


关闭连接第 7 页(共7 页)

因为 StatementConnection 是对象,所以 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 块。


 

 

原创粉丝点击