编写访问数据库的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();
返回正在连接的数据库驱动程序的名称。
(全文完)
文章来源于领测软件测试网 https://www.ltesting.net/