JSP虚拟主机,jsp空间,java空间,java虚拟空间JSP虚拟主机,jsp空间,java空间,java虚拟空间

用JDBC连接数据库



作者:未知    文章来源:www.jspcn.net
发布日期:2005年01月19日
用JDBC访问数据库:
所有的数据库的对象和方法都在java.sql.* 里面,所以首先要import java.sql.*,要想连接数据库,首先要将驱动程序调入。
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");这是JDBC-ODBC 的驱动程序。在JBuilder5.0例子里面有一个用DataStore的例子,调用驱动程序是这样的:Class.forName("com.borland.datastore.jdbc.DataStoreDriver");这个命令调入驱动程序并创建改类的一个实例。
要想连接一个指定的数据库,你必须创建Connection类的一个实例。
String url = "jdbc:odbc:Grocery prices";
Connection con = DriverManager.getConnection(url);
注意你在此用到的数据库名称是你在ODBC设置控制面板中输入的数据资源名。URL语法对于不同类型的数据库会很不一样。
语法是这样的: jdbc:subprotocol:subname
开头都是JDBC,后面是子协议,上例是ODBC,JBuilder5.0中的例子是这样的:jdbc:borland:dslocal:c:/jbuilder5/bin/TEMPORARY.jds 它用的是DataStore
若你正连接一数据库其它机器上的服务器,你还需指定机器和子目录。
jdbc:bark//doggie/elliott
最后,你应指定一用户名和密码作为连接字符串的一部分。
jdbc:bark//doggie/elliot;UID=GoodDog;PWD=woof

访问数据库(转载)
一旦与数据库相连,你可以按表的名称、列的名称和内容索取信息,也可以运行SQL命令查询数据库、添加或修改数据库内容。可用来从数据库获取信息的对象有:
DatabaseMetaData 关于数据库的总体信息:表名、表索引、数据库产品名称和版本、数据库支持的操作。
ResultSet 表或一次查询结果的信息。对数据的访问是逐行的,但对列的访问可采取任何顺序。
ResultSetMetaData 一个ResultSet中列名和类型的信息。

Key Lastname SalaryType   SalaryType Min Max
1 Adams 2   1 30000 45000
2 Johnson 1   2 45000 60000
3 Smyth 3   3 60000 75000
4 Tully 1        
5 Wolff 2        

SalaryType列中的数据指向第二个表。其实还可以有许多类似的表,如所居住的州、各州的税
收、 健康计划代扣款等。每个表都有一个主键列和一些其它的数据列。如何在数据库中创建
表已被认为是一种艺术或科学。这些表的结构由它们的一般形式指定,一共有三种一般形式:
第一、第二、第三一般形式,它们的缩写分别为1NF、2NF、3NF。

1. 表中的每个单一只能有一个值(不能为一组值)。(1NF)

2. 除具有1NF的要求外,所有的非键列完全依赖于键列。也就是说主键和行中其它单元为一一
对应的关系。(2NF)

3. 除具有2NF的要求外,所有非键列间相互独立。也就是说没有能从其它数据列计算出来的值
的数据列。(3NF)

如今,几乎所有的数据库中的表都是第三一般形式(3NF)。这意味着会存在相当数量的表,而
每个表中的信息列会相对较少。

从数据库中获取数据


假设为了某些计划需求,我们要产生一个包含雇员以及他们工资范围的表。这个表在数据库中
并不直接存在,但可以通过对数据库发出一个查询来构造出来。我们有类似于以下这个表的一个表:
:

Name
Min
Max

Adams $45,000.00 $60,000.00
Johnson $30,000.00 $45,000.00
Smyth $60,000.00 $75,000.00
Tully $30,000.00 $45,000.00
Wolff $45,000.00 $60,000.00

或许这个表已按工资的升序排列

Name
Min
Max

Tully $30,000.00 $45,000.00
Johnson $30,000.00 $45,000.00
Wolff $45,000.00 $60,000.00
Adams $45,000.00 $60,000.00
Smyth $60,000.00 $75,000.00

我们发现对包括这些表发出的查询会具有以下的格式

SELECT DISTINCTROW Employees.Name, SalaryRanges.Min,
SalaryRanges.Max FROM Employees INNER JOIN SalaryRanges ON Employees.SalaryKey = SalaryRanges.SalaryKey
ORDER BY SalaryRanges.Min;

这种语言被成为结构化查询语言或SQL(常被读作“sequel”),而且几乎所有的数据库都支持该语言。
近些年来,已为SQL指定了数个标准,绝大多数的PC数据库都支持这些ANSI标准。SQL-92被认为是
最基本的标准,并在随后有数次更新。但是,所有的数据库都不能很好的支持以后版本的SQL,为了
利用独立于自己数据库的不同性能,它们都提供了不同类型的SQL扩展。

