jdbc实现数据库数据提取
我应该学习本教程吗?
本教程旨在帮助需要从数据库提取信息并将其放入XML文档的Java TM开发人员。
本教程假定您已经熟悉Java和XML,特别是文档对象模型(DOM)。 您应该熟悉Java编程,但是不需要掌握使用JDBC TM进行数据库连接的先验知识即可掌握本教程中描述的技术。 本教程简要介绍了SQL的基础知识。 不需要GUI编程知识,因为应用程序输入/输出是从命令行处理的。 中的链接相关主题包括转介到有关XML和DOM基础知识教程和仔细SQL背景资料。
本教程是关于什么的?
XML用于存储数据的效果非常好,以至于不可避免的是,有人会要求您从数据库中提取信息并像对待XML一样来操纵它。 JDBC是使用Java访问数据库的独立于供应商的方法。 本教程说明了如何实例化和使用JDBC驱动程序连接数据库以检索信息。 它还说明了SQL的基础知识,以及如何创建和使用JDBC查询的结果。
本教程的目的是从数据库中提取数据并创建DOM文档。 DOM文档的结构由XML映射文件确定,该文件演示了可将XML文件用于此目的的一种方法。
工具类
即使您阅读示例而不是尝试示例,本教程也将帮助您理解主题。 如果您确实想在阅读本教程时尝试这些示例,请确保已安装以下工具并且工作正常:
- 文本编辑器:XML和Java源文件只是文本。 要创建和阅读它们,只需一个文本编辑器。
- Java环境,例如Java 2 SDK,可从http://java.sun.com/j2se/1.3/获得 。
- 用于XML处理的Java API:也称为JAXP 1.1,这是Sun提供的参考实现。 您可以在Java Web Services Developer Pack 1.1中下载JAXP。
- 只要您具有ODBC 或 JDBC驱动程序,任何可以理解SQL的数据库。 您可以在http://industry.java.sun.com/products/jdbc/drivers中找到包含150多个JDBC驱动程序的可搜索列表。 (如果您有ODBC驱动程序,则可以跳过此步骤,并使用JBDC-ODBC桥 。)本教程使用JDataConnect,可从http://www.jnetdirect.com/products.php?op=jdataconnect获得 。
本教程中使用的约定
在本教程中,有几种用于增强材料的约定:
- 需要输入的文本以
bold monospace
字体显示。 在某些代码示例中,粗体用于引起人们注意所附文本中引用的标签或元素。 - 强调/斜体用于引起对窗口,对话框和特征名称的注意。
-
monospace
字体显示文件名和路径名。 - 在本教程中,与讨论无关的代码段已被省略,并用省略号(
...
)代替...
通过JDBC访问数据库
什么是JDBC?
如果您已经完成了“使用JDBC将XML数据插入数据库中”教程,请随时跳过SELECT语句的剖析 。
不久之前,为了与数据库进行交互,开发人员必须为该数据库使用特定的API。 这使创建与数据库无关的应用程序很困难,即使不是不可能。
JDBC与ODBC(或开放数据库连接)相似,后者提供用于访问数据库的标准API中介。 如左图所示,可以使用标准的JDBC命令,并且JDBC驱动程序将它们转换为数据库的本机API。
在本教程中没有任何地方提到特定的数据库,因为选择基本上无关紧要。 所有命令都是标准的JDBC命令,驱动程序会将其转换为您选择的任何数据库的本机命令。 由于这种API的独立性,您可以轻松地使用其他数据库,而无需更改应用程序中的任何内容,除了驱动程序名称以及可能创建连接时使用的连接URL以外。
请参阅相关主题上下载相应的JDBC驱动程序数据库的信息。 几乎所有数据库都可以使用150多种JDBC驱动程序。
对于没有可用的JDBC驱动程序的数据库,甚至还有一些选项。
图1.没有JDBC驱动程序的数据库示例
JBDC-ODBC桥
只要有ODBC驱动程序,就没有必要为数据库使用特定的JDBC驱动程序。 您可以改用JDBC-ODBC 桥 。 应用程序调用网桥,该网桥将命令转换为ODBC,而ODBC驱动程序将其转换为本地API。
由于各种原因,建议不要使用JDBC-ODBC桥来访问数据库,这涉及性能和配置-命令必须通过两个API传递,并且必须在每个客户端上都安装和配置ODBC驱动程序-但这是可以接受的如果没有可用的纯JDBC驱动程序,则用于测试和开发。
如果选择使用网桥,请通过选择“ Start>Settings>Control Panel>ODBC Data Sources
在Windows系统上创建系统数据源名称(DSN)。 记下DSN的名称,因为在创建连接时将被引用。
图2.具有JDBC和驱动程序的数据库示例
设置数据库和驱动程序
create table products (
product_id numeric primary key,
product_name varchar(50),
base_price numeric,
size numeric,
unit varchar(10),
lower numeric,
upper numeric,
unit_price numeric )
首先,确保选择安装的任何数据库都已安装并正在运行,并且驱动程序可用。 JDBC驱动程序可以从http://industry.java.sun.com/products/jdbc/drivers下载。
创建数据库后,创建必要的表。 本教程仅使用一个表products
。 其结构在左侧。 使用适合您的数据库的步骤创建表。
注意:通常情况下,此数据将分解为至少两个相关表; 为了简单起见,该示例仅代表一个示例。
访问数据库的过程
使用Java与数据库进行交互通常包括以下步骤:
- 加载数据库驱动程序。 这可以是JDBC驱动程序或JDBC-ODBC桥。
- 创建到数据库的
Connection
。 - 创建一个
Statement
对象。 该对象实际上执行SQL或存储过程。 - 创建一个
ResultSet
并用已执行查询的结果填充(如果目标是检索或直接更新数据)。 - 从
ResultSet
检索或更新数据。
java.sql
软件包包含JDBC 2.0 Core API,作为JavaTM 2 SDK Standard Edition发行版的一部分来访问数据库。 作为Java 2 SDK(企业版)的一部分分发的javax.sql
程序包包含JDBC 2.0可选程序包API。
本教程仅使用JDBC 2.0 Core 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对象可能占用了许多数据库资源,而Java对象可能已经很容易被应用程序关闭了。
确保无论是否有任何错误,这些对象都已关闭,这很重要,因此请在已经存在的try-catch
块中添加一个finally
块: