# 使用数组对象

> 原文： [https://docs.oracle.com/javase/tutorial/jdbc/basics/array.html](https://docs.oracle.com/javase/tutorial/jdbc/basics/array.html)

**注**：MySQL 和 Java DB 目前不支持`ARRAY` SQL 数据类型。因此，没有 JDBC 教程示例可用于演示`Array` JDBC 数据类型。

涵盖以下主题：

*   [创建数组对象](#creating_array)
*   [在 ResultSet 中检索和访问数组值](#retrieving_array)
*   [存储和更新数组对象](#storing_array)
*   [释放阵列资源](#releasing_array)

使用方法`Connection.createArrayOf`创建`Array`对象。

例如，假设您的数据库包含一个名为`REGIONS`的表，该表已使用以下 SQL 语句创建并填充;请注意，这些语句的语法因数据库而异：

```
create table REGIONS
    (REGION_NAME varchar(32) NOT NULL,
    ZIPS varchar32 ARRAY[10] NOT NULL,
    PRIMARY KEY (REGION_NAME));

insert into REGIONS values(
    'Northwest',
    '{"93101", "97201", "99210"}');
insert into REGIONS values(
    'Southwest',
    '{"94105", "90049", "92027"}');

```

```
Connection con = DriverManager.getConnection(url, props);
String [] northEastRegion = { "10022", "02110", "07399" };
Array aArray = con.createArrayOf("VARCHAR", northEastRegionnewYork);

```

Oracle 数据库 JDBC 驱动程序使用`oracle.sql.ARRAY`类实现`java.sql.Array`接口。

与 JDBC 4.0 大对象接口（`Blob`，`Clob`，`NClob`）一样，您可以操作`Array`对象，而无需将所有数据从数据库服务器带到客户端计算机。 `Array`对象实现它表示为结果集或 Java 数组的 SQL `ARRAY`。

以下摘录检索`ZIPS`列中的 SQL `ARRAY`值，并将其分配给`java.sql.Array`对象`z`对象。摘录检索`z`的内容并将其存储在`zips`中，这是一个包含`String`类型对象的 Java 数组。摘录遍历`zips`数组并检查每个邮政（zip）代码是否有效。如果给定的邮政编码与有效邮政编码的主列表中的一个邮政编码匹配，则此代码假定先前已使用方法`isValid`返回`true`类来定义类`ZipCode`：

```
ResultSet rs = stmt.executeQuery(
    "SELECT region_name, zips FROM REGIONS");

while (rs.next()) {
    Array z = rs.getArray("ZIPS");
    String[] zips = (String[])z.getArray();
    for (int i = 0; i < zips.length; i++) {
        if (!ZipCode.isValid(zips[i])) {
            // ...
            // Code to display warning
        }
    }
}

```

在以下语句中，`ResultSet`方法`getArray`返回存储在当前行的`ZIPS`列中的值作为`java.sql.Array`对象`z`：

```
Array z = rs.getArray("ZIPS");

```

变量 `_z_`包含一个定位符，它是服务器上 SQL `ARRAY`的逻辑指针;它不包含`ARRAY`本身的元素。作为逻辑指针， `_z_`可用于操纵服务器上的数组。

在以下行中，`getArray`是`Array.getArray`方法，而不是前一行中使用的`ResultSet.getArray`方法。因为`Array.getArray`方法在 Java 编程语言中返回`Object`，并且因为每个邮政编码都是`String`对象，所以在分配给变量`zips`之前，结果将被转换为`String`对象的数组。

```
String[] zips = (String[])z.getArray();

```

`Array.getArray`方法将客户端上的 SQL `ARRAY`元素实现为`String`对象的数组。因为，实际上，变量 `_ 拉链 _` 包含数组的元素，可以在`for`循环中迭代`zips`，寻找不是的邮政编码有效。

使用方法`PreparedStatement.setArray`和`PreparedStatement.setObject`将`Array`值作为输入参数传递给`PreparedStatement`对象。

以下示例将`Array`对象`northEastRegion`（在前面的示例中创建）设置为 PreparedStatement `pstmt`的第二个参数：

```
PreparedStatement pstmt = con.prepareStatement(
    "insert into REGIONS (region_name, zips) " + "VALUES (?, ?)");
pstmt.setString(1, "NorthEast");
pstmt.setArray(2, northEastRegion);
pstmt.executeUpdate();

```

同样，使用`PreparedStatement.updateArray`和`PreparedStatement.updateObject`方法更新表中具有`Array`值的列。

`Array`对象至少在创建它们的事务期间保持有效。这可能导致应用程序在长时间运行的事务期间耗尽资源。应用程序可以通过调用`free`方法释放`Array`资源。

在下面的摘录中，调用方法`Array.free`以释放为先前创建的`Array`对象保留的资源。

```
Array aArray = con.createArrayOf("VARCHAR", northEastRegionnewYork);
// ...
aArray.free();

```