数据库的种类

自从PC成为主要的办公室工具,众多的著名数据库都开发了能在PC上运行的版本。它们包括如
Microsoft Works的基本数据库和如Approach、dBase、Borland Paradox、Microsoft Access 和
FoxBase比较复杂的数据库。

另一类型的PC数据库包括由PC客户端访问服务器端的数据库,其中有IBM DB/2、Microsoft SQL
Server、Oracle、Sybase、SQLBase和XDB。这些数据库产品都支持一些不同的相对简单的SQL命令,
而且这些命令似乎都是可以互换的。它们事实上不可互换的原因在于它们是为不同的性能特点所设计
的而且每种都具有不同的用户界面和编程界面。或许你会认为既然它们都支持SQL,对它们的编程也
会是及其相似的。但实事正好相反,因为每个数据库都有各自不同的接收SQL查询和返回结果的方式。
这也是下一个标准级别ODBC出现的原因。

ODBC

如果编写的代码能独立于个别销售商的数据库,而且不用修改便可以从不同的数据库中获得相同的结
果,那将是最理想的。若我们将所有的数据库都做某些封装,使得这些数据库具有相同的编程接口,
上面的要求就很容易实现了。

1992年,Microsoft发布了一个名为《对象数据库连接》的规范,这也意味着这一目标的首次实现。
它被用来解决对Windows环境下的所有数据库连接的支持。如同所有软件的第一个版本,它也受到了
越来越多的问题的困扰。1994年发行了另一个版本,这一版本相对来说更快且更稳定,而且它也是第
一个32位的版本。另外,ODBC开始支持Windows以外的其它平台。直到现在,它已流行在PC和工作站
平台上,ODBC的驱动程序几乎可以从所有的数据库提供商那里获得。

但是,ODBC并非如我们最初想象的如此万能。许多数据库提供商都以一种“替换接口”来支持ODBC,
而且用ODBC编程的成本也是不低的。它酷似其它的Windows编程,包含有句柄、指针和选项,这就使
它很难掌握。ODBC不是一种独立控制的标准,它从Microsoft产生并由Microsoft开发,这个实事使其
未来很难预测。

什么是JDBC?

JDBC是曾经是一组首字母缩写(Java DataBase Connectivity),但现在它已是自己的注册商标符号
。作为一种面向对象的封装和对ODBC API的重新设计,它易于掌握而且确实允许你编写独立于提供
商的代码来查询和处理数据库。如同所有的Java API,JDBC是面向对象的,它不是一组很高级别的
对象,我们将在这章的剩下部分开发一些级别高一些的方法。

Microsoft以外的大多数数据库提供商都拥护JDBC并对他们的数据库提供JDBC驱动程序。这使得编写
完全独立于数据库的代码相当容易。另外,JavaSoft和Intersolv共同开发了一个名为JDBC-ODBC
Bridge的产品,它可以在没有直接的JDBC驱动程序的情况下与数据库相连。所有支持JDBC的数据库
都至少应支持SQL-92标准,只有这样才能在不同的数据库和平台间实现最大程度的可移植性。

安装与使用JDBC

JDBC的类在java.sql包中,并随同Java JDK 1.1或更高的版本一起安装。但是,如果你想使用
JDBC-ODBC bridge,你必须另外两个包。首先,若使用的是Windows 95,则你必须将你的ODBC驱动程
序升级为32位的版本,这个版本可以从Microsoft的主页上下载。在其它站点,这个驱动程序很难找
到。你可以搜寻DataAcc.exe文件,下载并安装它。

