使用数组对象

注意 :MySQL 和 Java DB 当前不支持ARRAY SQL 数据类型。因此,没有 JDBC 教程示例可用来演示Array JDBC 数据类型。

涵盖以下主题:

创建数组对象

使用方法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.Arrayinterface。

检索和访问 ResultSet 中的数组值

与 JDBC 4.0 大对象interface(BlobClobNClob)一样,您可以操作Array对象,而不必将其所有数据从数据库服务器带到 Client 端计算机。 Array对象具体化了表示为结果集或 Java 数组的 SQL ARRAY

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

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可用于操纵服务器上的阵列。

在下一行中,getArrayArray.getArray方法,而不是上一行中使用的ResultSet.getArray方法。由于Array.getArray方法以 Java 编程语言返回Object,并且每个邮政编码都是String对象,因此在将结果赋给变量zips之前,将结果强制转换为String对象的数组。

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

Array.getArray方法将 Client 端上的 SQL ARRAY元素具体化为String对象的数组。实际上,由于变量zips包含数组的元素,因此可以在for循环中循环访问zips,以查找无效的邮政编码。

存储和更新阵列对象

使用方法PreparedStatement.setArrayPreparedStatement.setObjectArray值作为 Importing 参数传递给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.updateArrayPreparedStatement.updateObjectArray值更新表中的列。

释放阵列资源

Array对象至少在创建它们的 Transaction 期间保持有效。在 Long 期运行的事务中,这可能导致应用程序资源不足。应用程序可以通过调用free方法来释放Array资源。

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

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