Java数据库访问:DBM与JDBC全面解析
立即解锁
发布时间: 2025-08-18 02:37:47 阅读量: 3 订阅数: 12 

Java核心技术与实战指南
# Java数据库访问:DBM与JDBC全面解析
## 1. DBM数据库概述
在Unix系统中,常常会配备DBM或DB*格式的数据文件,这些文件通常被称作数据库。不过,它们并非关系型数据库,而是以键值对的形式存储数据,类似于`java.util.Hashtable`,当调用`put()`方法时,数据会自动持久化到磁盘。在Windows系统中,也有部分程序采用这种格式,例如Netscape的Win32版本就将浏览历史存储在`history.db`或`netscape.hst`文件中。
### 1.1 DBM格式特点
DBM格式是一种通用的键值映射方式,它是在DB库基础上对旧格式的模拟。其中,DBM是原始格式,DB则是更新、更通用的格式,如今DBM实际上是DB的前端,但因其相对简单,在示例中我们使用了DBM。GDBM是自由软件基金会(FSF)的实现版本。
### 1.2 Java中使用DBM
由于Java没有公开定义的DBM映射,我们可以使用自定义代码或SleepyCat的代码来实现Java与DBM的交互。这里使用了较多的本地代码,即从Java调用C代码,再由C代码调用DBM库。
#### 1.2.1 DBM类API
以下是DBM类的API:
```java
public DBM(String fileName) throws IOException;
public Object nextkey(Object) throws IOException;
public byte[] nextkey(byte[]) throws IOException;
public Object firstkeyObject( ) throws IOException;
public byte[] firstkey( ) throws IOException;
public void store(Object,Object) throws IOException;
public void store(byte[],byte[]) throws IOException;
public Object fetch(Object) throws IOException;
public byte[] fetch(byte[]) throws IOException;
public void close( );
```
#### 1.2.2 示例代码
以下是一个简单的程序,用于打印Netscape浏览历史中的网站:
```java
import java.io.IOException;
/** Demonstration of reading the MS-Windows Netscape History
* under UNIX using DBM.java.
*/
public class ReadHistNS {
public static void main(String[] unused) throws IOException {
DBM d = new DBM("netscape.hst");
byte[] ba;
for (ba = d.firstkey( ); ba != null; ba = d.nextkey(ba)) {
System.out.println("Key=\"" + new String(ba) + '"');
byte[] val = d.fetch(ba);
for (int i=0; i<16&&i<val.length; i++) {
System.out.print((short)val[i]);
System.out.print(' ');
}
}
}
}
```
#### 1.2.3 UserDBDBM类示例
下面是一个更复杂的示例,展示了如何在DBM文件中存储和检索用户数据:
```java
package jabadot;
import java.io.*;
import java.util.*;
import java.sql.SQLException;
/** A trivial "database" for User objects, stored in a flat file.
* <P>
* Since this is expected to be used heavily, and to avoid the overhead
* of re-reading the file, the "Singleton" Design Pattern is used
* to ensure that there is only ever one instance of this class.
*/
public class UserDBDBM extends UserDB {
protected final static String DEF_NAME =
"/home/ian/src/jabadot/userdb"; // It appends .pag
protected DBM db;
/** Default Constructor */
protected UserDBDBM( ) throws IOException,SQLException {
this(DEF_NAME);
}
/** Constructor */
protected UserDBDBM(String fn) throws IOException,SQLException {
super( );
db = new DBM(fn);
String k;
Object o;
// Iterate through contents of DBM, adding into list.
for (o=db.firstkeyObject( ); o!=null; o=db.nextkey(o)) {
// firstkey/nextkey give Key as Object, cast to String.
k = (String)o;
o = db.fetch(k); // Get corresponding Value (a User)
users.add((User)o); // Add to list.
}
}
/** Add one user to the list, both in-memory and on disk. */
public synchronized void addUser(User nu) throws IOException, SQLException {
// Add it to the in-memory list
super.addUser(nu);
// Add it to the on-disk version: store in DB with
// key = nickname, value = object.
db.store(nu.getName( ), nu);
}
}
```
## 2. JDBC概述
虽然DBM等数据库有其适用场景,但现代数据库的主流是关系型数据库,而Java中对关系型数据库的操作主要通过JDBC(Java Database Connectivity)实现。
### 2.1 SQL基础
SQL是用于控制关系型数据库的通用语言,常见的操作包括查询(如`SELECT * from userdb`)、插入(`INSERT`)、删除(`DELETE`)、创建(`CREATE`)和删除表(`DROP`)等。
### 2.2 JDBC级别
JDBC分为两个级别:JDBC 1和JDBC 2。其中,JDBC 1包含在所有JDBC实现和驱动中,而JDBC 2是可选的,需要使用相应的JDBC 2驱动。本文主要关注JDBC 1的常见特性。
## 3. JDBC设置与连接
### 3.1 加载驱动
使用JDBC 1的第一步是加载数据库驱动。可以通过`java.lang.Class`类的`forName()`方法来实现,该方法会加载指定的类,并返回一个描述该类的`Class`对象。同时,该方法还会将驱动注册到`DriverManager`中。
#### 3.1.1 示例代码
以下是一个尝试加载两个驱动的示例:
```java
import java.awt.*;
import java.sql.*;
/** Load some drivers. */
public class LoadDriver {
public static void main(String[] av) {
try {
```
0
0
复制全文