JDBC-ODBC驱动程序可从Sun Java站点(http://java.sun.com)处获得,寻找和下载该文件都很
简单。解压缩并安装这个驱动程序后,你还要做以下的事情:

:

将jdbc-odbcclasses;添加到PATH环境变量中。
将jdbc-odbcclasses;添加到CLASSPATH环境变量中。
在Windows 95下,将其加到autoexec.bat文件中,重启机器使之生效。
在Windows NT下,将其添加到控制面板的系统对象的环境标签下,重新登录使之生效
JDBC驱动程序的类型

实际上,有一个Java程序有四种方法与一数据库相连
JDBC-ODBC bridge和一个ODBC驱动程序------在这种情况下,ODBC驱动程序和桥代码必须在每
个用户的机器上,所有这是个本地的解决方案,同时也是一种临时的解决方案。
本地代码加Java驱动程序------用另外一种本地解决方案代替了ODBC和桥:能被Java调用的平
台的本地代码。
JDBC-网络纯Java驱动程序------Java驱动程序将JDBC调用翻译成传输到服务器的一种独立的
协议。服务器可以与许多中数据库中的任何一种相连接。这种方法允许你通过一个用户端的
applet访问服务器并将结果返回给你的applet。在这种情况下,中间件软件提供商可提供服务
器。
本地协议Java驱动程序------Java驱动程序直接为服务器翻译为某种协议并执行这些调用。这
种方法也可以用于网络并在网络浏览器的applet中显示结果,但每个数据库提供商将提供驱动
程序
I如果你想编写代码来处理dBase、Foxbase或Access一类的PC客户端数据库,你或许会用到第一中方法
,且在用户的机器上要有所有代码。象IBM的DB2这样的大型客户/服务器数据库产品已开始提供第三
级别的驱动程序。

二层和三层模型

若数据库和查询它的应用程序在同一台机器上且没有提交的服务器代码,我们称作为结果的程序为二
层模型。应用程序是其中一层而数据库是另一层。JDBC-ODBC bridge系统就是这种类型。

若一个应用程序或applet调用服务器,再由服务器调用数据库,我们称这种方式为三层模型。当有程
序调用服务器时便是这种类型。

编写访问数据库的JDBC代码

现在,我们准备研究一下如何编写访问数据库的Java程序。我们将要用到的数据库是名为
groceries.mdb的Microsoft Access数据库。数据库中包括的数据是三个本地蔬菜店的一些普通货物
的价格。食品表如下所示:


FoodKey
FoodName

1 Apples
2 Oranges
3 Hamburger
4 Butter
5 Milk
6 Cola
7 Green beans

存储表如下:

StoreKey
StoreName

1 Stop and Shop
2 Village Market
3 Waldbaum´s

蔬菜店价格表只包括以上表的键和价格:

FSKey
StoreKey
FoodKey
Price

1 1 1 $0.27
2 2 1 $0.29
3 3 1 $0.33
4 1 2> $0.36
5 2 2 $0.29
6 3 2 $0.47
7 1 3 $1.98
8 2 3 $2.45
9 3 3 $2.29
10 1 4 $2.39
11 2 4 $2.99
12 3 4 $3.29
13 1 5 $1.98
14 2 5 $1.79
15 3 5 $1.89
16 1 6 $2.65
17 2 6 $3.79
18 3 6 $2.99
19 1 7 $2.29
20 2 7 $2.19
21 3 7 $1.99

在ODBC上注册你的数据库

在Windows 95或NT下访问一个ODBC数据库之前,你必须在控制面板的ODBC驱动程序中注册这些数据
库。在Windows95下,使用控制面板中的ODBC图标;在Windows NT下,你会在开始菜单下找到它。(
如果没找到,你应按照在这之前所讲到的安装ODBC驱动程序WX1350.exe。)

双击ODBC图标并在图一所示的情况下点击Add按钮,然后选择一个数据库驱动程序(在这里使用
Microsoft Access)并点击OK。输入数据源名称(Grocery prices)和这个数据库的介绍(in local
stores)(这两个都与文件名无关),然后再选择数据库。当找到数据库,你的屏幕将如图二所示。按
OK键并关闭面板。



Figure 1: The ODBC control panel setup screen.



Figure 2: Selecting a database and description in the ODBC control panel.



与一个数据库相连

所有的数据库对象和方法都在java.sql包中,你必须import java.sql.*到任何使用JDBC的程序中。要想
连接一ODBC数据库,你必须首先将JDBC-ODBC bridge驱动程序调入。

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

这个命令调入驱动程序并创建该类的一个实例。然后,要想连接一个指定的数据库,你必须创建
Connection类的一个实例,再用URL语法指向数据库。

String url = "jdbc:odbc:Grocery prices";
Connection con = DriverManager.getConnection(url);

注意你在此用到的数据库名称是你在ODBC设置控制面板中输入的数据资源名。

URL语法对于不同类型的数据库会很不一样。

jdbc:subprotocol:subname

前面的几个字母代表连接协议并总是jdbc。或许还可能有子协议,这里的子协议被指定为odbc。它定义了对数
据库类的连接机制。若你正连接一数据库其它机器上的服务器,你还需指定机器和子目录。

jdbc:bark//doggie/elliott

最后,你应指定一用户名和密码作为连接字符串的一部分。

jdbc:bark//doggie/elliot;UID=GoodDog;PWD=woof

访问数据库

一旦与数据库相连,你可以按表的名称、列的名称和内容索取信息,也可以运行SQL命令查询数据库
、添加或修改数据库内容。可用来从数据库获取信息的对象有:

DatabaseMetaData 关于数据库的总体信息:表名、表索引、数据库产品名称
和版本、数据库支持的操作。
ResultSet 表或一次查询结果的信息。对数据的访问是逐行的,但对
列的访问可采取任何顺序。
ResultSetMetaData 一个ResultSet中列名和类型的信息。

每个对象都有大量的方法,使你能够获得数据库中元素的细节信息。另外还可以通过一些主要的方法
,来得到数据的最重要的信息。但如果你想了解更多的信息,我建议你去研究一下其它方法的介绍文
档。

The ResultSet

ResultSet是JDBC中最重要的单独对象。它是具有一般宽度和未知长度的表的一种抽象。几乎所有的
方法和查询所返回的数据都是ResultSet。一个ResultSet对象包含任意个命名的列。它还包含一个或
多个行,你可以从顶到底按次序在这些行间移动。在使用ResultSet对象之前,你应确认其中有多少
列,该信息保存在ResultSetMetaData对象中。

//get the number of columns from the metadata
ResultSetMetaData rsmd;
rsmd = results.getMetaData();
numCols = rsmd.getColumnCount();

当获得一ResultSet对象时,它指向第一行之前。你可用next()方法得到其它行,但当到结尾是,该
方法将返回false。既然从数据库中获取数据会导致错误的产生,你应把对结果的处理置于一个try
块中。

try
{
rsmd = results.getMetaData();
numCols = rsmd.getColumnCount();
boolean more = results.next();
while (more)
{
for (i = 1; i <= numCols; i++)
System.out.print(results.getString(i)+" ");
System.out.println();
more = results.next();
}
results.close();
}
catch(Exception e)
{System.out.println(e.getMessage());}

你可以用多种方式得到ResultSet中的数据,这要根据每列保存的数据类型而定。而且,你可按列号
或列名得到一列的内容。值得注意的是,列号起始于1,而不是0。ResultSet对象的其它更普通的方
法还有:

getInt(int);
以integer方式返回列号为int的列的内容。
getInt(String);
以integer方式返回列名为String的列的内容
getFloat(int);
以float方式返回列号为int的列的内容。
getFloat(String);
以float方式返回列名为String的列的内容。
getDate(int);
以date方式返回列号为int的列的内容。
getDate(String);
以date方式返回列名为String的列的内容。
next();
将行指针指向下一行。没有其它行时返回false。
close();
关闭result set。
getMetaData();
返回ResultSetMetaData对象。

ResultSetMetaData
ResultSetMetaData对象可从ResultSet中利用getMetaData()方法获得。通过该对象,你可以直到列
数和列的类型以及每列的名称。

getColumnCount();
返回ResultSet中列的数量。
getColumnName(int);
返回列号为int的列的名称。
getColumnLabel(int);
返回指定列的label。
isCurrency(int);
若该列包含货币单元的数值,则返回true。
isReadOnly(int);
若该列只读,则返回true。
isAutoIncrement(int);
若该列自动积增,则返回true。这种列多为键且总是
只读的。
getColumnType(int);
返回该列的SQL数据类型。这些数据类型包括:
BIGINT
BINARY
BIT
CHAR
DATE
DECIMAL
DOUBLE
FLOAT
INTEGERONGVARBINARY
LONGVARCHAR
NULL
NUMERIC
OTHER
REAL
SMALLINT
TIME
TIMESTAMP
TINYINT VARBINARY VARCHAR


DatabaseMetaData
通过DatabaseMetaData对象,可获得整个数据库的信息。它主要被用来数据库中各表的名称和表中
各列的名称。由于不同的数据库支持不同的SQL变量,所以它包括大量的用于查询该数据库支持什
么SQL方法的方法。 .

getCatalogs()
返回数据库中的信息目录的列表。利用JDBC-ODBC
Bridge驱动程序,你得到一列已注册到ODBC的数据库。
getTables(catalog, schema, tableNames, columnNames) 返回所有满足tableNames和columnNames的表的表名称
描述。
getColumns(catalog, schema, tableNames, columnNames) 返回所有满足tableNmaes和columnNames的列的列名称描述。
getURL();
返回正在连接的URL的名称。
getDriverName();
返回正在连接的数据库驱动程序的名称。
 
Copyright © 2002-2012 JSPCN.net. All rights reserved.
JSP中文网    备案号:粤ICP备09171188号
成都恒海科技发展有限公司    成都市一环路南二段6号新瑞楼三楼8号