Java数据库连接(JDBC)全解析
立即解锁
发布时间: 2025-08-20 00:52:12 订阅数: 12 

### Java数据库连接(JDBC)全解析
#### 1. 修改数据库内容
在SQL中,数据操作语言(DML)语句可分为两类:从数据库中检索数据的语句(SELECT语句)和以某种方式更改数据库内容的语句(INSERT、DELETE和UPDATE语句)。到目前为止,我们仅处理了前者,即通过`executeQuery`方法提交SQL语句。现在,我们将关注后者,这需要通过`executeUpdate`方法提交SQL语句。
以下是一些示例:
```java
// 插入数据
String insert = "INSERT INTO Accounts"
+ " VALUES (123456,'Smith',"
+ "'John James',752.85)";
int result = statement.executeUpdate(insert);
// 更新数据
String change = "UPDATE Accounts"
+ " SET surname = 'Bloggs',"
+ "fi rstNames = 'Fred Joseph'"
+ " WHERE acctNum = 123456";
statement.executeUpdate(change);
// 删除数据
String remove = "DELETE FROM Accounts"
+ " WHERE balance < 100";
result = statement.executeUpdate(remove);
```
在第二个示例中,`executeUpdate`返回的值未被保存,而是由运行时系统直接丢弃。实际上,返回的整数通常用于检查更新是否已执行。
下面是一个完整的示例,展示了如何在显示数据库初始内容后,执行上述SQL语句并显示修改后的数据库:
```java
import java.sql.*;
public class JDBCChange
{
private static Statement statement;
private static ResultSet results;
public static void main(String[] args)
{
Connection connection = null;
try
{
// 步骤1:建立连接
connection = DriverManager.getConnection(
"jdbc:odbc:Finances","","");
}
catch(ClassNotFoundException cnfEx)
{
System.out.println(
"* Unable to load driver! *");
System.exit(1);
}
catch(SQLException sqlEx)
{
System.out.println(
"* Cannot connect to database! *");
System.exit(1);
}
try
{
// 步骤2:创建Statement对象
statement = connection.createStatement();
System.out.println(
"\nInitial contents of table:");
// 步骤3和4:显示初始内容
displayTable();
// 步骤5:执行插入、更新和删除操作
String insert = "INSERT INTO Accounts"
+ " VALUES (123456,'Smith',"
+ "'John James',752.85)";
int result = statement.executeUpdate(insert);
if (result == 0)
System.out.println(
"\nUnable to insert record!");
String change = "UPDATE Accounts"
+ " SET surname = 'Bloggs',"
+ "fi rstNames='Fred Joseph'"
+ " WHERE acctNum = 123456";
result = statement.executeUpdate(change);
if (result == 0)
System.out.println(
"\nUnable to update record!");
String remove = "DELETE FROM Accounts"
+ " WHERE balance < 100";
result = statement.executeUpdate(remove);
if (result == 0)
System.out.println(
"\nUnable to delete record!");
System.out.println(
"\nNew contents of table:");
displayTable();
// 步骤6:关闭连接
connection.close();
}
catch(SQLException sqlEx)
{
System.out.println(
"* SQL or connection error! *");
sqlEx.printStackTrace();
System.exit(1);
}
}
public static void displayTable() throws SQLException
{
String select = "SELECT * FROM Accounts";
results = statement.executeQuery(select);
System.out.println();
while (results.next())
{
System.out.println("Account no. "
+ results.getInt(1));
System.out.println("Account holder: "
+ results.getString(3)
+ " " + results.getString(2));
System.out.printf("Balance: %.2f %n%n",
results.getFloat(4));
}
}
}
```
#### 2. Java DB/Apache Derby
从Java SE 6开始,Java包含了自己的内置数据库,它起源于一家名为Cloudscape的小公司,该公司随后被Informix Software收购,而后者又被IBM收购。2004年,IBM将代码捐赠给了Apache软件基金会,该基金会以`Derby`的名称开发了该产品。当Sun发布Java SE 6时,它以`Java DB`的重新命名包含了该数据库产品,不过Apache基金会继续以`Apache Derby`(或简称为`Derby`)的名称将其作为开源软件提供,这也是Java SE环境中常用的名称。这个组件仅占用2MB的磁盘空间,允许Java程序员在他们的Java程序中嵌入一个关系数据库系统。
该产品还包含一个名为`ij`的SQL脚本工具。可以使用`Derby`嵌入式JDBC驱动程序或客户端JDBC驱动程序(如`Derby Network Client`)来使用它。我们将使用嵌入式驱动程序。
以下是创建、填充和操作Derby数据库所需的步骤:
1. **启动ij**:在命令窗口中输入以下命令:
```
java org.apache.derby.tools.ij
```
该命令返回的输出应类似于以下内容:
```
ij version 10.9
ij> [Prompt]
```
此提示将一直保持,直到用户在步骤7中退出。
2. **创建数据库**:使用带有`create`属性为`true`的`connect`命令指定数据库的URL,URL格式如下:
```
jdbc:derby:<DbPath&Name>
```
示例:
```
connect 'jdbc:derby:Finances;create=true';
connect 'jdbc:derby:C:\\Databases\\Finances;create=true';
```
3. **创建表**:
```
create table Accounts(acctNum int primary key , surname varchar(15), fi rstNames varchar(25), balance real);
```
注意设置主键!
4. **插入行**:
```
insert into Accounts values(123456, 'Black', 'James Michael', 123.45);
```
5. **选择、更新和删除行**:
```
select * from Accounts;
update Accounts set balance=999.99 where acctNum=123456;
delete from Accounts where acctNum = 234567;
```
6. **断开连接和重新连接**:
```
disconnect;
connect 'jdbc:derby:<DbPath&Name>';
```
可以使用相对寻址。
7. **退出**:
```
exit;
```
8. **使用脚本**:除非只处理一两个SQL语句,否则应始终使用`ij`脚本。首先将所有必需的SQL语句放入一个具有适当名称的文本文件中(例如`AccountsScript.sql`)。然后可以通过以下三种方式之一运行该文件:
- 使用`ij`命令,将输入文件作为命令行参数提供:
```
java org.apache.derby.tools.ij AccountsScript.sql
```
- 将标准输入重定向到脚本文件:
```
java org.apache.derby.tools.ij < AccountsScript.sql
```
- 从`ij`提示中使用`run`命令:
```
run 'AccountsScript.sql';
```
#### 3. 事务处理
工业强度的数据库(非MS Access)通常会包含事务处理。事务是一个或多个SQL语句,可以组合在一起作为一个单一的处理实体。此功能适用于需要同时执行一组相关语句的情况。如果只执行了部分语句,数据库可能会处于不一致的状态。例如,在线订购系统在客户下订单时可能会更新`Orders`表,同时也需要更新`Stock`表(以反映为客户预留了库存,其他客户无法订购)。在这种情况下,我们希望两个语句都执行或都不执行。不幸的是,网络问题可能导致其中一个语句在另一个语句执行后失败。如果发生这种情况,我们希望撤销已执行的语句。
用于实现事务处理的SQL语句是`COMMIT`和`ROLLBACK`,在Java中,`Connection`接口的`commit`和`rollback`方法与之对应。顾名思义,`commit`用于在事务结束时提交/确定数据库更改,而`rollback`用于(在错误情况下)将数据库恢复到当前事务之前的状态(通过撤销可能已执行的任何语句)。然而,默认情况下,JDBC会自动提交应用于数据库的每个单独SQL语句。为了更改此默认行为以进行事务处理,我们必须首先使用参数`false`执行`Connection`的`setAutoCommit`方法(以关闭自动提交)。然后可以使用`commit`和`rollback`方法进行事务处理。
示例:
```java
connection.setAutoCommit(false);
try
{
// 假设存在3个SQL更新字符串
// 分别为update1、update2和update3
statement.executeUpdate(update1);
statement.executeUpdate(update2);
statement.executeUpdate(update3);
connection.commit();
}
catch(SQLException sqlEx)
{
connection.rollback();
System.out.println(
"* SQL error! Changes aborted… *");
}
```
#### 4. 元数据
元数据是“关于数据的数据”。通过JDBC API可以获得两类元数据:
- 关于查询返回的行和列的数据(即关于`ResultSet`对象的数据);
- 关于整个数据库的数据。
第一类元数据由`ResultSetMetaData`接口提供,`ResultSet`的`getMetaData`方法返回该接口的对象。从`ResultSetMetaData`对象可获得的信息包括:
- `ResultSet`对象中的字段/列数;
- 指定字段的名称;
- 字段的数据类型;
- 字段的最大宽度;
- 字段所属的表。
关于整个数据库的数据由`DatabaseMetaData`接口提供,`Connection`的`getMetaData`方法返回该接口的对象。然而,大多数Java开发人员很少需要`DatabaseMetaData`,因此不再进一步提及。
在继续之前,值得指出的是,完整的SQL类型系列在`java.sql.Types`类中表示为28个命名的静态整数(`int`)常量。最可能有用的8个常量如下:
- `DATE`
- `DECIMAL`
- `DOUBLE`
- `FLOAT`
- `INTEGER`
- `NUMERIC`
- `REAL`
- `VARCHAR`
`INTEGE
0
0
复制全文
相关推荐










