Java数据库连接(JDBC)入门指南
立即解锁
发布时间: 2025-08-17 02:29:09 阅读量: 4 订阅数: 12 


Java网络编程与文件处理入门
### Java数据库连接(JDBC)入门指南
#### 1. 引言
在当今数字化的时代,大多数组织将大量数据结构化存储在数据库中,这些数据库通常需要从多个站点进行访问。Java程序可以通过Java数据库连接(JDBC)API与关系型数据库(无论是本地还是远程)进行通信。本文将详细介绍如何使用JDBC访问远程数据库。
#### 2. 数据库供应商差异问题
当尝试提供一种适用于所有关系型数据库的通用访问方法时,会遇到一个基本问题,即不同供应商的数据库内部格式(以及相关的数据库API)存在差异。例如,Oracle数据库的内部格式与Access数据库不同,而MySQL数据库的格式又与这两者不同。
为了使用JDBC访问特定类型的关系型数据库,需要提供一些中介软件,使JDBC能够与该数据库的特定供应商API进行通信,这种软件称为驱动程序。合适的驱动程序通常由数据库供应商或第三方提供。有关特定数据库的JDBC驱动程序信息,请访问http://servlet.java.sun.com/products/jdbc/drivers 。
在Java出现之前,微软引入了开放数据库连接(ODBC)来解决访问不同内部格式数据库的问题。最初,ODBC驱动程序仅适用于微软数据库,但后来其他供应商和第三方为大多数主要的非微软数据库推出了ODBC驱动程序。Sun在sun.jdbc.odbc包中提供了JDBC - ODBC桥接驱动程序,它包含在J2SE中(从JDK 1.1开始就存在)。该驱动程序将JDBC协议转换为相应的ODBC协议,允许Java程序员访问有ODBC驱动程序的数据库。然而,在一些大型、数据库密集型应用程序中,增加额外的转换阶段可能会导致不可接受的长时间延迟。
#### 3. SQL和JDBC版本
访问关系型数据库的标准方法是使用SQL(结构化查询语言),这反映在核心JDBC API所在的包名为java.sql 。
- **JDBC 1.0**:随JDK 1.1发布,许多现有驱动程序仍然基于此版本编写,但目前占少数。
- **JDBC 2.0**:随JDK 1.2(J2SE 1.2)发布,引入了一些新功能,如在结果集中前后滚动以及使用Java方法更新数据库表(而不是SQL命令)。
- **JDBC 2.1**:随J2SE 1.2.2出现,并延续到J2SE 1.3。除了提供一些额外功能外,还为希望进行服务器端数据库操作(如企业JavaBean中常见的操作)的Java程序员提供了一个可选下载包,该包在Sun网站的不同部分有不同的名称,如JDBC 2.0 Optional Package API、JDBC 2.0 Extension Package API、JDBC 2.0 Standard Extension API,包含在javax.sql包中。
- **JDBC 3.0**:于2002年2月13日发布,不仅可以从关系型数据库访问数据,还可以从电子表格和平面文件等几乎任何数据源访问数据。它由java.sql和javax.sql两个包组成,包含在J2SE 1.4中。JDBC 3.0引入的两个最重要的功能是连接池和保存点。连接池允许应用服务器维护一组打开的连接,供连接的客户端使用,节省创建新连接的时间;保存点接口允许程序员将事务划分为逻辑断点,控制事务回滚的范围。
- **JDBC 4**:在撰写本文时正在开发中,预计将包含在J2SE 6中。
目前最常用的JDBC版本是JDBC 2,但仍然有很多JDBC 1驱动程序,同时JDBC 3驱动程序的数量也在增加。
#### 4. 创建ODBC数据源
在通过Java程序访问由ODBC驱动的数据库之前,需要将数据库注册为ODBC数据源。以下是在Windows XP机器上设置ODBC数据源的步骤(其他微软操作系统的某些项目名称可能略有不同,但基本步骤大致相同):
1. 使用鼠标从启动菜单中选择“开始” -> “控制面板”。
2. 双击“管理工具”。
3. 双击“数据源(ODBC)”以显示“ODBC数据源管理器”窗口。
4. 确保选择“用户DSN”选项卡。
5. 点击“添加...”按钮以显示“创建新数据源”窗口。
6. 选择“Microsoft Access Driver (*.mdb)”并点击“完成”。
7. 点击“选择...”按钮,在目录结构中定位所需的数据库。
8. 浏览目录结构并选择所需的数据库。
9. 为数据源提供一个有意义的名称(“描述”字段可选)。
10. 如果要指定用户名和密码(不是必需的,本节示例不需要),选择“高级选项”,然后输入值,完成后点击“确定”。
11. 点击“确定”完成注册。
请注意,上述过程仅适用于ODBC数据库。
以下是一个mermaid格式的流程图,展示创建ODBC数据源的流程:
```mermaid
graph LR
A[开始] --> B[选择开始 -> 控制面板]
B --> C[双击管理工具]
C --> D[双击数据源(ODBC)]
D --> E[选择用户DSN选项卡]
E --> F[点击添加按钮]
F --> G[选择Microsoft Access Driver (*.mdb)并完成]
G --> H[点击选择按钮定位数据库]
H --> I[浏览并选择数据库]
I --> J[提供数据源名称]
J --> K{是否指定用户名和密码}
K -- 是 --> L[选择高级选项并输入值]
K -- 否 --> M[点击确定完成注册]
L --> M
```
#### 5. 简单数据库访问
使用JDBC访问数据库需要以下几个步骤:
1. 加载数据库驱动程序。
2. 建立与数据库的连接。
3. 使用连接创建一个Statement对象并存储其引用。
4. 使用上述Statement引用运行特定的查询或更新语句并接受结果。
5. 处理和显示结果(如果是查询)或检查/显示受更新影响的数据库行数。
6. 根据需要重复步骤4和5以进行更多查询/更新。
7. 关闭连接。
假设存在一个名为Finances.mdb的MS Access数据库,其中包含一个名为Accounts的表,该表的结构如下:
| 字段名称 | MS Access类型 | Java类型 |
| ---- | ---- | ---- |
| acctNum | 数字 | int |
| surname | 文本 | String |
| firstNames | 文本 | String |
| balance | 货币 | float |
假设该数据库的数据源名称为Finances,下面详细介绍每个步骤:
##### 5.1 加载数据库驱动程序
通过Class类的静态方法forName实现:
```java
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
```
##### 5.2 建立与数据库的连接
声明一个Connection引用,并调用DriverManager类的静态方法getConnection返回一个Connection对象。getConnection方法接受三个String参数:数据库的URL样式地址、用户名和密码。
JDBC API规范建议数据库地址具有以下格式:
```
jdbc:<子协议>:<数据源>
```
对于本地ODBC数据库,数据源名称为Finances,子协议为odbc,地址的最后一部分就是数据源的名称:
```
jdbc:odbc:Finances
```
假设Finances数据库是本地的,且没有设置用户名和密码,打开与数据库连接的代码如下:
```java
Connection link = DriverManager.getConnection("jdbc:odbc:Finances", "", "");
```
如果该数据库是远程的,代码可能如下:
```java
Connection link = DriverManager.getConnection("jdbc:odbc://AnyServer.SomethingElse.com/Finances", "", "");
```
需要注意的是,API指定的语法只是建议,数据库供应商可以根据需要忽略。因此,一些驱动程序可能使用与上述不同的子协议和数据源语法。DriverManager会依次查询每个加载的驱动程序,以确定该驱动程序是否识别正在访问的数据库类型。
##### 5.3 创建Statement对象并存储其引用
通过调用Connection对象的createStatement方法创建一个Statement对象,并将其引用存储在一个Statement变量中:
```java
Statement statement = link.createStatement();
```
##### 5.4 运行查询/更新并接受结果
SQL中的数据操作语言(DML)语句可分为两类:从数据库中检索数据的语句(即SELECT语句)和以某种方式更改数据库内容的语句(即INSERT、DELETE和UPDATE语句)。Statement类有executeQuery和executeUpdate方法,分别用于执行这两类语句。前者返回一个ResultSet对象,后者返回一个整数,表示受更新操作影响的数据库行数。
以下是一些查询示例:
```java
// (i) 查询所有记录
String selectAll = "SELECT * FROM Accounts";
ResultSet results = statement.executeQuery(selectAll);
// (ii) 查询指定字段
String selectFields = "SELECT acctNum, balance FROM Accounts";
ResultSet results = statement.executeQuery(selectFields);
// (iii) 查询指定范围的记录
String selectRange = "SELECT * FROM Acco
```
0
0
复制全文
相关推荐










